Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(361)

Unified Diff: sdk/lib/html/scripts/dartgenerator.py

Issue 11691009: Moved most of html lib generating scripts into tools. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sdk/lib/html/scripts/dartdomgenerator.py ('k') | sdk/lib/html/scripts/dartgenerator_test.py » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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)
« no previous file with comments | « sdk/lib/html/scripts/dartdomgenerator.py ('k') | sdk/lib/html/scripts/dartgenerator_test.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698