Chromium Code Reviews| Index: mojo/public/tools/bindings/mojom_bindings_generator.py |
| diff --git a/mojo/public/tools/bindings/mojom_bindings_generator.py b/mojo/public/tools/bindings/mojom_bindings_generator.py |
| index 17a3dbe18ab22c82a6ade405ff0384e4d8a28170..381b04d92798e95c20c39b84ddbc293af6bbe135 100755 |
| --- a/mojo/public/tools/bindings/mojom_bindings_generator.py |
| +++ b/mojo/public/tools/bindings/mojom_bindings_generator.py |
| @@ -8,8 +8,10 @@ |
| import argparse |
| import imp |
| +import json |
| import os |
| import pprint |
| +import re |
| import sys |
| # Disable lint check for finding modules: |
| @@ -40,24 +42,23 @@ from mojom.parse.parser import Parse |
| from mojom.parse.translate import Translate |
| +_BUILTIN_GENERATORS = { |
| + "c++": "mojom_cpp_generator.py", |
| + "javascript": "mojom_js_generator.py", |
| + "java": "mojom_java_generator.py", |
| +} |
| + |
| def LoadGenerators(generators_string): |
| if not generators_string: |
| return [] # No generators. |
| script_dir = os.path.dirname(os.path.abspath(__file__)) |
| - generators = [] |
| + generators = {} |
| for generator_name in [s.strip() for s in generators_string.split(",")]: |
| - # "Built-in" generators: |
| - if generator_name.lower() == "c++": |
| - generator_name = os.path.join(script_dir, "generators", |
| - "mojom_cpp_generator.py") |
| - elif generator_name.lower() == "javascript": |
| + language = generator_name.lower() |
| + if language in _BUILTIN_GENERATORS: |
| generator_name = os.path.join(script_dir, "generators", |
| - "mojom_js_generator.py") |
| - elif generator_name.lower() == "java": |
| - generator_name = os.path.join(script_dir, "generators", |
| - "mojom_java_generator.py") |
| - # Specified generator python module: |
| + _BUILTIN_GENERATORS[language]) |
| elif generator_name.endswith(".py"): |
|
yzshen1
2015/12/15 00:09:10
This elif is probably not useful.
|
| pass |
| else: |
| @@ -65,7 +66,7 @@ def LoadGenerators(generators_string): |
| sys.exit(1) |
| generator_module = imp.load_source(os.path.basename(generator_name)[:-3], |
| generator_name) |
| - generators.append(generator_module) |
| + generators[language] = generator_module |
| return generators |
| @@ -89,6 +90,20 @@ class MojomProcessor(object): |
| self._should_generate = should_generate |
| self._processed_files = {} |
| self._parsed_files = {} |
| + self._typemap = {} |
| + |
| + def LoadTypemaps(self, typemaps): |
|
yzshen1
2015/12/15 00:09:10
Please consider writing tests in:
https://code.goo
|
| + # Support some very simple single-line comments in typemap JSON. |
| + comment_expr = r"^\s*//.*$" |
| + def no_comments(line): |
| + return not re.match(comment_expr, line) |
| + for filename in typemaps: |
| + with open(filename) as f: |
| + typemaps = json.loads("".join(filter(no_comments, f.readlines()))) |
| + for language, typemap in typemaps.iteritems(): |
| + language_map = self._typemap.get(language, {}) |
| + language_map.update(typemap) |
| + self._typemap[language] = language_map |
| def ProcessFile(self, args, remaining_args, generator_modules, filename): |
| self._ParseFileAndImports(filename, args.import_directories, []) |
| @@ -126,8 +141,10 @@ class MojomProcessor(object): |
| module.path = module.path.replace('\\', '/') |
| if self._should_generate(filename): |
| - for generator_module in generator_modules: |
| - generator = generator_module.Generator(module, args.output_dir) |
| + for language, generator_module in generator_modules.iteritems(): |
| + generator = generator_module.Generator( |
| + module, args.output_dir, typemap=self._typemap.get(language, {}), |
| + variant=args.variant) |
| filtered_args = [] |
| if hasattr(generator_module, 'GENERATOR_PREFIX'): |
| prefix = '--' + generator_module.GENERATOR_PREFIX + '_' |
| @@ -195,6 +212,11 @@ def main(): |
| help="add a directory to be searched for import files") |
| parser.add_argument("--use_bundled_pylibs", action="store_true", |
| help="use Python modules bundled in the SDK") |
| + parser.add_argument("--typemap", action="append", metavar="TYPEMAP", |
| + default=[], dest="typemaps", |
| + help="apply TYPEMAP to generated output") |
| + parser.add_argument("--variant", dest="variant", default=None, |
| + help="output a named variant of the bindings") |
| (args, remaining_args) = parser.parse_known_args() |
| generator_modules = LoadGenerators(args.generators_string) |
| @@ -202,6 +224,7 @@ def main(): |
| fileutil.EnsureDirectoryExists(args.output_dir) |
| processor = MojomProcessor(lambda filename: filename in args.filename) |
| + processor.LoadTypemaps(set(args.typemaps)) |
| for filename in args.filename: |
| processor.ProcessFile(args, remaining_args, generator_modules, filename) |