Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
| 2 # Copyright 2013 The Chromium Authors. All rights reserved. | 2 # Copyright 2013 The Chromium Authors. All rights reserved. |
| 3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
| 4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
| 5 | 5 |
| 6 """The frontend for the Mojo bindings system.""" | 6 """The frontend for the Mojo bindings system.""" |
| 7 | 7 |
| 8 | 8 |
| 9 import argparse | 9 import argparse |
| 10 import imp | 10 import imp |
| (...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 74 string begins with a newline (if nonempty) and does not end with one.)""" | 74 string begins with a newline (if nonempty) and does not end with one.)""" |
| 75 return ''.join( | 75 return ''.join( |
| 76 reversed(["\n %s was imported by %s" % (a, b) for (a, b) in \ | 76 reversed(["\n %s was imported by %s" % (a, b) for (a, b) in \ |
| 77 zip(imported_filename_stack[1:], imported_filename_stack)])) | 77 zip(imported_filename_stack[1:], imported_filename_stack)])) |
| 78 | 78 |
| 79 | 79 |
| 80 def FindImportFile(dir_name, file_name, search_dirs): | 80 def FindImportFile(dir_name, file_name, search_dirs): |
| 81 for search_dir in [dir_name] + search_dirs: | 81 for search_dir in [dir_name] + search_dirs: |
| 82 path = os.path.join(search_dir, file_name) | 82 path = os.path.join(search_dir, file_name) |
| 83 if os.path.isfile(path): | 83 if os.path.isfile(path): |
| 84 return path | 84 return path, search_dir |
| 85 return os.path.join(dir_name, file_name) | 85 return os.path.join(dir_name, file_name), None |
|
yzshen1
2016/07/21 23:21:51
According to our discussion, I wonder why this is
Luis Héctor Chávez
2016/07/21 23:33:13
Returning this will trigger L178 to print a nice i
| |
| 86 | 86 |
| 87 class MojomProcessor(object): | 87 class MojomProcessor(object): |
| 88 def __init__(self, should_generate): | 88 def __init__(self, should_generate): |
| 89 self._should_generate = should_generate | 89 self._should_generate = should_generate |
| 90 self._processed_files = {} | 90 self._processed_files = {} |
| 91 self._parsed_files = {} | 91 self._parsed_files = {} |
| 92 self._typemap = {} | 92 self._typemap = {} |
| 93 | 93 |
| 94 def LoadTypemaps(self, typemaps): | 94 def LoadTypemaps(self, typemaps): |
| 95 # Support some very simple single-line comments in typemap JSON. | 95 # Support some very simple single-line comments in typemap JSON. |
| 96 comment_expr = r"^\s*//.*$" | 96 comment_expr = r"^\s*//.*$" |
| 97 def no_comments(line): | 97 def no_comments(line): |
| 98 return not re.match(comment_expr, line) | 98 return not re.match(comment_expr, line) |
| 99 for filename in typemaps: | 99 for filename in typemaps: |
| 100 with open(filename) as f: | 100 with open(filename) as f: |
| 101 typemaps = json.loads("".join(filter(no_comments, f.readlines()))) | 101 typemaps = json.loads("".join(filter(no_comments, f.readlines()))) |
| 102 for language, typemap in typemaps.iteritems(): | 102 for language, typemap in typemaps.iteritems(): |
| 103 language_map = self._typemap.get(language, {}) | 103 language_map = self._typemap.get(language, {}) |
| 104 language_map.update(typemap) | 104 language_map.update(typemap) |
| 105 self._typemap[language] = language_map | 105 self._typemap[language] = language_map |
| 106 | 106 |
| 107 def ProcessFile(self, args, remaining_args, generator_modules, filename): | 107 def ProcessFile(self, args, remaining_args, generator_modules, filename): |
| 108 self._ParseFileAndImports(filename, args.import_directories, []) | 108 self._ParseFileAndImports(filename, args.import_directories, []) |
| 109 | 109 |
| 110 return self._GenerateModule(args, remaining_args, generator_modules, | 110 return self._GenerateModule(args, remaining_args, generator_modules, |
| 111 filename) | 111 filename, args.depth) |
| 112 | 112 |
| 113 def _GenerateModule(self, args, remaining_args, generator_modules, filename): | 113 def _GenerateModule(self, args, remaining_args, generator_modules, filename, |
| 114 source_root): | |
| 114 # Return the already-generated module. | 115 # Return the already-generated module. |
| 115 if filename in self._processed_files: | 116 if filename in self._processed_files: |
| 116 return self._processed_files[filename] | 117 return self._processed_files[filename] |
| 117 tree = self._parsed_files[filename] | 118 tree = self._parsed_files[filename] |
| 118 | 119 |
| 119 dirname, name = os.path.split(filename) | 120 dirname, name = os.path.split(filename) |
| 120 mojom = Translate(tree, name) | 121 mojom = Translate(tree, name) |
| 121 if args.debug_print_intermediate: | 122 if args.debug_print_intermediate: |
| 122 pprint.PrettyPrinter().pprint(mojom) | 123 pprint.PrettyPrinter().pprint(mojom) |
| 123 | 124 |
| 124 # Process all our imports first and collect the module object for each. | 125 # Process all our imports first and collect the module object for each. |
| 125 # We use these to generate proper type info. | 126 # We use these to generate proper type info. |
| 126 for import_data in mojom['imports']: | 127 for import_data in mojom['imports']: |
| 127 import_filename = FindImportFile(dirname, | 128 import_filename, import_dir = FindImportFile(dirname, |
| 128 import_data['filename'], | 129 import_data['filename'], |
| 129 args.import_directories) | 130 args.import_directories) |
| 131 if import_dir is None: | |
| 132 import_dir = args.depth | |
| 130 import_data['module'] = self._GenerateModule( | 133 import_data['module'] = self._GenerateModule( |
| 131 args, remaining_args, generator_modules, import_filename) | 134 args, remaining_args, generator_modules, import_filename, import_dir) |
| 132 | 135 |
| 133 module = OrderedModuleFromData(mojom) | 136 module = OrderedModuleFromData(mojom) |
| 134 | 137 |
| 135 # Set the path as relative to the source root. | 138 # Set the path as relative to the source root. |
| 136 module.path = os.path.relpath(os.path.abspath(filename), | 139 module.path = os.path.relpath(os.path.abspath(filename), |
| 137 os.path.abspath(args.depth)) | 140 os.path.abspath(source_root)) |
| 138 | 141 |
| 139 # Normalize to unix-style path here to keep the generators simpler. | 142 # Normalize to unix-style path here to keep the generators simpler. |
| 140 module.path = module.path.replace('\\', '/') | 143 module.path = module.path.replace('\\', '/') |
| 141 | 144 |
| 142 if self._should_generate(filename): | 145 if self._should_generate(filename): |
| 143 for language, generator_module in generator_modules.iteritems(): | 146 for language, generator_module in generator_modules.iteritems(): |
| 144 generator = generator_module.Generator( | 147 generator = generator_module.Generator( |
| 145 module, args.output_dir, typemap=self._typemap.get(language, {}), | 148 module, args.output_dir, typemap=self._typemap.get(language, {}), |
| 146 variant=args.variant, bytecode_path=args.bytecode_path, | 149 variant=args.variant, bytecode_path=args.bytecode_path, |
| 147 for_blink=args.for_blink, | 150 for_blink=args.for_blink, |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 178 | 181 |
| 179 try: | 182 try: |
| 180 tree = Parse(source, filename) | 183 tree = Parse(source, filename) |
| 181 except Error as e: | 184 except Error as e: |
| 182 full_stack = imported_filename_stack + [filename] | 185 full_stack = imported_filename_stack + [filename] |
| 183 print str(e) + MakeImportStackMessage(full_stack) | 186 print str(e) + MakeImportStackMessage(full_stack) |
| 184 sys.exit(1) | 187 sys.exit(1) |
| 185 | 188 |
| 186 dirname = os.path.split(filename)[0] | 189 dirname = os.path.split(filename)[0] |
| 187 for imp_entry in tree.import_list: | 190 for imp_entry in tree.import_list: |
| 188 import_filename = FindImportFile(dirname, | 191 import_filename, _ = FindImportFile(dirname, |
| 189 imp_entry.import_filename, import_directories) | 192 imp_entry.import_filename, import_directories) |
| 190 self._ParseFileAndImports(import_filename, import_directories, | 193 self._ParseFileAndImports(import_filename, import_directories, |
| 191 imported_filename_stack + [filename]) | 194 imported_filename_stack + [filename]) |
| 192 | 195 |
| 193 self._parsed_files[filename] = tree | 196 self._parsed_files[filename] = tree |
| 194 | 197 |
| 195 | 198 |
| 196 def _Generate(args, remaining_args): | 199 def _Generate(args, remaining_args): |
| 197 if args.variant == "none": | 200 if args.variant == "none": |
| 198 args.variant = None | 201 args.variant = None |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 269 "-o", "--output_dir", dest="output_dir", default=".", | 272 "-o", "--output_dir", dest="output_dir", default=".", |
| 270 help="output directory for precompiled templates") | 273 help="output directory for precompiled templates") |
| 271 precompile_parser.set_defaults(func=_Precompile) | 274 precompile_parser.set_defaults(func=_Precompile) |
| 272 | 275 |
| 273 args, remaining_args = parser.parse_known_args() | 276 args, remaining_args = parser.parse_known_args() |
| 274 return args.func(args, remaining_args) | 277 return args.func(args, remaining_args) |
| 275 | 278 |
| 276 | 279 |
| 277 if __name__ == "__main__": | 280 if __name__ == "__main__": |
| 278 sys.exit(main()) | 281 sys.exit(main()) |
| OLD | NEW |