Chromium Code Reviews| Index: lib/html/scripts/systemhtml.py |
| diff --git a/lib/html/scripts/systemhtml.py b/lib/html/scripts/systemhtml.py |
| index 44553c421cc54213e73ba3e48cf7fc9eb6de8906..35f363b6897d0722621767e376f5125cf9247e30 100644 |
| --- a/lib/html/scripts/systemhtml.py |
| +++ b/lib/html/scripts/systemhtml.py |
| @@ -9,6 +9,7 @@ Dart:html APIs from the IDL database.""" |
| import emitter |
| import os |
| from generator import * |
| +from htmldartgenerator import * |
| _js_custom_members = set([ |
| 'AudioBufferSourceNode.start', |
| @@ -180,7 +181,7 @@ def EmitHtmlElementFactoryConstructors(emitter, infos, typename, class_name, |
| inits = emitter.Emit( |
| '\n' |
| ' static $RETURN_TYPE $CONSTRUCTOR($PARAMS) {\n' |
| - ' $CLASS _e = _document.$dom_createElement("$TAG");\n' |
| + ' $CLASS _e = document.$dom_createElement("$TAG");\n' |
| '$!INITS' |
| ' return _e;\n' |
| ' }\n', |
| @@ -231,11 +232,8 @@ class HtmlDartInterfaceGenerator(object): |
| def GenerateInterface(self): |
| interface_name = self._interface_type_info.interface_name() |
| - if (self._interface_type_info.has_generated_interface() and |
| - not self._interface_type_info.merged_into()): |
| - interface_emitter = self._library_emitter.FileEmitter(interface_name) |
| - else: |
| - interface_emitter = emitter.Emitter() |
| + # TODO: this is just tossing the interface, need to skip it completely. |
| + interface_emitter = emitter.Emitter() |
| template_file = 'interface_%s.darttemplate' % interface_name |
| interface_template = (self._template_loader.TryLoad(template_file) or |
| @@ -297,30 +295,44 @@ class HtmlDartInterfaceGenerator(object): |
| self._members_emitter, |
| self._top_level_emitter) = interface_emitter.Emit( |
| interface_template + '$!TOP_LEVEL', |
| - ID=interface_name, |
| + ID='_I%s' % interface_name, |
| EXTENDS=implements_str) |
| - self._type_comment_emitter.Emit("/// @domName $DOMNAME", |
| - DOMNAME=self._interface.doc_js_name) |
| - |
| implementation_emitter = self._ImplementationEmitter() |
| base_class = self._backend.RootClassName() |
| + base_type_info = None |
| + |
| if self._interface.parents: |
| supertype = self._interface.parents[0].type.id |
| if not IsDartCollectionType(supertype) and not IsPureInterface(supertype): |
| - type_info = self._type_registry.TypeInfo(supertype) |
| - if type_info.merged_into() and self._backend.ImplementsMergedMembers(): |
| - type_info = self._type_registry.TypeInfo(type_info.merged_into()) |
| - base_class = type_info.implementation_name() |
| + base_type_info = self._type_registry.TypeInfo(supertype) |
| + if base_type_info.merged_into() \ |
| + and self._backend.ImplementsMergedMembers(): |
| + base_type_info = self._type_registry.TypeInfo( |
| + base_type_info.merged_into()) |
| + base_class = base_type_info.implementation_name() |
|
Anton Muhin
2012/11/02 12:55:47
looks like base_class initialization should be mov
blois
2012/11/02 19:25:28
Done.
|
| + |
| + implements = self._backend.AdditionalImplementedInterfaces() |
| + |
|
Anton Muhin
2012/11/02 12:55:47
nit: no blank line
blois
2012/11/02 19:25:28
Done.
|
| + for parent in self._interface.parents: |
| + parent_type_info = self._type_registry.TypeInfo(parent.type.id) |
| + if parent_type_info != base_type_info: |
| + implements.append(parent_type_info.interface_name()) |
| + |
| + if interface_name in _secure_base_types: |
| + implements.append(_secure_base_types[interface_name]) |
| + |
| + implements_str = '' |
| + if implements: |
| + implements_str += ' implements ' + ', '.join(set(implements)) |
|
Anton Muhin
2012/11/02 12:55:47
nit: no need in +=
blois
2012/11/02 19:25:28
Done.
|
| - implemented_interfaces = [interface_name] +\ |
| - self._backend.AdditionalImplementedInterfaces() |
| self._implementation_members_emitter = implementation_emitter.Emit( |
| self._backend.ImplementationTemplate(), |
| CLASSNAME=self._interface_type_info.implementation_name(), |
| EXTENDS=' extends %s' % base_class if base_class else '', |
| - IMPLEMENTS=' implements ' + ', '.join(implemented_interfaces), |
| + IMPLEMENTS=implements_str, |
| + DOMNAME=self._interface.doc_js_name, |
| NATIVESPEC=self._backend.NativeSpec()) |
| self._backend.StartInterface(self._implementation_members_emitter) |
| @@ -328,13 +340,17 @@ class HtmlDartInterfaceGenerator(object): |
| constructor_info.GenerateFactoryInvocation( |
| self._DartType, self._members_emitter, factory_provider) |
| - element_type = None |
| + self._backend.AddConstructors(constructors, factory_provider, |
| + self._interface_type_info.implementation_name(), |
| + base_class) |
| + |
| + typed_array_type = None |
| for interface in self._database.Hierarchy(self._interface): |
| type_info = self._type_registry.TypeInfo(interface.id) |
| if type_info.is_typed_array(): |
| - element_type = type_info.list_item_type() |
| + typed_array_type = type_info.list_item_type() |
| break |
| - if element_type: |
| + if typed_array_type: |
| self._members_emitter.Emit( |
| '\n' |
| ' factory $CTOR(int length) =>\n' |
| @@ -346,7 +362,7 @@ class HtmlDartInterfaceGenerator(object): |
| ' factory $CTOR.fromBuffer(ArrayBuffer buffer, [int byteOffset, int length]) => \n' |
| ' $FACTORY.create$(CTOR)_fromBuffer(buffer, byteOffset, length);\n', |
| CTOR=self._interface.id, |
| - TYPE=self._DartType(element_type), |
| + TYPE=self._DartType(typed_array_type), |
| FACTORY=factory_provider) |
| events_interface = self._event_generator.ProcessInterface( |
| @@ -354,7 +370,7 @@ class HtmlDartInterfaceGenerator(object): |
| self._backend.CustomJSMembers(), |
| interface_emitter, implementation_emitter) |
| if events_interface: |
| - self._EmitEventGetter(events_interface, '_%sImpl' % events_interface) |
| + self._EmitEventGetter(events_interface, events_interface) |
| old_backend = self._backend |
| if not self._backend.ImplementsMergedMembers(): |
| @@ -523,15 +539,15 @@ class HtmlDartInterfaceGenerator(object): |
| TYPE=type, |
| VALUE=constant.value) |
| + self._backend.AddConstant(constant) |
| + |
| def _ImplementationEmitter(self): |
| - if IsPureInterface(self._interface.id): |
| - return emitter.Emitter() |
| basename = self._interface_type_info.implementation_name() |
| if (self._interface_type_info.merged_into() and |
| self._backend.ImplementsMergedMembers()): |
| # Merged members are implemented in target interface implementation. |
| return emitter.Emitter() |
| - return self._library_emitter.FileEmitter(basename.lstrip('_')) |
| + return self._library_emitter.FileEmitter(basename) |
| def _EmitEventGetter(self, events_interface, events_class): |
| self._members_emitter.Emit( |
| @@ -543,6 +559,10 @@ class HtmlDartInterfaceGenerator(object): |
| TYPE=events_interface) |
| self._implementation_members_emitter.Emit( |
| + '\n /**' |
|
Anton Muhin
2012/11/02 12:55:47
debugging?
blois
2012/11/02 19:25:28
The dartdoc comment? I believe this used for doc g
|
| + '\n * @domName EventTarget.addEventListener, ' |
| + 'EventTarget.removeEventListener, EventTarget.dispatchEvent' |
| + '\n */' |
| '\n $TYPE get on =>\n new $TYPE(this);\n', |
| TYPE=events_class) |
| @@ -593,16 +613,18 @@ class HtmlGeneratorDummyBackend(object): |
| # ------------------------------------------------------------------------------ |
| -class Dart2JSBackend(object): |
| +class Dart2JSBackend(HtmlDartGenerator): |
| """Generates a dart2js class for the dart:html library from a DOM IDL |
| interface. |
| """ |
| def __init__(self, interface, options): |
| - self._interface = interface |
| + super(Dart2JSBackend, self).__init__(interface, options) |
| + |
| self._database = options.database |
| self._template_loader = options.templates |
| self._type_registry = options.type_registry |
| + self._renamer = options.renamer |
| self._interface_type_info = self._type_registry.TypeInfo(self._interface.id) |
| self._current_secondary_parent = None |
| @@ -616,11 +638,7 @@ class Dart2JSBackend(object): |
| return None |
| def AdditionalImplementedInterfaces(self): |
| - # TODO: Include all implemented interfaces, including other Lists. |
| - implements = [] |
| - if self._interface_type_info.is_typed_array(): |
| - element_type = self._interface_type_info.list_item_type() |
| - implements.append('List<%s>' % self._DartType(element_type)) |
| + implements = super(Dart2JSBackend, self).AdditionalImplementedInterfaces() |
| if self._interface_type_info.list_item_type(): |
| implements.append('JavaScriptIndexingBehavior') |
| return implements |
| @@ -630,6 +648,9 @@ class Dart2JSBackend(object): |
| return ' native "%s"' % native_spec |
| def ImplementationTemplate(self): |
| + if IsPureInterface(self._interface.id): |
| + return self._template_loader.Load('pure_interface.darttemplate') |
| + |
| template_file = ('impl_%s.darttemplate' % |
| self._interface_type_info.interface_name()) |
| return (self._template_loader.TryLoad(template_file) or |
| @@ -722,6 +743,10 @@ class Dart2JSBackend(object): |
| if self._HasCustomImplementation(attribute.id): |
| return |
| + if IsPureInterface(self._interface.id): |
| + self._AddInterfaceAttribute(attribute) |
| + return |
| + |
| if attribute.id != html_name: |
| self._AddAttributeUsingProperties(attribute, html_name, read_only) |
| return |
| @@ -760,6 +785,7 @@ class Dart2JSBackend(object): |
| output_type = self._NarrowOutputType(attribute.type.id) |
| input_type = self._NarrowInputType(attribute.type.id) |
| + self.EmitAttributeDocumentation(attribute) |
| if not read_only: |
| self._members_emitter.Emit( |
| '\n $TYPE $NAME;' |
| @@ -778,7 +804,16 @@ class Dart2JSBackend(object): |
| if not read_only: |
| self._AddRenamingSetter(attribute, html_name) |
| + def _AddInterfaceAttribute(self, attribute): |
| + self._members_emitter.Emit( |
| + '\n $TYPE $NAME;' |
| + '\n', |
| + NAME=DartDomNameOfAttribute(attribute), |
| + TYPE=self._NarrowOutputType(attribute.type.id)) |
| + |
| def _AddRenamingGetter(self, attr, html_name): |
| + self.EmitAttributeDocumentation(attr) |
| + |
| conversion = self._OutputConversion(attr.type.id, attr.id) |
| if conversion: |
| return self._AddConvertingGetter(attr, html_name, conversion) |
| @@ -792,6 +827,8 @@ class Dart2JSBackend(object): |
| TYPE=return_type) |
| def _AddRenamingSetter(self, attr, html_name): |
| + self.EmitAttributeDocumentation(attr) |
| + |
| conversion = self._InputConversion(attr.type.id, attr.id) |
| if conversion: |
| return self._AddConvertingSetter(attr, html_name, conversion) |
| @@ -845,8 +882,14 @@ class Dart2JSBackend(object): |
| if self._HasCustomImplementation(info.name): |
| return |
| - # Any conversions needed? |
| - if any(self._OperationRequiresConversions(op) for op in info.overloads): |
| + self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', |
|
Anton Muhin
2012/11/02 12:55:47
a helper like EmitAttributeDocumentation?
blois
2012/11/02 19:25:28
Done, but because of how the dartium code is curre
|
| + DOMINTERFACE=info.overloads[0].doc_js_interface_name, |
| + DOMNAME=info.name) |
| + |
| + if IsPureInterface(self._interface.id): |
| + self._AddInterfaceOperation(info, html_name) |
| + elif any(self._OperationRequiresConversions(op) for op in info.overloads): |
| + # Any conversions needed? |
| self._AddOperationWithConversions(info, html_name) |
| else: |
| self._AddDirectNativeOperation(info, html_name) |
| @@ -1015,6 +1058,20 @@ class Dart2JSBackend(object): |
| argument_count = position |
| GenerateCall(operation, argument_count, []) |
| + def _AddInterfaceOperation(self, info, html_name): |
| + self._members_emitter.Emit( |
| + '\n' |
| + ' $TYPE $NAME($PARAMS);\n', |
| + TYPE=self._NarrowOutputType(info.type_name), |
| + NAME=info.name, |
| + PARAMS=info.ParametersDeclaration(self._NarrowInputType)) |
| + |
| + def AddConstant(self, constant): |
| + type = TypeOrNothing(self._DartType(constant.type.id), constant.type.id) |
| + self._members_emitter.Emit('\n static const $TYPE$NAME = $VALUE;\n', |
| + NAME=constant.id, |
| + TYPE=type, |
| + VALUE=constant.value) |
| def _IsOptional(self, operation, argument): |
| return IsOptional(argument) |
| @@ -1052,8 +1109,7 @@ class Dart2JSBackend(object): |
| return self._NarrowToImplementationType(type_name) |
| def _NarrowOutputType(self, type_name): |
| - secure_name = SecureOutputType(self, type_name, True) |
| - return self._NarrowToImplementationType(secure_name) |
| + return SecureOutputType(self, type_name) |
| def _FindShadowedAttribute(self, attr): |
| """Returns (attribute, superinterface) or (None, None).""" |