| #!/usr/bin/python |
| # Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| # for details. All rights reserved. Use of this source code is governed by a |
| # BSD-style license that can be found in the LICENSE file. |
| |
| """This is the entry point to create Elemental APIs from the IDL database.""" |
| |
| import elementalgenerator |
| import database |
| import logging.config |
| import optparse |
| import os |
| import shutil |
| import subprocess |
| import sys |
| |
| _logger = logging.getLogger('elementaldomgenerator') |
| |
| _webkit_renames = { |
| # W3C -> WebKit name conversion |
| # TODO(vsm): Maybe Store these renames in the IDLs. |
| 'ApplicationCache': 'DOMApplicationCache', |
| 'BarProp': 'BarInfo', |
| 'DedicatedWorkerGlobalScope': 'DedicatedWorkerContext', |
| 'FormData': 'DOMFormData', |
| 'Selection': 'DOMSelection', |
| 'SharedWorkerGlobalScope': 'SharedWorkerContext', |
| 'Window': 'DOMWindow', |
| 'WorkerGlobalScope': 'WorkerContext'} |
| |
| _html_strip_webkit_prefix_classes = [ |
| 'Animation', |
| 'AnimationEvent', |
| 'AnimationList', |
| 'BlobBuilder', |
| 'CSSKeyframeRule', |
| 'CSSKeyframesRule', |
| 'CSSMatrix', |
| 'CSSTransformValue', |
| 'Flags', |
| 'LoseContext', |
| 'Point', |
| 'TransitionEvent'] |
| |
| def HasAncestor(interface, names_to_match, database): |
| for parent in interface.parents: |
| if (parent.type.id in names_to_match or |
| (database.HasInterface(parent.type.id) and |
| HasAncestor(database.GetInterface(parent.type.id), names_to_match, |
| database))): |
| return True |
| return False |
| |
| def _MakeHtmlRenames(common_database): |
| html_renames = {} |
| |
| for interface in common_database.GetInterfaces(): |
| if (interface.id.startswith("HTML") and |
| HasAncestor(interface, ['Element', 'Document'], common_database)): |
| html_renames[interface.id] = interface.id[4:] |
| |
| for subclass in _html_strip_webkit_prefix_classes: |
| html_renames['WebKit' + subclass] = subclass |
| |
| # TODO(jacobr): we almost want to add this commented out line back. |
| # html_renames['HTMLCollection'] = 'ElementList' |
| # html_renames['NodeList'] = 'ElementList' |
| # html_renames['HTMLOptionsCollection'] = 'ElementList' |
| html_renames['DOMWindow'] = 'Window' |
| html_renames['DOMSelection'] = 'Selection' |
| html_renames['DOMFormData'] = 'FormData' |
| html_renames['DOMApplicationCache'] = 'ApplicationCache' |
| html_renames['BarInfo'] = 'BarProp' |
| html_renames['DedicatedWorkerContext']='DedicatedWorkerGlobalScope' |
| html_renames['SharedWorkerContext']='SharedWorkerGlobalScope' |
| html_renames['WorkerContext']='WorkerGlobalScope' |
| |
| return html_renames |
| |
| def GenerateDOM(systems, generate_html_systems, output_dir, |
| database_dir, use_database_cache): |
| current_dir = os.path.dirname(__file__) |
| |
| generator = elementalgenerator.ElementalGenerator( |
| auxiliary_dir=os.path.join(current_dir, '..', 'src'), |
| template_dir=os.path.join(current_dir, '..', 'templates'), |
| base_package='') |
| generator.LoadAuxiliary() |
| |
| common_database = database.Database(database_dir) |
| if use_database_cache: |
| common_database.LoadFromCache() |
| else: |
| common_database.Load() |
| |
| generator.FilterMembersWithUnidentifiedTypes(common_database) |
| webkit_database = common_database.Clone() |
| |
| # Generate Dart interfaces for the WebKit DOM. |
| generator.FilterInterfaces(database = webkit_database, |
| or_annotations = ['WebKit', 'Dart'], |
| exclude_displaced = ['WebKit'], |
| exclude_suppressed = ['WebKit', 'Dart']) |
| generator.RenameTypes(webkit_database, _webkit_renames, True) |
| html_renames = _MakeHtmlRenames(common_database) |
| generator.RenameTypes(webkit_database, html_renames, True) |
| |
| html_renames_inverse = dict((v,k) for k, v in html_renames.iteritems()) |
| webkit_renames_inverse = dict((v,k) for k, v in _webkit_renames.iteritems()) |
| |
| generator.Generate(database = webkit_database, |
| output_dir = output_dir, |
| lib_dir = output_dir, |
| module_source_preference = ['WebKit', 'Dart'], |
| source_filter = ['WebKit', 'Dart'], |
| super_database = common_database, |
| common_prefix = 'common', |
| super_map = webkit_renames_inverse, |
| html_map = html_renames_inverse, |
| systems = systems) |
| |
| generator.Flush() |
| |
| def main(): |
| parser = optparse.OptionParser() |
| parser.add_option('--systems', dest='systems', |
| action='store', type='string', |
| default='gwt,gwtjso', |
| help='Systems to generate (gwt)') |
| parser.add_option('--output-dir', dest='output_dir', |
| action='store', type='string', |
| default=None, |
| help='Directory to put the generated files') |
| parser.add_option('--use-database-cache', dest='use_database_cache', |
| action='store_true', |
| default=False, |
| help='''Use the cached database from the previous run to |
| improve startup performance''') |
| (options, args) = parser.parse_args() |
| |
| current_dir = os.path.dirname(__file__) |
| systems = options.systems.split(',') |
| html_system_names = ['htmlgwt'] |
| html_systems = [s for s in systems if s in html_system_names] |
| dom_systems = [s for s in systems if s not in html_system_names] |
| |
| database_dir = os.path.join(current_dir, '..', 'database') |
| use_database_cache = options.use_database_cache |
| logging.config.fileConfig(os.path.join(current_dir, 'logging.conf')) |
| |
| if dom_systems: |
| output_dir = options.output_dir or os.path.join(current_dir, |
| '../generated') |
| GenerateDOM(dom_systems, False, output_dir, |
| database_dir, use_database_cache) |
| |
| if html_systems: |
| output_dir = options.output_dir or os.path.join(current_dir, |
| '../generated') |
| GenerateDOM(html_systems, True, output_dir, |
| database_dir, use_database_cache or dom_systems) |
| |
| if __name__ == '__main__': |
| sys.exit(main()) |