| Index: client/dom/scripts/dartgenerator.py
|
| diff --git a/client/dom/scripts/dartgenerator.py b/client/dom/scripts/dartgenerator.py
|
| index 1170444b0eca3ee6dd0dd1f2f822db9a3515c7ca..76084e92062b99ab2d0f39675ccf798a332080cd 100755
|
| --- a/client/dom/scripts/dartgenerator.py
|
| +++ b/client/dom/scripts/dartgenerator.py
|
| @@ -575,7 +575,7 @@ class DartGenerator(object):
|
| if isinstance(parent_interface, str): # _IsDartCollectionType(parent_interface)
|
| continue
|
| attributes = [attr for attr in parent_interface.attributes
|
| - if not self._DefinesSameAttribute(interface, attr)]
|
| + if not _FindMatchingAttribute(interface, attr)]
|
| for (getter, setter) in _PairUpAttributes(attributes):
|
| for generator in generators:
|
| generator.AddSecondaryAttribute(parent_interface, getter, setter)
|
| @@ -607,12 +607,6 @@ class DartGenerator(object):
|
| return True
|
| return False
|
|
|
| - def _DefinesSameAttribute(self, interface, attr1):
|
| - return any(attr1.id == attr2.id
|
| - and attr1.is_fc_getter == attr2.is_fc_getter
|
| - and attr1.is_fc_setter == attr2.is_fc_setter
|
| - for attr2 in interface.attributes)
|
| -
|
| def _TransitiveSecondaryParents(self, interface):
|
| """Returns a list of all non-primary parents.
|
|
|
| @@ -712,6 +706,17 @@ def _PairUpAttributes(attributes):
|
| return [(getters.get(id), setters.get(id)) for id in names]
|
|
|
|
|
| +def _FindMatchingAttribute(interface, attr1):
|
| + matches = [attr2 for attr2 in interface.attributes
|
| + if attr1.id == attr2.id
|
| + and attr1.is_fc_getter == attr2.is_fc_getter
|
| + and attr1.is_fc_setter == attr2.is_fc_setter]
|
| + if matches:
|
| + assert len(matches) == 1
|
| + return matches[0]
|
| + return None
|
| +
|
| +
|
| def _AnalyzeOperation(interface, operations):
|
| """Makes operation calling convention decision for a set of overloads.
|
|
|
| @@ -2072,6 +2077,28 @@ class FrogInterfaceGenerator(object):
|
| def AddAttribute(self, getter, setter):
|
| output_type = getter and self._NarrowOutputType(getter.type.id)
|
| input_type = setter and self._NarrowInputType(setter.type.id)
|
| +
|
| + # If the (getter, setter) pair is shadowing, we can't generate a shadowing
|
| + # field (Issue 1633).
|
| + (super_getter, super_getter_interface) = self._FindShadowedAttribute(getter)
|
| + (super_setter, super_setter_interface) = self._FindShadowedAttribute(setter)
|
| + if super_getter or super_setter:
|
| + if getter and not setter and super_getter and not super_setter:
|
| + if getter.type.id == super_getter.type.id:
|
| + # Compatible getter, use the superclass property. This works because
|
| + # JavaScript will do its own dynamic dispatch.
|
| + self._members_emitter.Emit(
|
| + '\n'
|
| + ' // Use implementation from $SUPER.\n'
|
| + ' // final $TYPE $NAME;\n',
|
| + SUPER=super_getter_interface.id,
|
| + NAME=getter.id, TYPE=output_type)
|
| + return
|
| +
|
| + self._members_emitter.Emit('\n // Shadowing definition.')
|
| + self._AddAttributeUsingProperties(getter, setter)
|
| + return
|
| +
|
| if getter and setter and input_type == output_type:
|
| self._members_emitter.Emit(
|
| '\n $TYPE $NAME;\n',
|
| @@ -2082,6 +2109,9 @@ class FrogInterfaceGenerator(object):
|
| '\n final $TYPE $NAME;\n',
|
| NAME=getter.id, TYPE=output_type)
|
| return
|
| + self._AddAttributeUsingProperties(getter, setter)
|
| +
|
| + def _AddAttributeUsingProperties(self, getter, setter):
|
| if getter:
|
| self._AddGetter(getter)
|
| if setter:
|
| @@ -2096,9 +2126,28 @@ class FrogInterfaceGenerator(object):
|
| 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',
|
| + ' void set $NAME($TYPE value) native "this.$NAME = value;";\n',
|
| NAME=attr.id, TYPE=self._NarrowInputType(attr.type.id))
|
|
|
| + def _FindShadowedAttribute(self, attr):
|
| + """Returns (attribute, superinterface) or (None, None)."""
|
| + def FindInParent(interface):
|
| + """Returns matching attribute in parent, or None."""
|
| + if interface.parents:
|
| + parent = interface.parents[0]
|
| + if _IsDartCollectionType(parent.type.id):
|
| + return (None, None)
|
| + if self._system._database.HasInterface(parent.type.id):
|
| + parent_interface = self._system._database.GetInterface(parent.type.id)
|
| + attr2 = _FindMatchingAttribute(parent_interface, attr)
|
| + if attr2:
|
| + return (attr2, parent_interface)
|
| + return FindInParent(parent_interface)
|
| + return (None, None)
|
| +
|
| + return FindInParent(self._interface) if attr else (None, None)
|
| +
|
| +
|
| def AddSecondaryAttribute(self, interface, getter, setter):
|
| self._SecondaryContext(interface)
|
| self.AddAttribute(getter, setter)
|
|
|