Index: sdk/lib/html/scripts/dartgenerator.py |
diff --git a/sdk/lib/html/scripts/dartgenerator.py b/sdk/lib/html/scripts/dartgenerator.py |
deleted file mode 100755 |
index ac399eb3c160dfe6b291784ec1daee7cb5777cd5..0000000000000000000000000000000000000000 |
--- a/sdk/lib/html/scripts/dartgenerator.py |
+++ /dev/null |
@@ -1,241 +0,0 @@ |
-#!/usr/bin/python |
-# Copyright (c) 2012, 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 module generates Dart APIs from the IDL database.""" |
- |
-import emitter |
-import idlnode |
-import logging |
-import os |
-import re |
-import shutil |
-from generator import * |
- |
-_logger = logging.getLogger('dartgenerator') |
- |
-def MergeNodes(node, other): |
- node.operations.extend(other.operations) |
- for attribute in other.attributes: |
- if not node.has_attribute(attribute): |
- node.attributes.append(attribute) |
- |
- node.constants.extend(other.constants) |
- |
-class DartGenerator(object): |
- """Utilities to generate Dart APIs and corresponding JavaScript.""" |
- |
- def __init__(self): |
- self._auxiliary_files = {} |
- self._dart_templates_re = re.compile(r'[\w.:]+<([\w\.<>:]+)>') |
- |
- def _StripModules(self, type_name): |
- return type_name.split('::')[-1] |
- |
- def _IsCompoundType(self, database, type_name): |
- if IsRegisteredType(type_name): |
- return True |
- |
- if type_name.endswith('?'): |
- return self._IsCompoundType(database, type_name[:-len('?')]) |
- |
- if type_name.endswith('[]'): |
- return self._IsCompoundType(database, type_name[:-len('[]')]) |
- |
- stripped_type_name = self._StripModules(type_name) |
- if database.HasInterface(stripped_type_name): |
- return True |
- |
- dart_template_match = self._dart_templates_re.match(type_name) |
- if dart_template_match: |
- # Dart templates |
- parent_type_name = type_name[0 : dart_template_match.start(1) - 1] |
- sub_type_name = dart_template_match.group(1) |
- return (self._IsCompoundType(database, parent_type_name) and |
- self._IsCompoundType(database, sub_type_name)) |
- return False |
- |
- def _IsDartType(self, type_name): |
- return '.' in type_name |
- |
- def LoadAuxiliary(self, auxiliary_dir): |
- def Visitor(_, dirname, names): |
- for name in names: |
- if name.endswith('.dart'): |
- name = name[0:-5] # strip off ".dart" |
- self._auxiliary_files[name] = os.path.join(dirname, name) |
- os.path.walk(auxiliary_dir, Visitor, None) |
- |
- def FilterMembersWithUnidentifiedTypes(self, database): |
- """Removes unidentified types. |
- |
- Removes constants, attributes, operations and parents with unidentified |
- types. |
- """ |
- |
- for interface in database.GetInterfaces(): |
- def IsIdentified(idl_node): |
- node_name = idl_node.id if idl_node.id else 'parent' |
- for idl_type in idl_node.all(idlnode.IDLType): |
- type_name = idl_type.id |
- if (type_name is not None and |
- self._IsCompoundType(database, type_name)): |
- continue |
- _logger.warn('removing %s in %s which has unidentified type %s' % |
- (node_name, interface.id, type_name)) |
- return False |
- return True |
- |
- interface.constants = filter(IsIdentified, interface.constants) |
- interface.attributes = filter(IsIdentified, interface.attributes) |
- interface.operations = filter(IsIdentified, interface.operations) |
- interface.parents = filter(IsIdentified, interface.parents) |
- |
- def FilterInterfaces(self, database, |
- and_annotations=[], |
- or_annotations=[], |
- exclude_displaced=[], |
- exclude_suppressed=[]): |
- """Filters a database to remove interfaces and members that are missing |
- annotations. |
- |
- The FremontCut IDLs use annotations to specify implementation |
- status in various platforms. For example, if a member is annotated |
- with @WebKit, this means that the member is supported by WebKit. |
- |
- Args: |
- database -- the database to filter |
- all_annotations -- a list of annotation names a member has to |
- have or it will be filtered. |
- or_annotations -- if a member has one of these annotations, it |
- won't be filtered even if it is missing some of the |
- all_annotations. |
- exclude_displaced -- if a member has this annotation and it |
- is marked as displaced it will always be filtered. |
- exclude_suppressed -- if a member has this annotation and it |
- is marked as suppressed it will always be filtered. |
- """ |
- |
- # Filter interfaces and members whose annotations don't match. |
- for interface in database.GetInterfaces(): |
- def HasAnnotations(idl_node): |
- """Utility for determining if an IDLNode has all |
- the required annotations""" |
- for a in exclude_displaced: |
- if (a in idl_node.annotations |
- and 'via' in idl_node.annotations[a]): |
- return False |
- for a in exclude_suppressed: |
- if (a in idl_node.annotations |
- and 'suppressed' in idl_node.annotations[a]): |
- return False |
- for a in or_annotations: |
- if a in idl_node.annotations: |
- return True |
- if and_annotations == []: |
- return False |
- for a in and_annotations: |
- if a not in idl_node.annotations: |
- return False |
- return True |
- |
- if HasAnnotations(interface): |
- interface.constants = filter(HasAnnotations, interface.constants) |
- interface.attributes = filter(HasAnnotations, interface.attributes) |
- interface.operations = filter(HasAnnotations, interface.operations) |
- interface.parents = filter(HasAnnotations, interface.parents) |
- else: |
- database.DeleteInterface(interface.id) |
- |
- # Ugly temporary hack |
- websocket_interface = database.GetInterface('WebSocket') |
- def make_object(**fields): |
- o = type('Anon', (object,), {})() |
- for k, v in fields.items(): setattr(o, k, v) |
- o.ext_attrs = {} |
- return o |
- arg = make_object(id = 'url', type = make_object(id = 'DOMString')) |
- websocket_interface.ext_attrs['Constructor'] = make_object(arguments = [arg]) |
- websocket_interface.ext_attrs['CustomConstructor'] = True |
- |
- self.FilterMembersWithUnidentifiedTypes(database) |
- |
- def Generate(self, database, super_database, generate_interface): |
- self._database = database |
- |
- # Collect interfaces |
- interfaces = [] |
- for interface in database.GetInterfaces(): |
- if not MatchSourceFilter(interface): |
- # Skip this interface since it's not present in the required source |
- _logger.info('Omitting interface - %s' % interface.id) |
- continue |
- interfaces.append(interface) |
- |
- # TODO(sra): Use this list of exception names to generate information to |
- # tell dart2js which exceptions can be passed from JS to Dart code. |
- exceptions = self._CollectExceptions(interfaces) |
- |
- # Render all interfaces into Dart and save them in files. |
- for interface in self._PreOrderInterfaces(interfaces): |
- interface_name = interface.id |
- auxiliary_file = self._auxiliary_files.get(interface_name) |
- if auxiliary_file is not None: |
- _logger.info('Skipping %s because %s exists' % ( |
- interface_name, auxiliary_file)) |
- continue |
- |
- _logger.info('Generating %s' % interface.id) |
- generate_interface(interface) |
- |
- def _PreOrderInterfaces(self, interfaces): |
- """Returns the interfaces in pre-order, i.e. parents first.""" |
- seen = set() |
- ordered = [] |
- def visit(interface): |
- if interface.id in seen: |
- return |
- seen.add(interface.id) |
- for parent in interface.parents: |
- if IsDartCollectionType(parent.type.id): |
- continue |
- if self._database.HasInterface(parent.type.id): |
- parent_interface = self._database.GetInterface(parent.type.id) |
- visit(parent_interface) |
- ordered.append(interface) |
- |
- for interface in interfaces: |
- visit(interface) |
- return ordered |
- |
- def _CollectExceptions(self, interfaces): |
- """Returns the names of all exception classes raised.""" |
- exceptions = set() |
- for interface in interfaces: |
- for attribute in interface.attributes: |
- if attribute.get_raises: |
- exceptions.add(attribute.get_raises.id) |
- if attribute.set_raises: |
- exceptions.add(attribute.set_raises.id) |
- for operation in interface.operations: |
- if operation.raises: |
- exceptions.add(operation.raises.id) |
- return exceptions |
- |
- |
- def FixEventTargets(self, database): |
- for interface in database.GetInterfaces(): |
- # Create fake EventTarget parent interface for interfaces that have |
- # 'EventTarget' extended attribute. |
- if 'EventTarget' in interface.ext_attrs: |
- ast = [('Annotation', [('Id', 'WebKit')]), |
- ('InterfaceType', ('ScopedName', 'EventTarget'))] |
- interface.parents.append(idlnode.IDLParentInterface(ast)) |
- |
- def AddMissingArguments(self, database): |
- ARG = idlnode.IDLArgument([('Type', ('ScopedName', 'object')), ('Id', 'arg')]) |
- for interface in database.GetInterfaces(): |
- for operation in interface.operations: |
- if operation.ext_attrs.get('CallWith') == 'ScriptArguments|ScriptState': |
- operation.arguments.append(ARG) |