def generate_interface_dependencies(): def idl_paths_recursive(directory): # This is slow, especially on Windows, due to os.walk making # excess stat() calls. Faster versions may appear in Python 3.5 or # later: # https://github.com/benhoyt/scandir # http://bugs.python.org/issue11406 idl_paths = [] for dirpath, _, files in os.walk(directory): idl_paths.extend(os.path.join(dirpath, filename) for filename in fnmatch.filter(files, '*.idl')) return idl_paths # We compute interfaces info for *all* IDL files, not just test IDL # files, as code generator output depends on inheritance (both ancestor # chain and inherited extended attributes), and some real interfaces # are special-cased, such as Node. # # For example, when testing the behavior of interfaces that inherit # from Node, we also need to know that these inherit from EventTarget, # since this is also special-cased and Node inherits from EventTarget, # but this inheritance information requires computing dependencies for # the real Node.idl file. # 2-stage computation: individual, then overall # # Properly should compute separately by component (currently test # includes are invalid), but that's brittle (would need to update this file # for each new component) and doesn't test the code generator any better # than using a single component. for idl_filename in idl_paths_recursive(source_path): compute_info_individual(idl_filename, 'tests') info_individuals = [info_individual()] compute_interfaces_info_overall(info_individuals)
def generate_interface_dependencies(): def idl_paths_recursive(directory): # This is slow, especially on Windows, due to os.walk making # excess stat() calls. Faster versions may appear in Python 3.5 or # later: # https://github.com/benhoyt/scandir # http://bugs.python.org/issue11406 idl_paths = [] for dirpath, _, files in os.walk(directory): idl_paths.extend( os.path.join(dirpath, filename) for filename in fnmatch.filter(files, '*.idl')) return idl_paths # We compute interfaces info for *all* IDL files, not just test IDL # files, as code generator output depends on inheritance (both ancestor # chain and inherited extended attributes), and some real interfaces # are special-cased, such as Node. # # For example, when testing the behavior of interfaces that inherit # from Node, we also need to know that these inherit from EventTarget, # since this is also special-cased and Node inherits from EventTarget, # but this inheritance information requires computing dependencies for # the real Node.idl file. # 2-stage computation: individual, then overall # # Properly should compute separately by component (currently test # includes are invalid), but that's brittle (would need to update this file # for each new component) and doesn't test the code generator any better # than using a single component. for idl_filename in idl_paths_recursive(source_path): compute_info_individual(idl_filename, 'tests') info_individuals = [info_individual()] compute_interfaces_info_overall(info_individuals)
def generate_interface_dependencies(output_directory): def idl_paths_recursive(directory): # This is slow, especially on Windows, due to os.walk making # excess stat() calls. Faster versions may appear in Python 3.5 or # later: # https://github.com/benhoyt/scandir # http://bugs.python.org/issue11406 idl_paths = [] for dirpath, _, files in os.walk(directory): idl_paths.extend( os.path.join(dirpath, filename) for filename in fnmatch.filter(files, '*.idl')) return idl_paths def collect_blink_idl_paths(): """Returns IDL file paths which blink actually uses.""" idl_paths = [] for component in COMPONENT_DIRECTORY: directory = os.path.join(source_path, component) idl_paths.extend(idl_paths_recursive(directory)) return idl_paths def collect_interfaces_info(idl_path_list): info_collector = InterfaceInfoCollector() for idl_path in idl_path_list: if os.path.basename(idl_path) in NON_BLINK_IDL_FILES: continue info_collector.collect_info(idl_path) info = info_collector.get_info_as_dict() # TestDictionary.{h,cpp} are placed under # Source/bindings/tests/idls/core. However, IdlCompiler generates # TestDictionary.{h,cpp} by using relative_dir. # So the files will be generated under # output_dir/core/bindings/tests/idls/core. # To avoid this issue, we need to clear relative_dir here. for value in info['interfaces_info'].itervalues(): value['relative_dir'] = '' component_info = info_collector.get_component_info_as_dict() return info, component_info # We compute interfaces info for *all* IDL files, not just test IDL # files, as code generator output depends on inheritance (both ancestor # chain and inherited extended attributes), and some real interfaces # are special-cased, such as Node. # # For example, when testing the behavior of interfaces that inherit # from Node, we also need to know that these inherit from EventTarget, # since this is also special-cased and Node inherits from EventTarget, # but this inheritance information requires computing dependencies for # the real Node.idl file. non_test_idl_paths = collect_blink_idl_paths() # For bindings test IDL files, we collect interfaces info for each # component so that we can generate union type containers separately. test_idl_paths = {} for component in COMPONENT_DIRECTORY: test_idl_paths[component] = idl_paths_recursive( os.path.join(test_input_directory, component)) # 2nd-stage computation: individual, then overall # # Properly should compute separately by component (currently test # includes are invalid), but that's brittle (would need to update this file # for each new component) and doesn't test the code generator any better # than using a single component. non_test_interfaces_info, non_test_component_info = collect_interfaces_info( non_test_idl_paths) test_interfaces_info = {} test_component_info = {} for component, paths in test_idl_paths.iteritems(): test_interfaces_info[component], test_component_info[ component] = collect_interfaces_info(paths) # In order to allow test IDL files to override the production IDL files if # they have the same interface name, process the test IDL files after the # non-test IDL files. info_individuals = [non_test_interfaces_info ] + test_interfaces_info.values() compute_interfaces_info_overall(info_individuals) component_info_providers['core'] = ComponentInfoProviderCore( interfaces_info, test_component_info['core']) component_info_providers['modules'] = ComponentInfoProviderModules( interfaces_info, test_component_info['core'], test_component_info['modules'])
def generate_interface_dependencies(output_directory): def idl_paths_recursive(directory): # This is slow, especially on Windows, due to os.walk making # excess stat() calls. Faster versions may appear in Python 3.5 or # later: # https://github.com/benhoyt/scandir # http://bugs.python.org/issue11406 idl_paths = [] for dirpath, _, files in os.walk(directory): idl_paths.extend(os.path.join(dirpath, filename) for filename in fnmatch.filter(files, '*.idl')) return idl_paths def collect_blink_idl_paths(): """Returns IDL file paths which blink actually uses.""" idl_paths = [] for component in COMPONENT_DIRECTORY: directory = os.path.join(source_path, component) idl_paths.extend(idl_paths_recursive(directory)) return idl_paths def collect_interfaces_info(idl_path_list): info_collector = InterfaceInfoCollector() for idl_path in idl_path_list: if os.path.basename(idl_path) in NON_BLINK_IDL_FILES: continue info_collector.collect_info(idl_path) info = info_collector.get_info_as_dict() # TestDictionary.{h,cpp} are placed under # Source/bindings/tests/idls/core. However, IdlCompiler generates # TestDictionary.{h,cpp} by using relative_dir. # So the files will be generated under # output_dir/core/bindings/tests/idls/core. # To avoid this issue, we need to clear relative_dir here. for value in info['interfaces_info'].itervalues(): value['relative_dir'] = '' component_info = info_collector.get_component_info_as_dict() return info, component_info # We compute interfaces info for *all* IDL files, not just test IDL # files, as code generator output depends on inheritance (both ancestor # chain and inherited extended attributes), and some real interfaces # are special-cased, such as Node. # # For example, when testing the behavior of interfaces that inherit # from Node, we also need to know that these inherit from EventTarget, # since this is also special-cased and Node inherits from EventTarget, # but this inheritance information requires computing dependencies for # the real Node.idl file. non_test_idl_paths = collect_blink_idl_paths() # For bindings test IDL files, we collect interfaces info for each # component so that we can generate union type containers separately. test_idl_paths = {} for component in COMPONENT_DIRECTORY: test_idl_paths[component] = idl_paths_recursive( os.path.join(test_input_directory, component)) # 2nd-stage computation: individual, then overall # # Properly should compute separately by component (currently test # includes are invalid), but that's brittle (would need to update this file # for each new component) and doesn't test the code generator any better # than using a single component. non_test_interfaces_info, non_test_component_info = collect_interfaces_info(non_test_idl_paths) test_interfaces_info = {} test_component_info = {} for component, paths in test_idl_paths.iteritems(): test_interfaces_info[component], test_component_info[component] = collect_interfaces_info(paths) # In order to allow test IDL files to override the production IDL files if # they have the same interface name, process the test IDL files after the # non-test IDL files. info_individuals = [non_test_interfaces_info] + test_interfaces_info.values() compute_interfaces_info_overall(info_individuals) # Add typedefs which are specified in the actual IDL files to the testing # component info. test_component_info['core']['typedefs'].update( non_test_component_info['typedefs']) component_info_providers['core'] = ComponentInfoProviderCore( interfaces_info, test_component_info['core']) component_info_providers['modules'] = ComponentInfoProviderModules( interfaces_info, test_component_info['core'], test_component_info['modules'])