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 |