| Index: lib/dom/scripts/generator.py
|
| diff --git a/lib/dom/scripts/generator.py b/lib/dom/scripts/generator.py
|
| index 65b87e08714d45edf337e1a52eee606965a44d9b..a4533a5806c76f221036411ac3c5a3cdeb404e0a 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].clazz == '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,25 +492,18 @@ 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]
|
| + self._data = data
|
|
|
| def idl_type(self):
|
| return self._idl_type
|
|
|
| def dart_type(self):
|
| - return self._dart_type or self._idl_type
|
| + return self._data.dart_type or self._idl_type
|
|
|
| def native_type(self):
|
| - return self._native_type or self._idl_type
|
| + return self._data.native_type or self._idl_type
|
|
|
| def emit_to_native(self, emitter, idl_node, name, handle, interface_name):
|
| if 'Callback' in idl_node.ext_attrs:
|
| @@ -548,7 +543,7 @@ class IDLTypeInfo(object):
|
| return argument
|
|
|
| def custom_to_native(self):
|
| - return self._custom_to_native
|
| + return self._data.custom_to_native
|
|
|
| def parameter_type(self):
|
| return '%s*' % self.native_type()
|
| @@ -586,7 +581,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._data.conversion_includes or [])
|
| + return ['"Dart%s.h"' % include for include in includes]
|
|
|
| def to_native_includes(self):
|
| return ['"Dart%s.h"' % self.idl_type()]
|
| @@ -595,12 +591,17 @@ class IDLTypeInfo(object):
|
| return 'Dart%s::toDart(%s)' % (self._idl_type, value)
|
|
|
| def custom_to_dart(self):
|
| - return self._custom_to_dart
|
| + return self._data.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 +615,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 +633,8 @@ 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)
|
|
|
| def emit_to_native(self, emitter, idl_node, name, handle, interface_name):
|
| function_name = 'dartTo%s' % self._capitalized_native_type()
|
| @@ -681,23 +677,22 @@ class PrimitiveIDLTypeInfo(IDLTypeInfo):
|
| return '%s(%s)' % (function_name, ', '.join(conversion_arguments))
|
|
|
| def webcore_getter_name(self):
|
| - return self._webcore_getter_name
|
| + return self._data.webcore_getter_name
|
|
|
| def webcore_setter_name(self):
|
| - return self._webcore_setter_name
|
| + return self._data.webcore_setter_name
|
|
|
| def _capitalized_native_type(self):
|
| return re.sub(r'(^| )([a-z])', lambda x: x.group(2).upper(), self.native_type())
|
|
|
|
|
| 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:
|
| - return self._native_type
|
| + if self._data.native_type:
|
| + return self._data.native_type
|
| tear_off_type = 'SVGPropertyTearOff'
|
| if self._idl_type.endswith('List'):
|
| tear_off_type = 'SVGListPropertyTearOff'
|
| @@ -723,90 +718,103 @@ class SVGTearOffIDLTypeInfo(IDLTypeInfo):
|
| else:
|
| conversion_cast = 'static_cast<%s*>(%s)'
|
| conversion_cast = conversion_cast % (self.native_type(), value)
|
| - return 'Dart%s::toDart(%s)' % (self._idl_type, conversion_cast)
|
| + return 'Dart%s::toDart(%s)' % (self._idl_type, conversion_cast)
|
| +
|
| +
|
| +class TypeData(object):
|
| + def __init__(self, clazz, dart_type=None, native_type=None,
|
| + custom_to_dart=None, custom_to_native=None,
|
| + conversion_includes=None,
|
| + webcore_getter_name='getAttribute',
|
| + webcore_setter_name='setAttribute'):
|
| + self.clazz = clazz
|
| + self.dart_type = dart_type
|
| + self.native_type = native_type
|
| + self.custom_to_dart = custom_to_dart
|
| + self.custom_to_native = custom_to_native
|
| + self.conversion_includes = conversion_includes
|
| + self.webcore_getter_name = webcore_getter_name
|
| + self.webcore_setter_name = webcore_setter_name
|
|
|
| -_dom_string_type_info = PrimitiveIDLTypeInfo(
|
| - 'DOMString', dart_type='String', native_type='String')
|
|
|
| _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',
|
| + 'boolean': TypeData(clazz='Primitive', dart_type='bool', native_type='bool',
|
| + webcore_getter_name='hasAttribute',
|
| + webcore_setter_name='setBooleanAttribute'),
|
| + 'byte': TypeData(clazz='Primitive', dart_type='int', native_type='int'),
|
| + 'octet': TypeData(clazz='Primitive', dart_type='int', native_type='int'),
|
| + 'short': TypeData(clazz='Primitive', dart_type='int', native_type='int'),
|
| + 'unsigned short': TypeData(clazz='Primitive', dart_type='int',
|
| native_type='int'),
|
| - 'int': PrimitiveIDLTypeInfo('int', dart_type='int'),
|
| - 'unsigned int': PrimitiveIDLTypeInfo('unsigned int', dart_type='int',
|
| + 'int': TypeData(clazz='Primitive', dart_type='int'),
|
| + 'unsigned int': TypeData(clazz='Primitive', dart_type='int',
|
| native_type='unsigned'),
|
| - 'long': PrimitiveIDLTypeInfo('long', dart_type='int', native_type='int',
|
| + 'long': TypeData(clazz='Primitive', 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,
|
| + 'unsigned long': TypeData(clazz='Primitive', dart_type='int',
|
| + native_type='unsigned',
|
| + webcore_getter_name='getUnsignedIntegralAttribute',
|
| + webcore_setter_name='setUnsignedIntegralAttribute'),
|
| + 'long long': TypeData(clazz='Primitive', dart_type='int'),
|
| + 'unsigned long long': TypeData(clazz='Primitive', dart_type='int'),
|
| + 'float': TypeData(clazz='Primitive', dart_type='num', native_type='double'),
|
| + 'double': TypeData(clazz='Primitive', dart_type='num'),
|
| +
|
| + 'any': TypeData(clazz='Primitive', dart_type='Object'),
|
| + 'Array': TypeData(clazz='Primitive', dart_type='List'),
|
| + 'custom': TypeData(clazz='Primitive', dart_type='Dynamic'),
|
| + 'Date': TypeData(clazz='Primitive', dart_type='Date', native_type='double'),
|
| + 'DOMObject': TypeData(clazz='Primitive', dart_type='Object', native_type='ScriptValue'),
|
| + 'DOMString': TypeData(clazz='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': TypeData(clazz='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': TypeData(clazz='Primitive', dart_type='Object'),
|
| + 'DOMTimeStamp': TypeData(clazz='Primitive', dart_type='int', native_type='unsigned long long'),
|
| + 'object': TypeData(clazz='Primitive', dart_type='Object', native_type='ScriptValue'),
|
| + 'PositionOptions': TypeData(clazz='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': TypeData(clazz='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': TypeData(clazz='Primitive', dart_type='Object'),
|
| +
|
| + 'sequence': TypeData(clazz='Primitive', dart_type='List'),
|
| + 'void': TypeData(clazz='Primitive', dart_type='void'),
|
| +
|
| + 'CSSRule': TypeData(clazz='Interface', conversion_includes=['CSSImportRule']),
|
| + 'DOMException': TypeData(clazz='Interface', native_type='DOMCoreException'),
|
| + 'DOMStringList': TypeData(clazz='Interface', dart_type='List<String>', custom_to_native=True),
|
| + 'DOMStringMap': TypeData(clazz='Interface', dart_type='Map<String, String>'),
|
| + 'DOMWindow': TypeData(clazz='Interface', custom_to_dart=True),
|
| + 'Element': TypeData(clazz='Interface', custom_to_dart=True),
|
| + 'EventListener': TypeData(clazz='Interface', custom_to_native=True),
|
| + 'EventTarget': TypeData(clazz='Interface', custom_to_native=True),
|
| + 'HTMLElement': TypeData(clazz='Interface', custom_to_dart=True),
|
| + 'IDBAny': TypeData(clazz='Interface', dart_type='Dynamic', custom_to_native=True),
|
| + 'IDBKey': TypeData(clazz='Interface', dart_type='Dynamic', custom_to_native=True),
|
| + 'StyleSheet': TypeData(clazz='Interface', conversion_includes=['CSSStyleSheet']),
|
| + 'SVGElement': TypeData(clazz='Interface', custom_to_dart=True),
|
| +
|
| + 'SVGAngle': TypeData(clazz='SVGTearOff'),
|
| + 'SVGLength': TypeData(clazz='SVGTearOff'),
|
| + 'SVGLengthList': TypeData(clazz='SVGTearOff'),
|
| + 'SVGMatrix': TypeData(clazz='SVGTearOff'),
|
| + 'SVGNumber': TypeData(clazz='SVGTearOff', native_type='SVGPropertyTearOff<float>'),
|
| + 'SVGNumberList': TypeData(clazz='SVGTearOff'),
|
| + 'SVGPathSegList': TypeData(clazz='SVGTearOff', native_type='SVGPathSegListPropertyTearOff'),
|
| + 'SVGPoint': TypeData(clazz='SVGTearOff', native_type='SVGPropertyTearOff<FloatPoint>'),
|
| + 'SVGPointList': TypeData(clazz='SVGTearOff'),
|
| + 'SVGPreserveAspectRatio': TypeData(clazz='SVGTearOff'),
|
| + 'SVGRect': TypeData(clazz='SVGTearOff', native_type='SVGPropertyTearOff<FloatRect>'),
|
| + 'SVGStringList': TypeData(clazz='SVGTearOff', native_type='SVGStaticListPropertyTearOff<SVGStringList>'),
|
| + 'SVGTransform': TypeData(clazz='SVGTearOff'),
|
| + 'SVGTransformList': TypeData(clazz='SVGTearOff', native_type='SVGTransformListPropertyTearOff')
|
| }
|
|
|
| _svg_supplemental_includes = [
|
| @@ -818,17 +826,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, TypeData('Interface'))
|
| + type_data = _idl_type_registry.get(type_name)
|
| + class_name = '%sIDLTypeInfo' % type_data.clazz
|
| + return globals()[class_name](type_name, type_data)
|
|
|