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

Side by Side Diff: client/dom/scripts/dartgenerator.py

Issue 9382036: Avoid generating an overriding field in dart:dom (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: x Created 8 years, 10 months 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « client/dom/generated/src/frog/Uint8ClampedArray.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/python 1 #!/usr/bin/python
2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 2 # Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
3 # for details. All rights reserved. Use of this source code is governed by a 3 # for details. All rights reserved. Use of this source code is governed by a
4 # BSD-style license that can be found in the LICENSE file. 4 # BSD-style license that can be found in the LICENSE file.
5 5
6 """This module generates Dart APIs from the IDL database.""" 6 """This module generates Dart APIs from the IDL database."""
7 7
8 import emitter 8 import emitter
9 import idlnode 9 import idlnode
10 import logging 10 import logging
(...skipping 557 matching lines...) Expand 10 before | Expand all | Expand 10 after
568 568
569 # With multiple inheritance, attributes and operations of non-first 569 # With multiple inheritance, attributes and operations of non-first
570 # interfaces need to be added. Sometimes the attribute or operation is 570 # interfaces need to be added. Sometimes the attribute or operation is
571 # defined in the current interface as well as a parent. In that case we 571 # defined in the current interface as well as a parent. In that case we
572 # avoid making a duplicate definition and pray that the signatures match. 572 # avoid making a duplicate definition and pray that the signatures match.
573 573
574 for parent_interface in self._TransitiveSecondaryParents(interface): 574 for parent_interface in self._TransitiveSecondaryParents(interface):
575 if isinstance(parent_interface, str): # _IsDartCollectionType(parent_inte rface) 575 if isinstance(parent_interface, str): # _IsDartCollectionType(parent_inte rface)
576 continue 576 continue
577 attributes = [attr for attr in parent_interface.attributes 577 attributes = [attr for attr in parent_interface.attributes
578 if not self._DefinesSameAttribute(interface, attr)] 578 if not _FindMatchingAttribute(interface, attr)]
579 for (getter, setter) in _PairUpAttributes(attributes): 579 for (getter, setter) in _PairUpAttributes(attributes):
580 for generator in generators: 580 for generator in generators:
581 generator.AddSecondaryAttribute(parent_interface, getter, setter) 581 generator.AddSecondaryAttribute(parent_interface, getter, setter)
582 582
583 # Group overloaded operations by id 583 # Group overloaded operations by id
584 operationsById = {} 584 operationsById = {}
585 for operation in parent_interface.operations: 585 for operation in parent_interface.operations:
586 if operation.id not in operationsById: 586 if operation.id not in operationsById:
587 operationsById[operation.id] = [] 587 operationsById[operation.id] = []
588 operationsById[operation.id].append(operation) 588 operationsById[operation.id].append(operation)
(...skipping 11 matching lines...) Expand all
600 return 600 return
601 601
602 def _IsEventAttribute(self, interface, attr): 602 def _IsEventAttribute(self, interface, attr):
603 # Remove EventListener attributes like 'onclick' when addEventListener 603 # Remove EventListener attributes like 'onclick' when addEventListener
604 # is available. 604 # is available.
605 if attr.type.id == 'EventListener': 605 if attr.type.id == 'EventListener':
606 if 'EventTarget' in self._AllImplementedInterfaces(interface): 606 if 'EventTarget' in self._AllImplementedInterfaces(interface):
607 return True 607 return True
608 return False 608 return False
609 609
610 def _DefinesSameAttribute(self, interface, attr1):
611 return any(attr1.id == attr2.id
612 and attr1.is_fc_getter == attr2.is_fc_getter
613 and attr1.is_fc_setter == attr2.is_fc_setter
614 for attr2 in interface.attributes)
615
616 def _TransitiveSecondaryParents(self, interface): 610 def _TransitiveSecondaryParents(self, interface):
617 """Returns a list of all non-primary parents. 611 """Returns a list of all non-primary parents.
618 612
619 The list contains the interface objects for interfaces defined in the 613 The list contains the interface objects for interfaces defined in the
620 database, and the name for undefined interfaces. 614 database, and the name for undefined interfaces.
621 """ 615 """
622 def walk(parents): 616 def walk(parents):
623 for parent in parents: 617 for parent in parents:
624 if _IsDartCollectionType(parent.type.id): 618 if _IsDartCollectionType(parent.type.id):
625 result.append(parent.type.id) 619 result.append(parent.type.id)
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
705 getters = {} 699 getters = {}
706 setters = {} 700 setters = {}
707 for attr in attributes: 701 for attr in attributes:
708 if attr.is_fc_getter: 702 if attr.is_fc_getter:
709 getters[attr.id] = attr 703 getters[attr.id] = attr
710 elif attr.is_fc_setter: 704 elif attr.is_fc_setter:
711 setters[attr.id] = attr 705 setters[attr.id] = attr
712 return [(getters.get(id), setters.get(id)) for id in names] 706 return [(getters.get(id), setters.get(id)) for id in names]
713 707
714 708
709 def _FindMatchingAttribute(interface, attr1):
710 matches = [attr2 for attr2 in interface.attributes
711 if attr1.id == attr2.id
712 and attr1.is_fc_getter == attr2.is_fc_getter
713 and attr1.is_fc_setter == attr2.is_fc_setter]
714 if matches:
715 assert len(matches) == 1
716 return matches[0]
717 return None
718
719
715 def _AnalyzeOperation(interface, operations): 720 def _AnalyzeOperation(interface, operations):
716 """Makes operation calling convention decision for a set of overloads. 721 """Makes operation calling convention decision for a set of overloads.
717 722
718 Returns: An OperationInfo object. 723 Returns: An OperationInfo object.
719 """ 724 """
720 725
721 # Zip together arguments from each overload by position, then convert 726 # Zip together arguments from each overload by position, then convert
722 # to a dart argument. 727 # to a dart argument.
723 728
724 # Given a list of overloaded arguments, choose a suitable name. 729 # Given a list of overloaded arguments, choose a suitable name.
(...skipping 1340 matching lines...) Expand 10 before | Expand all | Expand 10 after
2065 self._members_emitter.Emit('\n static final $TYPE $NAME = $VALUE;\n', 2070 self._members_emitter.Emit('\n static final $TYPE $NAME = $VALUE;\n',
2066 NAME=constant.id, 2071 NAME=constant.id,
2067 TYPE=constant.type.id, 2072 TYPE=constant.type.id,
2068 VALUE=constant.value) 2073 VALUE=constant.value)
2069 2074
2070 pass 2075 pass
2071 2076
2072 def AddAttribute(self, getter, setter): 2077 def AddAttribute(self, getter, setter):
2073 output_type = getter and self._NarrowOutputType(getter.type.id) 2078 output_type = getter and self._NarrowOutputType(getter.type.id)
2074 input_type = setter and self._NarrowInputType(setter.type.id) 2079 input_type = setter and self._NarrowInputType(setter.type.id)
2080
2081 # If the (getter, setter) pair is shadowing, we can't generate a shadowing
2082 # field (Issue 1633).
2083 (super_getter, super_getter_interface) = self._FindShadowedAttribute(getter)
2084 (super_setter, super_setter_interface) = self._FindShadowedAttribute(setter)
2085 if super_getter or super_setter:
2086 if getter and not setter and super_getter and not super_setter:
2087 if getter.type.id == super_getter.type.id:
2088 # Compatible getter, use the superclass property. This works because
2089 # JavaScript will do its own dynamic dispatch.
2090 self._members_emitter.Emit(
2091 '\n'
2092 ' // Use implementation from $SUPER.\n'
2093 ' // final $TYPE $NAME;\n',
2094 SUPER=super_getter_interface.id,
2095 NAME=getter.id, TYPE=output_type)
2096 return
2097
2098 self._members_emitter.Emit('\n // Shadowing definition.')
2099 self._AddAttributeUsingProperties(getter, setter)
2100 return
2101
2075 if getter and setter and input_type == output_type: 2102 if getter and setter and input_type == output_type:
2076 self._members_emitter.Emit( 2103 self._members_emitter.Emit(
2077 '\n $TYPE $NAME;\n', 2104 '\n $TYPE $NAME;\n',
2078 NAME=getter.id, TYPE=output_type) 2105 NAME=getter.id, TYPE=output_type)
2079 return 2106 return
2080 if getter and not setter: 2107 if getter and not setter:
2081 self._members_emitter.Emit( 2108 self._members_emitter.Emit(
2082 '\n final $TYPE $NAME;\n', 2109 '\n final $TYPE $NAME;\n',
2083 NAME=getter.id, TYPE=output_type) 2110 NAME=getter.id, TYPE=output_type)
2084 return 2111 return
2112 self._AddAttributeUsingProperties(getter, setter)
2113
2114 def _AddAttributeUsingProperties(self, getter, setter):
2085 if getter: 2115 if getter:
2086 self._AddGetter(getter) 2116 self._AddGetter(getter)
2087 if setter: 2117 if setter:
2088 self._AddSetter(setter) 2118 self._AddSetter(setter)
2089 2119
2090 def _AddGetter(self, attr): 2120 def _AddGetter(self, attr):
2091 # TODO(sra): Remove native body when Issue 829 fixed. 2121 # TODO(sra): Remove native body when Issue 829 fixed.
2092 self._members_emitter.Emit( 2122 self._members_emitter.Emit(
2093 '\n $TYPE get $NAME() native "return this.$NAME;";\n', 2123 '\n $TYPE get $NAME() native "return this.$NAME;";\n',
2094 NAME=attr.id, TYPE=self._NarrowOutputType(attr.type.id)) 2124 NAME=attr.id, TYPE=self._NarrowOutputType(attr.type.id))
2095 2125
2096 def _AddSetter(self, attr): 2126 def _AddSetter(self, attr):
2097 # TODO(sra): Remove native body when Issue 829 fixed. 2127 # TODO(sra): Remove native body when Issue 829 fixed.
2098 self._members_emitter.Emit( 2128 self._members_emitter.Emit(
2099 '\n void set $NAME($TYPE value) native "this.$NAME = value;";\n', 2129 ' void set $NAME($TYPE value) native "this.$NAME = value;";\n',
2100 NAME=attr.id, TYPE=self._NarrowInputType(attr.type.id)) 2130 NAME=attr.id, TYPE=self._NarrowInputType(attr.type.id))
2101 2131
2132 def _FindShadowedAttribute(self, attr):
2133 """Returns (attribute, superinterface) or (None, None)."""
2134 def FindInParent(interface):
2135 """Returns matching attribute in parent, or None."""
2136 if interface.parents:
2137 parent = interface.parents[0]
2138 if _IsDartCollectionType(parent.type.id):
2139 return (None, None)
2140 if self._system._database.HasInterface(parent.type.id):
2141 parent_interface = self._system._database.GetInterface(parent.type.id)
2142 attr2 = _FindMatchingAttribute(parent_interface, attr)
2143 if attr2:
2144 return (attr2, parent_interface)
2145 return FindInParent(parent_interface)
2146 return (None, None)
2147
2148 return FindInParent(self._interface) if attr else (None, None)
2149
2150
2102 def AddSecondaryAttribute(self, interface, getter, setter): 2151 def AddSecondaryAttribute(self, interface, getter, setter):
2103 self._SecondaryContext(interface) 2152 self._SecondaryContext(interface)
2104 self.AddAttribute(getter, setter) 2153 self.AddAttribute(getter, setter)
2105 2154
2106 def AddSecondaryOperation(self, interface, info): 2155 def AddSecondaryOperation(self, interface, info):
2107 self._SecondaryContext(interface) 2156 self._SecondaryContext(interface)
2108 self.AddOperation(info) 2157 self.AddOperation(info)
2109 2158
2110 def AddEventAttributes(self, event_attrs): 2159 def AddEventAttributes(self, event_attrs):
2111 pass 2160 pass
(...skipping 377 matching lines...) Expand 10 before | Expand all | Expand 10 after
2489 INDENT=indent, 2538 INDENT=indent,
2490 NATIVENAME=native_name, 2539 NATIVENAME=native_name,
2491 ARGS=argument_expressions) 2540 ARGS=argument_expressions)
2492 2541
2493 self._members_emitter.Emit(' $TYPE $NATIVE_NAME($PARAMS) native ' 2542 self._members_emitter.Emit(' $TYPE $NATIVE_NAME($PARAMS) native '
2494 '"$(INTERFACE)$(NATIVE_NAME)_Callback";\n', 2543 '"$(INTERFACE)$(NATIVE_NAME)_Callback";\n',
2495 NATIVE_NAME=native_name, 2544 NATIVE_NAME=native_name,
2496 TYPE=info.type_name, 2545 TYPE=info.type_name,
2497 PARAMS=', '.join(arg_names), 2546 PARAMS=', '.join(arg_names),
2498 INTERFACE=self._interface.id) 2547 INTERFACE=self._interface.id)
OLDNEW
« no previous file with comments | « client/dom/generated/src/frog/Uint8ClampedArray.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698