def write_header_and_cpp(definitions, interface_name, interfaces_info, output_directory):
    try:
        interface = definitions.interfaces[interface_name]
    except KeyError:
        raise Exception('%s not in IDL definitions' % interface_name)

    # Store other interfaces for introspection
    interfaces.update(definitions.interfaces)

    # Set up Jinja
    if interface.is_callback:
        header_template_filename = 'callback_interface.h'
        cpp_template_filename = 'callback_interface.cpp'
        generate_contents = v8_callback_interface.generate_callback_interface
    else:
        header_template_filename = 'interface.h'
        cpp_template_filename = 'interface.cpp'
        generate_contents = v8_interface.generate_interface
    jinja_env = jinja2.Environment(
        loader=jinja2.FileSystemLoader(templates_dir),
        keep_trailing_newline=True,  # newline-terminate generated files
        lstrip_blocks=True,  # so can indent control flow tags
        trim_blocks=True)
    jinja_env.filters.update({
        'blink_capitalize': capitalize,
        'conditional': conditional_if_endif,
        'runtime_enabled': runtime_enabled_if,
        })
    header_template = jinja_env.get_template(header_template_filename)
    cpp_template = jinja_env.get_template(cpp_template_filename)

    # Set type info, both local and global
    interface_info = interfaces_info[interface_name]

    v8_types.set_callback_functions(definitions.callback_functions.keys())
    v8_types.set_enums((enum.name, enum.values)
                       for enum in definitions.enumerations.values())
    v8_types.set_ancestors(dict(
        (interface_name, interface_info['ancestors'])
        for interface_name, interface_info in interfaces_info.iteritems()
        if 'ancestors' in interface_info))
    v8_types.set_callback_interfaces(set(
        interface_name
        for interface_name, interface_info in interfaces_info.iteritems()
        if interface_info['is_callback_interface']))
    v8_types.set_implemented_as_interfaces(dict(
        (interface_name, interface_info['implemented_as'])
        for interface_name, interface_info in interfaces_info.iteritems()
        if 'implemented_as' in interface_info))
    v8_types.set_will_be_garbage_collected_types(set(
        interface_name
        for interface_name, interface_info in interfaces_info.iteritems()
        if 'inherited_extended_attributes' in interface_info and
            'WillBeGarbageCollected' in interface_info['inherited_extended_attributes']))

    # Generate contents (input parameters for Jinja)
    template_contents = generate_contents(interface)
    template_contents['header_includes'].add(interface_info['include_path'])
    template_contents['header_includes'] = sorted(template_contents['header_includes'])
    includes.update(interface_info.get('dependencies_include_paths', []))
    template_contents['cpp_includes'] = sorted(includes)

    # Render Jinja templates and write files
    def write_file(basename, file_text):
        filename = os.path.join(output_directory, basename)
        with open(filename, 'w') as output_file:
            output_file.write(file_text)

    header_basename = v8_class_name(interface) + '.h'
    header_file_text = header_template.render(template_contents)
    write_file(header_basename, header_file_text)

    cpp_basename = v8_class_name(interface) + '.cpp'
    cpp_file_text = cpp_template.render(template_contents)
    write_file(cpp_basename, cpp_file_text)
Example #2
0
def write_header_and_cpp(definitions, interface_name, interfaces_info, output_dir):
    try:
        interface = definitions.interfaces[interface_name]
    except KeyError:
        raise Exception('%s not in IDL definitions' % interface_name)

    # Store other interfaces for introspection
    interfaces.update(definitions.interfaces)

    # Set up Jinja
    jinja_env = initialize_jinja_env(output_dir)
    if interface.is_callback:
        header_template_filename = 'callback_interface.h'
        cpp_template_filename = 'callback_interface.cpp'
        generate_contents = v8_callback_interface.generate_callback_interface
    else:
        header_template_filename = 'interface.h'
        cpp_template_filename = 'interface.cpp'
        generate_contents = v8_interface.generate_interface
    header_template = jinja_env.get_template(header_template_filename)
    cpp_template = jinja_env.get_template(cpp_template_filename)

    # Set type info, both local and global
    interface_info = interfaces_info[interface_name]

    v8_types.set_callback_functions(definitions.callback_functions.keys())
    v8_types.set_enums((enum.name, enum.values)
                       for enum in definitions.enumerations.values())
    v8_types.set_ancestors(dict(
        (interface_name, interface_info['ancestors'])
        for interface_name, interface_info in interfaces_info.iteritems()
        if 'ancestors' in interface_info))
    v8_types.set_callback_interfaces(set(
        interface_name
        for interface_name, interface_info in interfaces_info.iteritems()
        if interface_info['is_callback_interface']))
    v8_types.set_implemented_as_interfaces(dict(
        (interface_name, interface_info['implemented_as'])
        for interface_name, interface_info in interfaces_info.iteritems()
        if 'implemented_as' in interface_info))
    v8_types.set_will_be_garbage_collected_types(set(
        interface_name
        for interface_name, interface_info in interfaces_info.iteritems()
        if 'inherited_extended_attributes' in interface_info and
            'WillBeGarbageCollected' in interface_info['inherited_extended_attributes']))

    # Generate contents (input parameters for Jinja)
    template_contents = generate_contents(interface)
    template_contents['header_includes'].add(interface_info['include_path'])
    template_contents['header_includes'] = sorted(template_contents['header_includes'])
    includes.update(interface_info.get('dependencies_include_paths', []))
    template_contents['cpp_includes'] = sorted(includes)

    # Render Jinja templates and write files
    def write_file(basename, file_text):
        filename = os.path.join(output_dir, basename)
        with open(filename, 'w') as output_file:
            output_file.write(file_text)

    header_basename = v8_class_name(interface) + '.h'
    header_file_text = header_template.render(template_contents)
    write_file(header_basename, header_file_text)

    cpp_basename = v8_class_name(interface) + '.cpp'
    cpp_file_text = cpp_template.render(template_contents)
    write_file(cpp_basename, cpp_file_text)