Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(335)

Side by Side Diff: mojo/public/tools/bindings/mojom_bindings_generator.py

Issue 2171033002: [mojo] Allow bindings generation with explicit relative include paths (Closed) Base URL: https://chromium.googlesource.com/a/chromium/src.git@master
Patch Set: Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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())
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698