Chromium Code Reviews| Index: client/dom/scripts/dartgenerator.py |
| diff --git a/client/dom/scripts/dartgenerator.py b/client/dom/scripts/dartgenerator.py |
| index 2ee96e18de573cb33dfca8b746274d5c00143dea..d0cd539e694c058a4a24ec2b0d78025c0d2929e9 100755 |
| --- a/client/dom/scripts/dartgenerator.py |
| +++ b/client/dom/scripts/dartgenerator.py |
| @@ -490,18 +490,11 @@ class DartGenerator(object): |
| for generator in generators: |
| generator.AddConstant(const) |
| - for attr in sorted(interface.attributes, AttributeOutputOrder): |
| - if attr.type.id == 'EventListener': |
| - # Remove EventListener attributes like 'onclick' when addEventListener |
| - # is available. |
| - if 'EventTarget' in self._AllImplementedInterfaces(interface): |
| - continue |
| - if attr.is_fc_getter: |
| - for generator in generators: |
| - generator.AddGetter(attr) |
| - elif attr.is_fc_setter: |
| - for generator in generators: |
| - generator.AddSetter(attr) |
| + attributes = [attr for attr in interface.attributes |
| + if not self._OmitAttribute(interface, attr)] |
| + for (getter, setter) in _PairUpAttributes(attributes): |
| + for generator in generators: |
| + generator.AddAttribute(getter, setter) |
| # The implementation should define an indexer if the interface directly |
| # extends List. |
| @@ -532,16 +525,11 @@ class DartGenerator(object): |
| for parent_interface in self._TransitiveSecondaryParents(interface): |
| if isinstance(parent_interface, str): # _IsDartCollectionType(parent_interface) |
| continue |
| - attributes = sorted(parent_interface.attributes, |
| - AttributeOutputOrder) |
| - for attr in attributes: |
| - if not self._DefinesSameAttribute(interface, attr): |
| - if attr.is_fc_getter: |
| - for generator in generators: |
| - generator.AddSecondaryGetter(parent_interface, attr) |
| - elif attr.is_fc_setter: |
| - for generator in generators: |
| - generator.AddSecondarySetter(parent_interface, attr) |
| + attributes = [attr for attr in parent_interface.attributes |
| + if not self._DefinesSameAttribute(interface, attr)] |
| + for (getter, setter) in _PairUpAttributes(attributes): |
| + for generator in generators: |
| + generator.AddSecondaryAttribute(parent_interface, getter, setter) |
| # Group overloaded operations by id |
| operationsById = {} |
| @@ -562,6 +550,14 @@ class DartGenerator(object): |
| generator.FinishInterface() |
| return |
| + def _OmitAttribute(self, interface, attr): |
| + # Remove EventListener attributes like 'onclick' when addEventListener |
| + # is available. |
| + if attr.type.id == 'EventListener': |
| + if 'EventTarget' in self._AllImplementedInterfaces(interface): |
| + return True |
| + return False |
| + |
| def _DefinesSameAttribute(self, interface, attr1): |
| return any(attr1.id == attr2.id |
| and attr1.is_fc_getter == attr2.is_fc_getter |
| @@ -636,6 +632,22 @@ def _RecognizeCallback(interface): |
| return _AnalyzeOperation(interface, handlers) |
| +def _PairUpAttributes(attributes): |
| + """Returns a list of (getter, setter) pairs sorted by name. |
| + |
| + One element of the pair may be None. |
| + """ |
| + names = sorted(set(attr.id for attr in attributes)) |
| + getters = {} |
| + setters = {} |
| + for attr in attributes: |
| + if attr.is_fc_getter: |
| + getters[attr.id] = attr |
| + elif attr.is_fc_setter: |
| + setters[attr.id] = attr |
| + return [(getters.get(id), setters.get(id)) for id in names] |
| + |
| + |
| def _AnalyzeOperation(interface, operations): |
| """Makes operation calling convention decision for a set of overloads. |
| @@ -1237,13 +1249,13 @@ class DartInterfaceGenerator(object): |
| TYPE=constant.type.id, |
| VALUE=constant.value) |
| - def AddGetter(self, attr): |
| - self._members_emitter.Emit('\n $TYPE get $NAME();\n', |
| - NAME=attr.id, TYPE=attr.type.id) |
| - |
| - def AddSetter(self, attr): |
| - self._members_emitter.Emit('\n void set $NAME($TYPE value);\n', |
| - NAME=attr.id, TYPE=attr.type.id) |
| + def AddAttribute(self, getter, setter): |
| + if getter: |
| + self._members_emitter.Emit('\n $TYPE get $NAME();\n', |
| + NAME=getter.id, TYPE=getter.type.id) |
| + if setter: |
| + self._members_emitter.Emit('\n void set $NAME($TYPE value);\n', |
| + NAME=setter.id, TYPE=setter.type.id) |
| def AddIndexer(self, element_type): |
| # Interface inherits all operations from List<element_type>. |
| @@ -1262,10 +1274,9 @@ class DartInterfaceGenerator(object): |
| PARAMS=info.ParametersInterfaceDeclaration()) |
| # Interfaces get secondary members directly via the superinterfaces. |
| - def AddSecondaryGetter(self, interface, attr): |
| - pass |
| - def AddSecondarySetter(self, interface, attr): |
| + def AddSecondaryAttribute(self, interface, getter, setter): |
| pass |
| + |
| def AddSecondaryOperation(self, interface, attr): |
| pass |
| @@ -1381,7 +1392,13 @@ class WrappingInterfaceGenerator(object): |
| method_name = method_name + '_' + self._interface.id |
| return method_name |
| - def AddGetter(self, attr): |
| + def AddAttribute(self, getter, setter): |
| + if getter: |
| + self._AddGetter(getter) |
| + if setter: |
| + self._AddSetter(setter) |
| + |
| + def _AddGetter(self, attr): |
| # FIXME: Instead of injecting the interface name into the method when it is |
| # also implemented in the base class, suppress the method altogether if it |
| # has the same signature. I.e., let the JS do the virtual dispatch instead. |
| @@ -1404,7 +1421,7 @@ class WrappingInterfaceGenerator(object): |
| CLASS=self._class_name, NAME=attr.id, METHOD=method_name) |
| self._externs.add((self._interface.id, attr.id, 'attribute')) |
| - def AddSetter(self, attr): |
| + def _AddSetter(self, attr): |
| # FIXME: See comment on getter. |
| method_name = self._MethodName('_set_', attr.id) |
| self._members_emitter.Emit( |
| @@ -1424,13 +1441,9 @@ class WrappingInterfaceGenerator(object): |
| CLASS=self._class_name, NAME=attr.id, METHOD=method_name) |
| self._externs.add((self._interface.id, attr.id, 'attribute')) |
| - def AddSecondaryGetter(self, interface, attr): |
| + def AddSecondaryAttribute(self, interface, getter, setter): |
| self._SecondaryContext(interface) |
| - self.AddGetter(attr) |
| - |
| - def AddSecondarySetter(self, interface, attr): |
| - self._SecondaryContext(interface) |
| - self.AddSetter(attr) |
| + self.AddAttribute(getter, setter) |
| def AddSecondaryOperation(self, interface, info): |
| self._SecondaryContext(interface) |
| @@ -1964,25 +1977,41 @@ class FrogInterfaceGenerator(object): |
| pass |
| - def AddGetter(self, attr): |
| + def AddAttribute(self, getter, setter): |
| + use_fields = True |
| + output_type = getter and self._NarrowOutputType(getter.type.id) |
| + input_type = setter and self._NarrowInputType(setter.type.id) |
| + if use_fields and getter and setter: |
| + if input_type == output_type: |
| + self._members_emitter.Emit( |
| + '\n $TYPE $NAME;\n', |
| + NAME=getter.id, TYPE=output_type) |
| + return |
| + if use_fields and getter and not setter: |
| + self._members_emitter.Emit( |
| + '\n final $TYPE $NAME;\n', |
| + NAME=getter.id, TYPE=output_type) |
| + return |
| + if getter: |
|
vsm
2012/02/06 18:37:18
Do we ever fall past this?
|
| + self._AddGetter(getter) |
| + if setter: |
| + self._AddSetter(setter) |
| + |
| + def _AddGetter(self, attr): |
| # TODO(sra): Remove native body when Issue 829 fixed. |
| self._members_emitter.Emit( |
| '\n $TYPE get $NAME() native "return this.$NAME;";\n', |
| NAME=attr.id, TYPE=self._NarrowOutputType(attr.type.id)) |
| - def AddSetter(self, attr): |
| + def _AddSetter(self, attr): |
| # TODO(sra): Remove native body when Issue 829 fixed. |
| self._members_emitter.Emit( |
| '\n void set $NAME($TYPE value) native "this.$NAME = value;";\n', |
| NAME=attr.id, TYPE=self._NarrowInputType(attr.type.id)) |
| - def AddSecondaryGetter(self, interface, attr): |
| + def AddSecondaryAttribute(self, interface, getter, setter): |
| self._SecondaryContext(interface) |
| - self.AddGetter(attr) |
| - |
| - def AddSecondarySetter(self, interface, attr): |
| - self._SecondaryContext(interface) |
| - self.AddSetter(attr) |
| + self.AddAttribute(getter, setter) |
| def AddSecondaryOperation(self, interface, info): |
| self._SecondaryContext(interface) |
| @@ -2183,13 +2212,19 @@ class NativeImplementationGenerator(WrappingInterfaceGenerator): |
| CLASS=self._class_name, BASE=base, INTERFACE=interface_name, |
| MEMBERS=self._members_emitter.Fragments()) |
| - def AddGetter(self, attr): |
| + def AddAttribute(self, getter, setter): |
| + if getter: |
| + self._AddGetter(getter) |
| + if setter: |
| + self._AddSetter(setter) |
| + |
| + def _AddGetter(self, attr): |
| self._members_emitter.Emit( |
| '\n' |
| ' $TYPE get $NAME() native "$(INTERFACE)_$(NAME)_Getter";\n', |
| NAME=attr.id, TYPE=attr.type.id, INTERFACE=self._interface.id) |
| - def AddSetter(self, attr): |
| + def _AddSetter(self, attr): |
| self._members_emitter.Emit( |
| '\n' |
| ' void set $NAME($TYPE) native "$(INTERFACE)_$(NAME)_Setter";\n', |