Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 provides shared functionality for the system to generate | 6 """This module provides shared functionality for the system to generate |
| 7 Dart:html APIs from the IDL database.""" | 7 Dart:html APIs from the IDL database.""" |
| 8 | 8 |
| 9 import emitter | 9 import emitter |
| 10 | 10 |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 265 "Node.set:nodeValue", | 265 "Node.set:nodeValue", |
| 266 "Node.get:CDATA_SECTION_NODE", | 266 "Node.get:CDATA_SECTION_NODE", |
| 267 "Node.get:nodeName", | 267 "Node.get:nodeName", |
| 268 "Node.lookupPrefix", | 268 "Node.lookupPrefix", |
| 269 "Node.get:PROCESSING_INSTRUCTION_NODE", | 269 "Node.get:PROCESSING_INSTRUCTION_NODE", |
| 270 "IFrameElement.get:contentDocument", | 270 "IFrameElement.get:contentDocument", |
| 271 "Window.get:frameElement", | 271 "Window.get:frameElement", |
| 272 ]) | 272 ]) |
| 273 | 273 |
| 274 _html_library_custom = set([ | 274 _html_library_custom = set([ |
| 275 'IFrameElement.get:contentWindow', | 275 'IFrameElement.contentWindow', |
| 276 'Window.get:document', | 276 'Window.document', |
| 277 'Window.get:top', | 277 'Window.top', |
| 278 'Window.get:location', | 278 'Window.location', |
| 279 'Window.set:location', | 279 'Window.location', |
|
Anton Muhin
2012/07/04 20:01:08
do you need to duplicate Window.location?
podivilov
2012/07/05 09:38:59
Done.
| |
| 280 'Window.open', | 280 'Window.open', |
| 281 'IDBDatabase.transaction', | 281 'IDBDatabase.transaction', |
| 282 ]) | 282 ]) |
| 283 | 283 |
| 284 # This map controls merging of interfaces in dart:html library. | 284 # This map controls merging of interfaces in dart:html library. |
| 285 # All constants, attributes, and operations of merged interface (key) are | 285 # All constants, attributes, and operations of merged interface (key) are |
| 286 # added to target interface (value). All references to the merged interface | 286 # added to target interface (value). All references to the merged interface |
| 287 # (e.g. parameter types, return types, parent interfaces) are replaced with | 287 # (e.g. parameter types, return types, parent interfaces) are replaced with |
| 288 # target interface. There are two important restrictions: | 288 # target interface. There are two important restrictions: |
| 289 # 1) Merged and target interfaces shouldn't have common members, otherwise there | 289 # 1) Merged and target interfaces shouldn't have common members, otherwise there |
| (...skipping 648 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 938 merged_interface = self._database.GetInterface(merged_interface) | 938 merged_interface = self._database.GetInterface(merged_interface) |
| 939 self.AddMembers(merged_interface) | 939 self.AddMembers(merged_interface) |
| 940 self._backend.FinishGeneratingMergedMembers() | 940 self._backend.FinishGeneratingMergedMembers() |
| 941 | 941 |
| 942 def AddIndexer(self, element_type): | 942 def AddIndexer(self, element_type): |
| 943 self._backend.AddIndexer(element_type) | 943 self._backend.AddIndexer(element_type) |
| 944 | 944 |
| 945 def AmendIndexer(self, element_type): | 945 def AmendIndexer(self, element_type): |
| 946 self._backend.AmendIndexer(element_type) | 946 self._backend.AmendIndexer(element_type) |
| 947 | 947 |
| 948 def AddAttribute(self, attribute): | 948 def AddAttribute(self, attribute, is_secondary=False): |
| 949 self._backend.AddAttribute(attribute) | 949 dom_name = DartDomNameOfAttribute(attribute) |
| 950 | 950 html_name = self._shared.RenameInHtmlLibrary( |
| 951 getter = attribute | |
| 952 setter = attribute if not IsReadOnly(attribute) else None | |
| 953 dom_name = DartDomNameOfAttribute(getter) | |
| 954 html_getter_name = self._shared.RenameInHtmlLibrary( | |
| 955 self._interface.id, dom_name, 'get:') | 951 self._interface.id, dom_name, 'get:') |
| 956 html_setter_name = self._shared.RenameInHtmlLibrary( | 952 if not html_name or self._shared.IsPrivate(html_name): |
| 957 self._interface.id, dom_name, 'set:') | |
| 958 | |
| 959 if not html_getter_name or self._shared.IsPrivate(html_getter_name): | |
| 960 getter = None | |
| 961 if not html_setter_name or self._shared.IsPrivate(html_setter_name): | |
| 962 setter = None | |
| 963 if not getter and not setter: | |
| 964 return | 953 return |
| 965 | 954 |
| 955 read_only = IsReadOnly(attribute) | |
| 956 html_setter_name = self._shared.RenameInHtmlLibrary( | |
| 957 self._interface.id, dom_name, 'set:') | |
| 958 if not html_setter_name: | |
|
Anton Muhin
2012/07/04 20:01:08
cannot you change lines 955, 958 and 959 into: rea
podivilov
2012/07/05 09:38:59
Done.
| |
| 959 read_only = True | |
| 960 | |
| 966 # We don't yet handle inconsistent renames of the getter and setter yet. | 961 # We don't yet handle inconsistent renames of the getter and setter yet. |
| 967 if html_getter_name and html_setter_name: | 962 if html_setter_name: |
|
Anton Muhin
2012/07/04 20:01:08
assert(not html_setter_name or html_setter_name ==
podivilov
2012/07/05 09:38:59
Done.
| |
| 968 assert html_getter_name == html_setter_name | 963 assert(html_name == html_setter_name) |
| 969 | 964 |
| 970 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', | 965 if not is_secondary: |
| 971 DOMINTERFACE=getter.doc_js_interface_name, | 966 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', |
| 972 DOMNAME=dom_name) | 967 DOMINTERFACE=attribute.doc_js_interface_name, |
| 973 if (getter and setter and | 968 DOMNAME=dom_name) |
| 974 getter.type.id == setter.type.id): | 969 modifier = 'final ' if read_only else '' |
| 975 self._members_emitter.Emit('\n $TYPE $NAME;\n', | 970 self._members_emitter.Emit('\n $MODIFIER$TYPE $NAME;\n', |
| 976 NAME=html_getter_name, | 971 MODIFIER=modifier, |
| 977 TYPE=self._shared.DartType(getter.type.id)) | 972 NAME=html_name, |
| 978 return | 973 TYPE=self._shared.DartType(attribute.type.id)) |
| 979 if getter and not setter: | 974 self._backend.AddAttribute(attribute, html_name, read_only) |
| 980 self._members_emitter.Emit('\n final $TYPE $NAME;\n', | |
| 981 NAME=html_getter_name, | |
| 982 TYPE=self._shared.DartType(getter.type.id)) | |
| 983 return | |
| 984 raise Exception('Unexpected getter/setter combination %s %s' % | |
| 985 (getter, setter)) | |
| 986 | 975 |
| 987 def AddOperation(self, info): | 976 def AddSecondaryAttribute(self, interface, attribute): |
| 977 self._backend.SecondaryContext(interface) | |
| 978 self.AddAttribute(attribute, True) | |
| 979 | |
| 980 def AddOperation(self, info, is_secondary=False): | |
| 988 """ | 981 """ |
| 989 Arguments: | 982 Arguments: |
| 990 operations - contains the overloads, one or more operations with the same | 983 operations - contains the overloads, one or more operations with the same |
| 991 name. | 984 name. |
| 992 """ | 985 """ |
| 993 html_name = self._shared.RenameInHtmlLibrary( | 986 html_name = self._shared.RenameInHtmlLibrary( |
| 994 self._interface.id, info.name) | 987 self._interface.id, info.name) |
| 995 if html_name and not self._shared.IsPrivate(html_name): | 988 if html_name and not self._shared.IsPrivate(html_name) and not is_secondary: |
| 996 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', | 989 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', |
| 997 DOMINTERFACE=info.overloads[0].doc_js_interface_name, | 990 DOMINTERFACE=info.overloads[0].doc_js_interface_name, |
| 998 DOMNAME=info.name) | 991 DOMNAME=info.name) |
| 999 | 992 |
| 1000 self._members_emitter.Emit('\n' | 993 self._members_emitter.Emit('\n' |
| 1001 ' $TYPE $NAME($PARAMS);\n', | 994 ' $TYPE $NAME($PARAMS);\n', |
| 1002 TYPE=self._shared.DartType(info.type_name), | 995 TYPE=self._shared.DartType(info.type_name), |
| 1003 NAME=html_name, | 996 NAME=html_name, |
| 1004 PARAMS=info.ParametersInterfaceDeclaration( | 997 PARAMS=info.ParametersInterfaceDeclaration( |
| 1005 self._shared.DartType)) | 998 self._shared.DartType)) |
| 1006 self._backend.AddOperation(info) | 999 self._backend.AddOperation(info) |
| 1007 | 1000 |
| 1008 def AddStaticOperation(self, info): | 1001 def AddStaticOperation(self, info): |
| 1009 self._backend.AddStaticOperation(info) | 1002 self._backend.AddStaticOperation(info) |
| 1010 | 1003 |
| 1004 def AddSecondaryOperation(self, interface, info): | |
| 1005 self._backend.SecondaryContext(interface) | |
| 1006 self.AddOperation(info, True) | |
| 1007 | |
| 1011 def FinishInterface(self): | 1008 def FinishInterface(self): |
| 1012 self._backend.AddSecondaryMembers(self._interface) | |
| 1013 self._backend.FinishInterface() | 1009 self._backend.FinishInterface() |
| 1014 | 1010 |
| 1015 def AddConstant(self, constant): | 1011 def AddConstant(self, constant): |
| 1016 type = TypeOrNothing(DartType(constant.type.id), constant.type.id) | 1012 type = TypeOrNothing(DartType(constant.type.id), constant.type.id) |
| 1017 self._members_emitter.Emit('\n static final $TYPE$NAME = $VALUE;\n', | 1013 self._members_emitter.Emit('\n static final $TYPE$NAME = $VALUE;\n', |
| 1018 NAME=constant.id, | 1014 NAME=constant.id, |
| 1019 TYPE=type, | 1015 TYPE=type, |
| 1020 VALUE=constant.value) | 1016 VALUE=constant.value) |
| 1021 self._backend.AddConstant(constant) | 1017 self._backend.AddConstant(constant) |
| 1022 | 1018 |
| (...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1234 ' }\n', | 1230 ' }\n', |
| 1235 TYPE=self._NarrowInputType(element_type)) | 1231 TYPE=self._NarrowInputType(element_type)) |
| 1236 | 1232 |
| 1237 # TODO(sra): Use separate mixins for mutable implementations of List<T>. | 1233 # TODO(sra): Use separate mixins for mutable implementations of List<T>. |
| 1238 # TODO(sra): Use separate mixins for typed array implementations of List<T>. | 1234 # TODO(sra): Use separate mixins for typed array implementations of List<T>. |
| 1239 if self._interface.id != 'NodeList': | 1235 if self._interface.id != 'NodeList': |
| 1240 template_file = 'immutable_list_mixin.darttemplate' | 1236 template_file = 'immutable_list_mixin.darttemplate' |
| 1241 template = self._system._templates.Load(template_file) | 1237 template = self._system._templates.Load(template_file) |
| 1242 self._members_emitter.Emit(template, E=self._shared.DartType(element_type) ) | 1238 self._members_emitter.Emit(template, E=self._shared.DartType(element_type) ) |
| 1243 | 1239 |
| 1244 def AddAttribute(self, attribute): | 1240 def AddAttribute(self, attribute, html_name, read_only): |
| 1245 getter = attribute | 1241 if self._shared.IsCustomInHtmlLibrary(self._interface, attribute.id): |
| 1246 setter = attribute if not IsReadOnly(attribute) else None | |
| 1247 dom_name = DartDomNameOfAttribute(getter or setter) | |
| 1248 html_getter_name = None | |
| 1249 if not self._shared.IsCustomInHtmlLibrary( | |
| 1250 self._interface, dom_name, 'get:'): | |
| 1251 html_getter_name = self._shared.RenameInHtmlLibrary( | |
| 1252 self._interface.id, dom_name, 'get:', | |
| 1253 implementation_class=True) | |
| 1254 html_setter_name = None | |
| 1255 if not self._shared.IsCustomInHtmlLibrary( | |
| 1256 self._interface, dom_name, 'set:'): | |
| 1257 html_setter_name = self._shared.RenameInHtmlLibrary( | |
| 1258 self._interface.id, dom_name, 'set:', | |
| 1259 implementation_class=True) | |
| 1260 | |
| 1261 if not html_getter_name: | |
| 1262 getter = None | |
| 1263 if not html_setter_name: | |
| 1264 setter = None | |
| 1265 | |
| 1266 if not getter and not setter: | |
| 1267 return | 1242 return |
| 1268 | 1243 |
| 1269 if ((getter and html_getter_name != getter.id) or | 1244 if attribute.id != html_name: |
| 1270 (setter and html_setter_name != setter.id)): | 1245 self._AddRenamingGetter(attribute, html_name) |
| 1271 if getter: | 1246 if not read_only: |
| 1272 self._AddRenamingGetter(getter, html_getter_name) | 1247 self._AddRenamingSetter(attribute, html_name) |
| 1273 if setter: | |
| 1274 self._AddRenamingSetter(setter, html_setter_name) | |
| 1275 return | 1248 return |
| 1276 | 1249 |
| 1277 # If the (getter, setter) pair is shadowing, we can't generate a shadowing | 1250 # If the attribute is shadowing, we can't generate a shadowing |
| 1278 # field (Issue 1633). | 1251 # field (Issue 1633). |
| 1279 (super_getter, super_getter_interface) = self._FindShadowedAttribute(getter, _merged_html_interfaces) | 1252 (super_attribute, super_attribute_interface) = self._FindShadowedAttribute(a ttribute, _merged_html_interfaces) |
| 1280 (super_setter, super_setter_interface) = self._FindShadowedAttribute(setter, _merged_html_interfaces) | 1253 if super_attribute: |
| 1281 if super_getter or super_setter: | 1254 if read_only: |
| 1282 if getter and not setter and super_getter and not super_setter: | 1255 if attribute.type.id == super_attribute.type.id: |
| 1283 if getter.type.id == super_getter.type.id: | 1256 # Compatible attribute, use the superclass property. This works |
| 1284 # Compatible getter, use the superclass property. This works because | 1257 # because JavaScript will do its own dynamic dispatch. |
| 1285 # JavaScript will do its own dynamic dispatch. | |
| 1286 output_type = getter and self._NarrowOutputType(getter.type.id) | |
| 1287 self._members_emitter.Emit( | 1258 self._members_emitter.Emit( |
| 1288 '\n' | 1259 '\n' |
| 1289 ' // Use implementation from $SUPER.\n' | 1260 ' // Use implementation from $SUPER.\n' |
| 1290 ' // final $TYPE $NAME;\n', | 1261 ' // final $TYPE $NAME;\n', |
| 1291 SUPER=super_getter_interface, | 1262 SUPER=super_attribute_interface, |
| 1292 NAME=DartDomNameOfAttribute(getter), | 1263 NAME=DartDomNameOfAttribute(attribute), |
| 1293 TYPE=output_type) | 1264 TYPE=self._NarrowOutputType(attribute.type.id)) |
| 1294 return | 1265 return |
| 1295 | 1266 |
| 1296 self._members_emitter.Emit('\n // Shadowing definition.') | 1267 self._members_emitter.Emit('\n // Shadowing definition.') |
| 1297 self._AddAttributeUsingProperties(getter, setter) | 1268 self._AddAttributeUsingProperties(attribute, read_only) |
| 1298 return | 1269 return |
| 1299 | 1270 |
| 1300 output_type = getter and self._NarrowOutputType(getter.type.id) | 1271 output_type = self._NarrowOutputType(attribute.type.id) |
| 1301 input_type = setter and self._NarrowInputType(setter.type.id) | 1272 input_type = self._NarrowInputType(attribute.type.id) |
| 1302 if getter and setter and input_type == output_type: | 1273 if not read_only: |
| 1303 self._members_emitter.Emit( | 1274 self._members_emitter.Emit( |
| 1304 '\n $TYPE $NAME;\n', | 1275 '\n $TYPE $NAME;\n', |
| 1305 NAME=DartDomNameOfAttribute(getter), | 1276 NAME=DartDomNameOfAttribute(attribute), |
| 1306 TYPE=output_type) | 1277 TYPE=output_type) |
| 1307 return | 1278 else: |
| 1308 if getter and not setter: | |
| 1309 self._members_emitter.Emit( | 1279 self._members_emitter.Emit( |
| 1310 '\n final $TYPE $NAME;\n', | 1280 '\n final $TYPE $NAME;\n', |
| 1311 NAME=DartDomNameOfAttribute(getter), | 1281 NAME=DartDomNameOfAttribute(attribute), |
| 1312 TYPE=output_type) | 1282 TYPE=output_type) |
| 1313 return | |
| 1314 self._AddAttributeUsingProperties(getter, setter) | |
| 1315 | 1283 |
| 1316 def _AddAttributeUsingProperties(self, getter, setter): | 1284 def _AddAttributeUsingProperties(self, attribute, read_only): |
| 1317 if getter: | 1285 self._AddGetter(attribute) |
| 1318 self._AddGetter(getter) | 1286 if not read_only: |
| 1319 if setter: | 1287 self._AddSetter(attribute) |
| 1320 self._AddSetter(setter) | |
| 1321 | 1288 |
| 1322 def _AddGetter(self, attr): | 1289 def _AddGetter(self, attr): |
| 1323 self._AddRenamingGetter(attr, DartDomNameOfAttribute(attr)) | 1290 self._AddRenamingGetter(attr, DartDomNameOfAttribute(attr)) |
| 1324 | 1291 |
| 1325 def _AddSetter(self, attr): | 1292 def _AddSetter(self, attr): |
| 1326 self._AddRenamingSetter(attr, DartDomNameOfAttribute(attr)) | 1293 self._AddRenamingSetter(attr, DartDomNameOfAttribute(attr)) |
| 1327 | 1294 |
| 1328 def _AddRenamingGetter(self, attr, html_name): | 1295 def _AddRenamingGetter(self, attr, html_name): |
| 1329 return_type = self._NarrowOutputType(attr.type.id) | 1296 return_type = self._NarrowOutputType(attr.type.id) |
| 1330 self._members_emitter.Emit( | 1297 self._members_emitter.Emit( |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1415 Collect(database.GetInterface(parent.type.id), | 1382 Collect(database.GetInterface(parent.type.id), |
| 1416 seen, collected) | 1383 seen, collected) |
| 1417 | 1384 |
| 1418 inheritance_closure = {} | 1385 inheritance_closure = {} |
| 1419 for interface in database.GetInterfaces(): | 1386 for interface in database.GetInterfaces(): |
| 1420 seen = set() | 1387 seen = set() |
| 1421 collected = [] | 1388 collected = [] |
| 1422 Collect(interface, seen, collected) | 1389 Collect(interface, seen, collected) |
| 1423 inheritance_closure[interface.id] = collected | 1390 inheritance_closure[interface.id] = collected |
| 1424 return inheritance_closure | 1391 return inheritance_closure |
| OLD | NEW |