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

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

Issue 159983003: Fix a bug with mojom imports where 2 imports with the same namespace would (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 10 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 | Annotate | Revision Log
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 28 matching lines...) Expand all
39 else: 39 else:
40 print "Unknown generator name %s" % generator_name 40 print "Unknown generator name %s" % generator_name
41 sys.exit(1) 41 sys.exit(1)
42 generator_module = imp.load_source(os.path.basename(generator_name)[:-3], 42 generator_module = imp.load_source(os.path.basename(generator_name)[:-3],
43 generator_name) 43 generator_name)
44 generators.append(generator_module) 44 generators.append(generator_module)
45 return generators 45 return generators
46 46
47 def ProcessFile(args, generator_modules, filename, processed_files): 47 def ProcessFile(args, generator_modules, filename, processed_files):
48 # Ensure we only visit each file once. 48 # Ensure we only visit each file once.
49 processed_files.append(filename) 49 if filename in processed_files:
50 if processed_files[filename] is None:
51 raise Exception("Circular dependency: " + filename)
52 return processed_files[filename]
53 processed_files[filename] = None
50 54
51 dirname, name = os.path.split(filename) 55 dirname, name = os.path.split(filename)
52 name = os.path.splitext(name)[0] 56 name = os.path.splitext(name)[0]
53 # TODO(darin): There's clearly too many layers of translation here! We can 57 # TODO(darin): There's clearly too many layers of translation here! We can
54 # at least avoid generating the serialized Mojom IR. 58 # at least avoid generating the serialized Mojom IR.
55 tree = mojo_parser.Parse(filename) 59 tree = mojo_parser.Parse(filename)
56 mojom = mojo_translate.Translate(tree, name) 60 mojom = mojo_translate.Translate(tree, name)
57 if args.debug_print_intermediate: 61 if args.debug_print_intermediate:
58 pprint.PrettyPrinter().pprint(mojom) 62 pprint.PrettyPrinter().pprint(mojom)
59 63
60 # Process all our imports first and collect the module object for each. 64 # Process all our imports first and collect the module object for each.
61 # We use these to generate proper type info. 65 # We use these to generate proper type info.
62 for import_data in mojom['imports']: 66 for import_data in mojom['imports']:
63 import_filename = os.path.join(dirname, import_data['filename']) 67 import_filename = os.path.join(dirname, import_data['filename'])
64 if import_filename not in processed_files: 68 import_data['module'] = ProcessFile(
65 import_data['module'] = ProcessFile( 69 args, generator_modules, import_filename, processed_files)
Matt Perry 2014/02/11 19:46:05 I made this change because multiple files could im
66 args, generator_modules, import_filename, processed_files)
67 70
68 module = mojom_data.OrderedModuleFromData(mojom) 71 module = mojom_data.OrderedModuleFromData(mojom)
69 for generator_module in generator_modules: 72 for generator_module in generator_modules:
70 generator = generator_module.Generator(module, args.include_dir, 73 generator = generator_module.Generator(module, args.include_dir,
71 args.output_dir) 74 args.output_dir)
72 generator.GenerateFiles() 75 generator.GenerateFiles()
73 76
77 processed_files[filename] = module
74 return module 78 return module
75 79
76 def Main(): 80 def Main():
77 parser = argparse.ArgumentParser( 81 parser = argparse.ArgumentParser(
78 description="Generate bindings from mojom files.") 82 description="Generate bindings from mojom files.")
79 parser.add_argument("filename", nargs="+", 83 parser.add_argument("filename", nargs="+",
80 help="mojom input file") 84 help="mojom input file")
81 parser.add_argument("-i", "--include_dir", dest="include_dir", default=".", 85 parser.add_argument("-i", "--include_dir", dest="include_dir", default=".",
82 help="include path for #includes") 86 help="include path for #includes")
83 parser.add_argument("-o", "--output_dir", dest="output_dir", default=".", 87 parser.add_argument("-o", "--output_dir", dest="output_dir", default=".",
84 help="output directory for generated files") 88 help="output directory for generated files")
85 parser.add_argument("-g", "--generators", dest="generators_string", 89 parser.add_argument("-g", "--generators", dest="generators_string",
86 metavar="GENERATORS", default="c++,javascript", 90 metavar="GENERATORS", default="c++,javascript",
87 help="comma-separated list of generators") 91 help="comma-separated list of generators")
88 parser.add_argument("--debug_print_intermediate", action="store_true", 92 parser.add_argument("--debug_print_intermediate", action="store_true",
89 help="print the intermediate representation") 93 help="print the intermediate representation")
90 args = parser.parse_args() 94 args = parser.parse_args()
91 95
92 generator_modules = LoadGenerators(args.generators_string) 96 generator_modules = LoadGenerators(args.generators_string)
93 97
94 if not os.path.exists(args.output_dir): 98 if not os.path.exists(args.output_dir):
95 os.makedirs(args.output_dir) 99 os.makedirs(args.output_dir)
96 100
97 for filename in args.filename: 101 for filename in args.filename:
98 ProcessFile(args, generator_modules, filename, []) 102 ProcessFile(args, generator_modules, filename, {})
99 103
100 return 0 104 return 0
101 105
102 106
103 if __name__ == "__main__": 107 if __name__ == "__main__":
104 sys.exit(Main()) 108 sys.exit(Main())
OLDNEW
« no previous file with comments | « mojo/public/bindings/generators/mojom_js_generator.py ('k') | mojo/public/bindings/pylib/generate/mojom.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698