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 |
deleted file mode 100755 |
index 2d1802c05ac6ec723c86f8f6a312a03b97efcd98..0000000000000000000000000000000000000000 |
--- a/mojo/public/tools/bindings/mojom_bindings_generator.py |
+++ /dev/null |
@@ -1,218 +0,0 @@ |
-#!/usr/bin/env python |
-# Copyright 2013 The Chromium Authors. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
- |
-"""The frontend for the Mojo bindings system.""" |
- |
- |
-import argparse |
-import imp |
-import os |
-import pprint |
-import sys |
- |
-# Disable lint check for finding modules: |
-# pylint: disable=F0401 |
- |
-def _GetDirAbove(dirname): |
- """Returns the directory "above" this file containing |dirname| (which must |
- also be "above" this file).""" |
- path = os.path.abspath(__file__) |
- while True: |
- path, tail = os.path.split(path) |
- assert tail |
- if tail == dirname: |
- return path |
- |
-# Manually check for the command-line flag. (This isn't quite right, since it |
-# ignores, e.g., "--", but it's close enough.) |
-if "--use_bundled_pylibs" in sys.argv[1:]: |
- sys.path.insert(0, os.path.join(_GetDirAbove("public"), "public/third_party")) |
- |
-sys.path.insert(0, os.path.join(os.path.dirname(os.path.abspath(__file__)), |
- "pylib")) |
- |
-from mojom.error import Error |
-from mojom.generate.data import OrderedModuleFromData |
-from mojom.parse.parser import Parse |
-from mojom.parse.translate import Translate |
- |
- |
-def LoadGenerators(generators_string): |
- if not generators_string: |
- return [] # No generators. |
- |
- script_dir = os.path.dirname(os.path.abspath(__file__)) |
- 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") |
- if generator_name.lower() == "dart": |
- generator_name = os.path.join(script_dir, "generators", |
- "mojom_dart_generator.py") |
- elif generator_name.lower() == "javascript": |
- 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") |
- elif generator_name.lower() == "python": |
- generator_name = os.path.join(script_dir, "generators", |
- "mojom_python_generator.py") |
- # Specified generator python module: |
- elif generator_name.endswith(".py"): |
- pass |
- else: |
- print "Unknown generator name %s" % generator_name |
- sys.exit(1) |
- generator_module = imp.load_source(os.path.basename(generator_name)[:-3], |
- generator_name) |
- generators.append(generator_module) |
- return generators |
- |
- |
-def MakeImportStackMessage(imported_filename_stack): |
- """Make a (human-readable) message listing a chain of imports. (Returned |
- string begins with a newline (if nonempty) and does not end with one.)""" |
- return ''.join( |
- reversed(["\n %s was imported by %s" % (a, b) for (a, b) in \ |
- zip(imported_filename_stack[1:], imported_filename_stack)])) |
- |
- |
-def FindImportFile(dir_name, file_name, search_dirs): |
- for search_dir in [dir_name] + search_dirs: |
- path = os.path.join(search_dir, file_name) |
- if os.path.isfile(path): |
- return path |
- return os.path.join(dir_name, file_name) |
- |
-class MojomProcessor(object): |
- def __init__(self, should_generate): |
- self._should_generate = should_generate |
- self._processed_files = {} |
- self._parsed_files = {} |
- |
- def ProcessFile(self, args, remaining_args, generator_modules, filename): |
- self._ParseFileAndImports(filename, args.import_directories, []) |
- |
- return self._GenerateModule(args, remaining_args, generator_modules, |
- filename) |
- |
- def _GenerateModule(self, args, remaining_args, generator_modules, filename): |
- # Return the already-generated module. |
- if filename in self._processed_files: |
- return self._processed_files[filename] |
- tree = self._parsed_files[filename] |
- |
- dirname, name = os.path.split(filename) |
- mojom = Translate(tree, name) |
- if args.debug_print_intermediate: |
- pprint.PrettyPrinter().pprint(mojom) |
- |
- # Process all our imports first and collect the module object for each. |
- # We use these to generate proper type info. |
- for import_data in mojom['imports']: |
- import_filename = FindImportFile(dirname, |
- import_data['filename'], |
- args.import_directories) |
- import_data['module'] = self._GenerateModule( |
- args, remaining_args, generator_modules, import_filename) |
- |
- module = OrderedModuleFromData(mojom) |
- |
- # Set the path as relative to the source root. |
- module.path = os.path.relpath(os.path.abspath(filename), |
- os.path.abspath(args.depth)) |
- |
- # Normalize to unix-style path here to keep the generators simpler. |
- module.path = module.path.replace('\\', '/') |
- |
- if self._should_generate(filename): |
- for generator_module in generator_modules: |
- generator = generator_module.Generator(module, args.output_dir) |
- filtered_args = [] |
- if hasattr(generator_module, 'GENERATOR_PREFIX'): |
- prefix = '--' + generator_module.GENERATOR_PREFIX + '_' |
- filtered_args = [arg for arg in remaining_args |
- if arg.startswith(prefix)] |
- generator.GenerateFiles(filtered_args) |
- |
- # Save result. |
- self._processed_files[filename] = module |
- return module |
- |
- def _ParseFileAndImports(self, filename, import_directories, |
- imported_filename_stack): |
- # Ignore already-parsed files. |
- if filename in self._parsed_files: |
- return |
- |
- if filename in imported_filename_stack: |
- print "%s: Error: Circular dependency" % filename + \ |
- MakeImportStackMessage(imported_filename_stack + [filename]) |
- sys.exit(1) |
- |
- try: |
- with open(filename) as f: |
- source = f.read() |
- except IOError as e: |
- print "%s: Error: %s" % (e.filename, e.strerror) + \ |
- MakeImportStackMessage(imported_filename_stack + [filename]) |
- sys.exit(1) |
- |
- try: |
- tree = Parse(source, filename) |
- except Error as e: |
- full_stack = imported_filename_stack + [filename] |
- print str(e) + MakeImportStackMessage(full_stack) |
- sys.exit(1) |
- |
- dirname = os.path.split(filename)[0] |
- for imp_entry in tree.import_list: |
- import_filename = FindImportFile(dirname, |
- imp_entry.import_filename, import_directories) |
- self._ParseFileAndImports(import_filename, import_directories, |
- imported_filename_stack + [filename]) |
- |
- self._parsed_files[filename] = tree |
- |
- |
-def main(): |
- parser = argparse.ArgumentParser( |
- description="Generate bindings from mojom files.") |
- parser.add_argument("filename", nargs="+", |
- help="mojom input file") |
- parser.add_argument("-d", "--depth", dest="depth", default=".", |
- help="depth from source root") |
- parser.add_argument("-o", "--output_dir", dest="output_dir", default=".", |
- help="output directory for generated files") |
- parser.add_argument("-g", "--generators", dest="generators_string", |
- metavar="GENERATORS", |
- default="c++,dart,javascript,java,python", |
- help="comma-separated list of generators") |
- parser.add_argument("--debug_print_intermediate", action="store_true", |
- help="print the intermediate representation") |
- parser.add_argument("-I", dest="import_directories", action="append", |
- metavar="directory", default=[], |
- 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") |
- (args, remaining_args) = parser.parse_known_args() |
- |
- generator_modules = LoadGenerators(args.generators_string) |
- |
- if not os.path.exists(args.output_dir): |
- os.makedirs(args.output_dir) |
- |
- processor = MojomProcessor(lambda filename: filename in args.filename) |
- for filename in args.filename: |
- processor.ProcessFile(args, remaining_args, generator_modules, filename) |
- |
- return 0 |
- |
- |
-if __name__ == "__main__": |
- sys.exit(main()) |