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

Unified Diff: lib/dom/scripts/generator.py

Issue 10702202: Introduce TypeRegistry class. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 5 months 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
Index: lib/dom/scripts/generator.py
diff --git a/lib/dom/scripts/generator.py b/lib/dom/scripts/generator.py
index 65b87e08714d45edf337e1a52eee606965a44d9b..cabdc3b60b34301119a93bb95fbb016be7569e2d 100644
--- a/lib/dom/scripts/generator.py
+++ b/lib/dom/scripts/generator.py
@@ -85,7 +85,9 @@ dom_frog_native_bodies = {
}
def IsPrimitiveType(type_name):
- return isinstance(GetIDLTypeInfo(type_name), PrimitiveIDLTypeInfo)
+ if not type_name in _idl_type_registry:
+ return False
+ return _idl_type_registry[type_name]['type'] == 'Primitive'
def ListImplementationInfo(interface, database):
"""Returns a tuple (elment_type, requires_indexer).
@@ -166,7 +168,7 @@ def MatchSourceFilter(thing):
def DartType(idl_type_name):
- return GetIDLTypeInfo(idl_type_name).dart_type()
+ return TypeRegistry().TypeInfo(idl_type_name).dart_type()
class ParamInfo(object):
@@ -490,16 +492,10 @@ def TypeName(type_ids, interface):
# ------------------------------------------------------------------------------
class IDLTypeInfo(object):
- def __init__(self, idl_type, dart_type=None,
- native_type=None,
- custom_to_native=False,
- custom_to_dart=False, conversion_includes=[]):
+ def __init__(self, idl_type, data):
self._idl_type = idl_type
- self._dart_type = dart_type
- self._native_type = native_type
- self._custom_to_native = custom_to_native
- self._custom_to_dart = custom_to_dart
- self._conversion_includes = conversion_includes + [idl_type]
+ for p in _idl_type_registry_properties:
+ self.__dict__['_' + p] = data.get(p, None)
Anton Muhin 2012/07/13 15:18:55 I wonder if it's semantically ok: when _-mangling
podivilov 2012/07/13 16:05:21 Done.
def idl_type(self):
return self._idl_type
@@ -586,7 +582,8 @@ class IDLTypeInfo(object):
return 'receiver->'
def conversion_includes(self):
- return ['"Dart%s.h"' % include for include in self._conversion_includes]
+ includes = [self._idl_type] + (self._conversion_includes or [])
+ return ['"Dart%s.h"' % include for include in includes]
def to_native_includes(self):
return ['"Dart%s.h"' % self.idl_type()]
@@ -598,9 +595,14 @@ class IDLTypeInfo(object):
return self._custom_to_dart
+class InterfaceIDLTypeInfo(IDLTypeInfo):
+ def __init__(self, idl_type, data):
+ super(InterfaceIDLTypeInfo, self).__init__(idl_type, data)
+
+
class SequenceIDLTypeInfo(IDLTypeInfo):
def __init__(self, idl_type, item_info):
- super(SequenceIDLTypeInfo, self).__init__(idl_type)
+ super(SequenceIDLTypeInfo, self).__init__(idl_type, {})
self._item_info = item_info
def dart_type(self):
@@ -614,8 +616,8 @@ class SequenceIDLTypeInfo(IDLTypeInfo):
class DOMStringArrayTypeInfo(SequenceIDLTypeInfo):
- def __init__(self):
- super(DOMStringArrayTypeInfo, self).__init__('DOMString[]', _dom_string_type_info)
+ def __init__(self, item_info):
+ super(DOMStringArrayTypeInfo, self).__init__('DOMString[]', item_info)
def emit_to_native(self, emitter, idl_node, name, handle, interface_name):
emitter.Emit(
@@ -632,13 +634,10 @@ class DOMStringArrayTypeInfo(SequenceIDLTypeInfo):
class PrimitiveIDLTypeInfo(IDLTypeInfo):
- def __init__(self, idl_type, dart_type, native_type=None,
- webcore_getter_name='getAttribute',
- webcore_setter_name='setAttribute'):
- super(PrimitiveIDLTypeInfo, self).__init__(idl_type, dart_type=dart_type,
- native_type=native_type)
- self._webcore_getter_name = webcore_getter_name
- self._webcore_setter_name = webcore_setter_name
+ def __init__(self, idl_type, data):
+ super(PrimitiveIDLTypeInfo, self).__init__(idl_type, data)
+ self._webcore_getter_name = data.get('webcore_getter_name', 'getAttribute')
+ self._webcore_setter_name = data.get('webcore_setter_name', 'setAttribute')
def emit_to_native(self, emitter, idl_node, name, handle, interface_name):
function_name = 'dartTo%s' % self._capitalized_native_type()
@@ -691,9 +690,8 @@ class PrimitiveIDLTypeInfo(IDLTypeInfo):
class SVGTearOffIDLTypeInfo(IDLTypeInfo):
- def __init__(self, idl_type, native_type=''):
- super(SVGTearOffIDLTypeInfo, self).__init__(idl_type,
- native_type=native_type)
+ def __init__(self, idl_type, data):
+ super(SVGTearOffIDLTypeInfo, self).__init__(idl_type, data)
def native_type(self):
if self._native_type:
@@ -725,88 +723,92 @@ class SVGTearOffIDLTypeInfo(IDLTypeInfo):
conversion_cast = conversion_cast % (self.native_type(), value)
return 'Dart%s::toDart(%s)' % (self._idl_type, conversion_cast)
-_dom_string_type_info = PrimitiveIDLTypeInfo(
- 'DOMString', dart_type='String', native_type='String')
+
+_idl_type_registry_properties = [
Anton Muhin 2012/07/13 15:18:55 as another option. class TypeData(object): def
podivilov 2012/07/13 16:05:21 Done.
+ 'dart_type',
+ 'native_type',
+ 'custom_to_native',
+ 'custom_to_dart',
+ 'conversion_includes'
+]
_idl_type_registry = {
- 'boolean': PrimitiveIDLTypeInfo('boolean', dart_type='bool', native_type='bool',
- webcore_getter_name='hasAttribute',
- webcore_setter_name='setBooleanAttribute'),
- 'byte': PrimitiveIDLTypeInfo('byte', dart_type='int', native_type='int'),
- 'octet': PrimitiveIDLTypeInfo('octet', dart_type='int', native_type='int'),
- 'short': PrimitiveIDLTypeInfo('short', dart_type='int', native_type='int'),
- 'unsigned short': PrimitiveIDLTypeInfo('unsigned short', dart_type='int',
- native_type='int'),
- 'int': PrimitiveIDLTypeInfo('int', dart_type='int'),
- 'unsigned int': PrimitiveIDLTypeInfo('unsigned int', dart_type='int',
- native_type='unsigned'),
- 'long': PrimitiveIDLTypeInfo('long', dart_type='int', native_type='int',
- webcore_getter_name='getIntegralAttribute',
- webcore_setter_name='setIntegralAttribute'),
- 'unsigned long': PrimitiveIDLTypeInfo('unsigned long', dart_type='int',
- native_type='unsigned',
- webcore_getter_name='getUnsignedIntegralAttribute',
- webcore_setter_name='setUnsignedIntegralAttribute'),
- 'long long': PrimitiveIDLTypeInfo('long long', dart_type='int'),
- 'unsigned long long': PrimitiveIDLTypeInfo('unsigned long long', dart_type='int'),
- 'float': PrimitiveIDLTypeInfo('float', dart_type='num', native_type='double'),
- 'double': PrimitiveIDLTypeInfo('double', dart_type='num'),
-
- 'any': PrimitiveIDLTypeInfo('any', dart_type='Object'),
- 'Array': PrimitiveIDLTypeInfo('Array', dart_type='List'),
- 'custom': PrimitiveIDLTypeInfo('custom', dart_type='Dynamic'),
- 'Date': PrimitiveIDLTypeInfo('Date', dart_type='Date', native_type='double'),
- 'DOMObject': PrimitiveIDLTypeInfo('DOMObject', dart_type='Object', native_type='ScriptValue'),
- 'DOMString': _dom_string_type_info,
+ 'boolean': { 'type': 'Primitive', 'dart_type': 'bool', 'native_type': 'bool',
+ 'webcore_getter_name': 'hasAttribute',
+ 'webcore_setter_name': 'setBooleanAttribute' },
+ 'byte': { 'type': 'Primitive', 'dart_type': 'int', 'native_type': 'int' },
+ 'octet': { 'type': 'Primitive', 'dart_type': 'int', 'native_type': 'int' },
+ 'short': { 'type': 'Primitive', 'dart_type': 'int', 'native_type': 'int' },
+ 'unsigned short': { 'type': 'Primitive', 'dart_type': 'int',
+ 'native_type': 'int' },
+ 'int': { 'type': 'Primitive', 'dart_type': 'int' },
+ 'unsigned int': { 'type': 'Primitive', 'dart_type': 'int', 'native_type': 'unsigned' },
+ 'long': { 'type': 'Primitive', 'dart_type': 'int', 'native_type': 'int',
+ 'webcore_getter_name': 'getIntegralAttribute',
+ 'webcore_setter_name': 'setIntegralAttribute' },
+ 'unsigned long': { 'type': 'Primitive', 'dart_type': 'int',
+ 'native_type': 'unsigned',
+ 'webcore_getter_name': 'getUnsignedIntegralAttribute',
+ 'webcore_setter_name': 'setUnsignedIntegralAttribute'},
+ 'long long': { 'type': 'Primitive', 'dart_type': 'int' },
+ 'unsigned long long': { 'type': 'Primitive', 'dart_type': 'int' },
+ 'float': { 'type': 'Primitive', 'dart_type': 'num', 'native_type': 'double' },
+ 'double': { 'type': 'Primitive', 'dart_type': 'num' },
+
+ 'any': { 'type': 'Primitive', 'dart_type': 'Object' },
+ 'Array': { 'type': 'Primitive', 'dart_type': 'List' },
+ 'custom': { 'type': 'Primitive', 'dart_type': 'Dynamic' },
+ 'Date': { 'type': 'Primitive', 'dart_type': 'Date', 'native_type': 'double' },
+ 'DOMObject': { 'type': 'Primitive', 'dart_type': 'Object', 'native_type': 'ScriptValue' },
+ 'DOMString': { 'type': 'Primitive', 'dart_type': 'String', 'native_type': 'String' },
# TODO(vsm): This won't actually work until we convert the Map to
# a native JS Map for JS DOM.
- 'Dictionary': PrimitiveIDLTypeInfo('Dictionary', dart_type='Map'),
+ 'Dictionary': { 'type': 'Primitive', 'dart_type': 'Map' },
# TODO(sra): Flags is really a dictionary: {create:bool, exclusive:bool}
# http://dev.w3.org/2009/dap/file-system/file-dir-sys.html#the-flags-interface
- 'Flags': PrimitiveIDLTypeInfo('Flags', dart_type='Object'),
- 'DOMTimeStamp': PrimitiveIDLTypeInfo('DOMTimeStamp', dart_type='int', native_type='unsigned long long'),
- 'object': PrimitiveIDLTypeInfo('object', dart_type='Object', native_type='ScriptValue'),
- 'PositionOptions': PrimitiveIDLTypeInfo('PositionOptions', dart_type='Object'),
+ 'Flags': { 'type': 'Primitive', 'dart_type': 'Object' },
+ 'DOMTimeStamp': { 'type': 'Primitive', 'dart_type': 'int', 'native_type': 'unsigned long long' },
+ 'object': { 'type': 'Primitive', 'dart_type': 'Object', 'native_type': 'ScriptValue' },
+ 'PositionOptions': { 'type': 'Primitive', 'dart_type': 'Object' },
# TODO(sra): Come up with some meaningful name so that where this appears in
# the documentation, the user is made aware that only a limited subset of
# serializable types are actually permitted.
- 'SerializedScriptValue': PrimitiveIDLTypeInfo('SerializedScriptValue', dart_type='Dynamic'),
+ 'SerializedScriptValue': { 'type': 'Primitive', 'dart_type': 'Dynamic' },
# TODO(sra): Flags is really a dictionary: {create:bool, exclusive:bool}
# http://dev.w3.org/2009/dap/file-system/file-dir-sys.html#the-flags-interface
- 'WebKitFlags': PrimitiveIDLTypeInfo('WebKitFlags', dart_type='Object'),
-
- 'sequence': PrimitiveIDLTypeInfo('sequence', dart_type='List'),
- 'void': PrimitiveIDLTypeInfo('void', dart_type='void'),
-
- 'CSSRule': IDLTypeInfo('CSSRule', conversion_includes=['CSSImportRule']),
- 'DOMException': IDLTypeInfo('DOMException', native_type='DOMCoreException'),
- 'DOMString[]': DOMStringArrayTypeInfo(),
- 'DOMStringList': IDLTypeInfo('DOMStringList', dart_type='List<String>', custom_to_native=True),
- 'DOMStringMap': IDLTypeInfo('DOMStringMap', dart_type='Map<String, String>'),
- 'DOMWindow': IDLTypeInfo('DOMWindow', custom_to_dart=True),
- 'Element': IDLTypeInfo('Element', custom_to_dart=True),
- 'EventListener': IDLTypeInfo('EventListener', custom_to_native=True),
- 'EventTarget': IDLTypeInfo('EventTarget', custom_to_native=True),
- 'HTMLElement': IDLTypeInfo('HTMLElement', custom_to_dart=True),
- 'IDBAny': IDLTypeInfo('IDBAny', dart_type='Dynamic', custom_to_native=True),
- 'IDBKey': IDLTypeInfo('IDBKey', dart_type='Dynamic', custom_to_native=True),
- 'StyleSheet': IDLTypeInfo('StyleSheet', conversion_includes=['CSSStyleSheet']),
- 'SVGElement': IDLTypeInfo('SVGElement', custom_to_dart=True),
-
- 'SVGAngle': SVGTearOffIDLTypeInfo('SVGAngle'),
- 'SVGLength': SVGTearOffIDLTypeInfo('SVGLength'),
- 'SVGLengthList': SVGTearOffIDLTypeInfo('SVGLengthList'),
- 'SVGMatrix': SVGTearOffIDLTypeInfo('SVGMatrix'),
- 'SVGNumber': SVGTearOffIDLTypeInfo('SVGNumber', native_type='SVGPropertyTearOff<float>'),
- 'SVGNumberList': SVGTearOffIDLTypeInfo('SVGNumberList'),
- 'SVGPathSegList': SVGTearOffIDLTypeInfo('SVGPathSegList', native_type='SVGPathSegListPropertyTearOff'),
- 'SVGPoint': SVGTearOffIDLTypeInfo('SVGPoint', native_type='SVGPropertyTearOff<FloatPoint>'),
- 'SVGPointList': SVGTearOffIDLTypeInfo('SVGPointList'),
- 'SVGPreserveAspectRatio': SVGTearOffIDLTypeInfo('SVGPreserveAspectRatio'),
- 'SVGRect': SVGTearOffIDLTypeInfo('SVGRect', native_type='SVGPropertyTearOff<FloatRect>'),
- 'SVGStringList': SVGTearOffIDLTypeInfo('SVGStringList', native_type='SVGStaticListPropertyTearOff<SVGStringList>'),
- 'SVGTransform': SVGTearOffIDLTypeInfo('SVGTransform'),
- 'SVGTransformList': SVGTearOffIDLTypeInfo('SVGTransformList', native_type='SVGTransformListPropertyTearOff')
+ 'WebKitFlags': { 'type': 'Primitive', 'dart_type': 'Object' },
+
+ 'sequence': { 'type': 'Primitive', 'dart_type': 'List' },
+ 'void': { 'type': 'Primitive', 'dart_type': 'void' },
+
+ 'CSSRule': { 'type': 'Interface', 'conversion_includes': ['CSSImportRule'] },
+ 'DOMException': { 'type': 'Interface', 'native_type': 'DOMCoreException' },
+ 'DOMStringList': { 'type': 'Interface', 'dart_type': 'List<String>', 'custom_to_native': True },
+ 'DOMStringMap': { 'type': 'Interface', 'dart_type': 'Map<String, String>' },
+ 'DOMWindow': { 'type': 'Interface', 'custom_to_dart': True },
+ 'Element': { 'type': 'Interface', 'custom_to_dart': True },
+ 'EventListener': { 'type': 'Interface', 'custom_to_native': True },
+ 'EventTarget': { 'type': 'Interface', 'custom_to_native': True },
+ 'HTMLElement': { 'type': 'Interface', 'custom_to_dart': True },
+ 'IDBAny': { 'type': 'Interface', 'dart_type': 'Dynamic', 'custom_to_native': True },
+ 'IDBKey': { 'type': 'Interface', 'dart_type': 'Dynamic', 'custom_to_native': True },
+ 'StyleSheet': { 'type': 'Interface', 'conversion_includes': ['CSSStyleSheet'] },
+ 'SVGElement': { 'type': 'Interface', 'custom_to_dart': True },
+
+ 'SVGAngle': { 'type': 'SVGTearOff' },
+ 'SVGLength': { 'type': 'SVGTearOff' },
+ 'SVGLengthList': { 'type': 'SVGTearOff' },
+ 'SVGMatrix': { 'type': 'SVGTearOff' },
+ 'SVGNumber': { 'type': 'SVGTearOff', 'native_type': 'SVGPropertyTearOff<float>' },
+ 'SVGNumberList': { 'type': 'SVGTearOff' },
+ 'SVGPathSegList': { 'type': 'SVGTearOff', 'native_type': 'SVGPathSegListPropertyTearOff' },
+ 'SVGPoint': { 'type': 'SVGTearOff', 'native_type': 'SVGPropertyTearOff<FloatPoint>' },
+ 'SVGPointList': { 'type': 'SVGTearOff' },
+ 'SVGPreserveAspectRatio': { 'type': 'SVGTearOff' },
+ 'SVGRect': { 'type': 'SVGTearOff', 'native_type': 'SVGPropertyTearOff<FloatRect>' },
+ 'SVGStringList': { 'type': 'SVGTearOff', 'native_type': 'SVGStaticListPropertyTearOff<SVGStringList>' },
+ 'SVGTransform': { 'type': 'SVGTearOff' },
+ 'SVGTransformList': { 'type': 'SVGTearOff', 'native_type': 'SVGTransformListPropertyTearOff' }
}
_svg_supplemental_includes = [
@@ -818,17 +820,23 @@ _svg_supplemental_includes = [
'"SVGPathSegListPropertyTearOff.h"',
]
-def GetIDLTypeInfo(idl_type_name):
- type_info = _idl_type_registry.get(idl_type_name)
- if type_info is not None:
- return type_info
-
- match = re.match(r'sequence<(\w+)>$', idl_type_name)
- if match:
- return SequenceIDLTypeInfo(idl_type_name, GetIDLTypeInfo(match.group(1)))
-
- match = re.match(r'(\w+)\[\]$', idl_type_name)
- if match:
- return SequenceIDLTypeInfo(idl_type_name, GetIDLTypeInfo(match.group(1)))
-
- return IDLTypeInfo(idl_type_name)
+class TypeRegistry(object):
+ def __init__(self):
+ self._cache = {}
+
+ def TypeInfo(self, type_name):
+ if not type_name in self._cache:
+ self._cache[type_name] = self._TypeInfo(type_name)
+ return self._cache[type_name]
+
+ def _TypeInfo(self, type_name):
+ match = re.match(r'(?:sequence<(\w+)>|(\w+)\[\])$', type_name)
+ if match:
+ if type_name == 'DOMString[]':
+ return DOMStringArrayTypeInfo(self.TypeInfo('DOMString'))
+ return SequenceIDLTypeInfo(type_name, self.TypeInfo(match.group(1) or match.group(2)))
+ if not type_name in _idl_type_registry:
+ return InterfaceIDLTypeInfo(type_name, {})
+ type_data = _idl_type_registry.get(type_name)
+ class_name = '%sIDLTypeInfo' % type_data['type']
+ return globals()[class_name](type_name, type_data)

Powered by Google App Engine
This is Rietveld 408576698