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

Side by Side Diff: lib/dom/scripts/systemhtml.py

Issue 10704102: Cleanup attributes generation in dart:html. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 5 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 | « lib/dom/scripts/systemfrog.py ('k') | lib/dom/scripts/systemnative.py » ('j') | 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 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
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
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
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
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
OLDNEW
« no previous file with comments | « lib/dom/scripts/systemfrog.py ('k') | lib/dom/scripts/systemnative.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698