Index: bindings/dart/scripts/test/main.py
|
diff --git a/bindings/dart/scripts/test/main.py b/bindings/dart/scripts/test/main.py
|
new file mode 100755
|
index 0000000000000000000000000000000000000000..db3c00a3cf1a031e19077399ad1bb8f3b8782ecd
|
--- /dev/null
|
+++ b/bindings/dart/scripts/test/main.py
|
@@ -0,0 +1,247 @@
|
+#!/usr/bin/python
|
+# Copyright (C) 2010 Google Inc. All rights reserved.
|
+#
|
+# Redistribution and use in source and binary forms, with or without
|
+# modification, are permitted provided that the following conditions
|
+# are met:
|
+# 1. Redistributions of source code must retain the above copyright
|
+# notice, this list of conditions and the following disclaimer.
|
+# 2. Redistributions in binary form must reproduce the above copyright
|
+# notice, this list of conditions and the following disclaimer in the
|
+# documentation and/or other materials provided with the distribution.
|
+#
|
+# THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
|
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
|
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
+# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
+# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
+# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
+#
|
+
|
+import traceback
|
+
|
+import fnmatch
|
+from optparse import OptionParser
|
+import os
|
+import shutil
|
+import sys
|
+import tempfile
|
+
|
+import compute_interfaces_info_individual
|
+from compute_interfaces_info_individual import compute_info_individual, info_individual
|
+import compute_interfaces_info_overall
|
+from compute_interfaces_info_overall import compute_interfaces_info_overall, interfaces_info
|
+from compiler import IdlCompilerDart
|
+
|
+# TODO(terry): Temporary solution list of IDLs to parse and IDL as dependencies.
|
+from idl_files import full_path_core_idl_files, full_path_core_dependency_idl_files, full_path_modules_idl_files, full_path_modules_dependency_idl_files
|
+
|
+#from dart_tests import run_dart_tests
|
+
|
+
|
+EXTENDED_ATTRIBUTES_FILE = 'bindings/IDLExtendedAttributes.txt'
|
+
|
+idl_compiler = None
|
+
|
+
|
+def parse_options():
|
+ parser = OptionParser()
|
+
|
+ parser.add_option("--output-directory",
|
+ action="store",
|
+ type="string",
|
+ dest="output_directory",
|
+ help="Generate output to a known directory")
|
+ parser.add_option("-v", "--verbose",
|
+ action="store_true",
|
+ dest="verbose",
|
+ default=False,
|
+ help="Show all information messages")
|
+ parser.add_option("-k", "--keep",
|
+ action="store_true",
|
+ dest="keep",
|
+ default=False,
|
+ help="Don't delete the temporary directory on exit")
|
+ parser.add_option("--compute-idls", type='int', help="Compile IDLs interfaces and dependencies (GYP)")
|
+ parser.add_option('--globals-only', type='int', help="Generate the globals")
|
+
|
+ options, args = parser.parse_args()
|
+
|
+ options.compute_idls = bool(options.compute_idls)
|
+ options.globals_only = bool(options.globals_only)
|
+
|
+ return options
|
+
|
+
|
+class ScopedTempFileProvider(object):
|
+ def __init__(self, keep=False):
|
+ self.keep = keep
|
+ self.dir_paths = []
|
+
|
+ def __enter__(self):
|
+ return self
|
+
|
+ def __exit__(self, exc_type, exc_value, traceback):
|
+ if not self.keep:
|
+ for dir_path in self.dir_paths:
|
+ # Temporary directories are used as output directories, so they
|
+ # contains unknown files (they aren't empty), hence use rmtree
|
+ shutil.rmtree(dir_path)
|
+
|
+ def new_temp_dir(self):
|
+ dir_path = tempfile.mkdtemp()
|
+ self.dir_paths.append(dir_path)
|
+ return dir_path
|
+
|
+
|
+class DirectoryProvider(object):
|
+ def __init__(self, path=""):
|
+ self.dir_path = path
|
+
|
+ def __enter__(self):
|
+ return self
|
+
|
+ def new_temp_dir(self):
|
+ return self.dir_path
|
+
|
+
|
+def idl_paths_recursive(directory):
|
+ idl_paths = []
|
+ for dirpath, _, files in os.walk(directory):
|
+ idl_paths.extend(os.path.join(dirpath, filename)
|
+ for filename in fnmatch.filter(files, '*.idl'))
|
+ return idl_paths
|
+
|
+
|
+class Build():
|
+ def __init__(self, provider):
|
+ self.output_directory = provider.new_temp_dir()
|
+
|
+ attrib_file = os.path.join('Source', EXTENDED_ATTRIBUTES_FILE)
|
+ # Create compiler.
|
+ self.idl_compiler = IdlCompilerDart(self.output_directory,
|
+ attrib_file,
|
+ interfaces_info=interfaces_info,
|
+ only_if_changed=True)
|
+
|
+ def format_exception(self, e):
|
+ exception_list = traceback.format_stack()
|
+ exception_list = exception_list[:-2]
|
+ exception_list.extend(traceback.format_tb(sys.exc_info()[2]))
|
+ exception_list.extend(traceback.format_exception_only(sys.exc_info()[0], sys.exc_info()[1]))
|
+
|
+ exception_str = "Traceback (most recent call last):\n"
|
+ exception_str += "".join(exception_list)
|
+ # Removing the last \n
|
+ exception_str = exception_str[:-1]
|
+
|
+ return exception_str
|
+
|
+ def generate_from_idl(self, idl_file):
|
+ try:
|
+ idl_file_fullpath = os.path.realpath(idl_file)
|
+ self.idl_compiler.compile_file(idl_file_fullpath)
|
+ except Exception as err:
|
+ print 'ERROR: idl_compiler.py: ' + os.path.basename(idl_file)
|
+ print err
|
+ print
|
+ print 'Stack Dump:'
|
+ print self.format_exception(err)
|
+
|
+ return 1
|
+
|
+ def generate_global(self):
|
+ try:
|
+ self.idl_compiler.generate_global()
|
+ except Exception as err:
|
+ print 'ERROR: idl_compiler.py generate global'
|
+ print err
|
+ print
|
+ print 'Stack Dump:'
|
+ print self.format_exception(err)
|
+
|
+ return 1
|
+
|
+ return 0
|
+
|
+
|
+def main(argv):
|
+ '''
|
+ Runs Dart IDL code generator; IDL files. IDL files same as GYP files in
|
+ Source/bindings/core/core.gypi and Source/bindings/modules/modules.gypi (see
|
+ idl_files.py on list of files).
|
+
|
+ To run the PYTHONPATH should have the directories:
|
+
|
+ Source/bindings/scripts
|
+ Source/bindings/scripts/dart
|
+ '''
|
+
|
+ options = parse_options()
|
+
|
+ if options.compute_idls:
|
+ # TODO(terry): Assumes CWD is third_party/WebKit so any call to
|
+ # full_path_NNNN is prefixing 'Source/core' to path.
|
+ core_idls = full_path_core_idl_files()
|
+ core_dependency_idls = full_path_core_dependency_idl_files()
|
+ modules_idls = full_path_modules_idl_files()
|
+ modules_dependency_idls = full_path_modules_dependency_idl_files()
|
+
|
+ all_interfaces = core_idls + modules_idls
|
+ all_dependencies = core_dependency_idls + modules_dependency_idls
|
+ all_files = all_interfaces + all_dependencies
|
+
|
+ # 2-stage computation: individual, then overall
|
+ for idl_filename in all_files:
|
+ compute_info_individual(idl_filename, 'dart')
|
+ info_individuals = [info_individual()]
|
+ compute_interfaces_info_overall(info_individuals)
|
+
|
+ # Compile just IDLs with interfaces (no dependencies).
|
+ if (options.output_directory == None):
|
+ with ScopedTempFileProvider(keep=options.keep) as provider:
|
+ build = Build(provider)
|
+ else:
|
+ provider = DirectoryProvider(path=options.output_directory)
|
+ build = Build(provider)
|
+
|
+ if options.verbose and options.keep:
|
+ print 'Output directory %s created' % build.output_directory
|
+
|
+ # Compile IDLs
|
+ for filename in all_interfaces:
|
+ if not filename.endswith('.idl'):
|
+ continue
|
+ if build.generate_from_idl(filename):
|
+ return False
|
+
|
+ if options.verbose:
|
+ print '%s IDLs with interfaces processed' % len(all_interfaces)
|
+
|
+ if options.verbose and not options.keep:
|
+ print 'Output directory %s deleted' % build.output_directory
|
+
|
+ if options.globals_only:
|
+ if (options.output_directory == None):
|
+ with ScopedTempFileProvider(keep=options.keep) as provider:
|
+ build = Build(provider)
|
+ else:
|
+ provider = DirectoryProvider(path=options.output_directory)
|
+ build = Build(provider)
|
+
|
+ if options.verbose:
|
+ print 'Generating global...'
|
+
|
+ build.generate_global()
|
+
|
+ if options.verbose:
|
+ print 'Created DartWebkitClassIds .h/.cpp'
|
+
|
+
|
+if __name__ == '__main__':
|
+ sys.exit(main(sys.argv))
|
|