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

Unified Diff: lib/html/scripts/systemhtml.py

Issue 11365019: Merging dart:html interfaces and implementations (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Adding generated files. Created 8 years, 1 month 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/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)."""

Powered by Google App Engine
This is Rietveld 408576698