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

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

Issue 11051014: Extract common logic for emitting implementation classes. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Refresh html_dartium.dart Created 8 years, 2 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/html/dartium/html_dartium.dart ('k') | lib/html/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 import os 10 import os
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
215 code.Emit('typedef $TYPE $NAME($PARAMS);\n', 215 code.Emit('typedef $TYPE $NAME($PARAMS);\n',
216 NAME=self._interface.id, 216 NAME=self._interface.id,
217 TYPE=DartType(info.type_name), 217 TYPE=DartType(info.type_name),
218 PARAMS=info.ParametersImplementationDeclaration(DartType)) 218 PARAMS=info.ParametersImplementationDeclaration(DartType))
219 self._backend.GenerateCallback(info) 219 self._backend.GenerateCallback(info)
220 220
221 def GenerateInterface(self): 221 def GenerateInterface(self):
222 if (not self._interface.id in _merged_html_interfaces and 222 if (not self._interface.id in _merged_html_interfaces and
223 # Don't re-generate types that have been converted to native dart types. 223 # Don't re-generate types that have been converted to native dart types.
224 self._html_interface_name not in nativified_classes): 224 self._html_interface_name not in nativified_classes):
225 self._interface_emitter = self._library_emitter.FileEmitter( 225 interface_emitter = self._library_emitter.FileEmitter(
226 self._html_interface_name) 226 self._html_interface_name)
227 else: 227 else:
228 self._interface_emitter = emitter.Emitter() 228 interface_emitter = emitter.Emitter()
229 229
230 template_file = 'interface_%s.darttemplate' % self._html_interface_name 230 template_file = 'interface_%s.darttemplate' % self._html_interface_name
231 interface_template = (self._template_loader.TryLoad(template_file) or 231 interface_template = (self._template_loader.TryLoad(template_file) or
232 self._template_loader.Load('interface.darttemplate')) 232 self._template_loader.Load('interface.darttemplate'))
233 233
234 typename = self._html_interface_name 234 typename = self._html_interface_name
235 235
236 implements = [] 236 implements = []
237 suppressed_implements = [] 237 suppressed_implements = []
238 238
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after
285 for info in infos: 285 for info in infos:
286 constructors.append(info.ConstructorInfo(typename)) 286 constructors.append(info.ConstructorInfo(typename))
287 if factory_provider: 287 if factory_provider:
288 assert factory_provider == info.factory_provider_name 288 assert factory_provider == info.factory_provider_name
289 else: 289 else:
290 factory_provider = info.factory_provider_name 290 factory_provider = info.factory_provider_name
291 291
292 # TODO(vsm): Add appropriate package / namespace syntax. 292 # TODO(vsm): Add appropriate package / namespace syntax.
293 (self._type_comment_emitter, 293 (self._type_comment_emitter,
294 self._members_emitter, 294 self._members_emitter,
295 self._top_level_emitter) = self._interface_emitter.Emit( 295 self._top_level_emitter) = interface_emitter.Emit(
296 interface_template + '$!TOP_LEVEL', 296 interface_template + '$!TOP_LEVEL',
297 ID=typename, 297 ID=typename,
298 EXTENDS=implements_str) 298 EXTENDS=implements_str)
299 299
300 self._type_comment_emitter.Emit("/// @domName $DOMNAME", 300 self._type_comment_emitter.Emit("/// @domName $DOMNAME",
301 DOMNAME=self._interface.doc_js_name) 301 DOMNAME=self._interface.doc_js_name)
302 302
303 if self._backend.HasImplementation(): 303 if self._backend.HasImplementation():
304 if not self._interface.id in _merged_html_interfaces: 304 if not self._interface.id in _merged_html_interfaces:
305 name = self._html_interface_name 305 name = self._html_interface_name
306 if self._html_interface_name in nativified_classes: 306 if self._html_interface_name in nativified_classes:
307 name = nativified_classes[self._html_interface_name] 307 name = nativified_classes[self._html_interface_name]
308 basename = '%sImpl' % name 308 basename = '%sImpl' % name
309 else: 309 else:
310 basename = '%sImpl_Merged' % self._html_interface_name 310 basename = '%sImpl_Merged' % self._html_interface_name
311 self._implementation_emitter = self._library_emitter.FileEmitter(basename) 311 implementation_emitter = self._library_emitter.FileEmitter(basename)
312 else: 312 else:
313 self._implementation_emitter = emitter.Emitter() 313 implementation_emitter = emitter.Emitter()
314 self._backend.SetImplementationEmitter(self._implementation_emitter) 314
315 self._implementation_members_emitter = self._backend.StartInterface() 315 base_class = self._backend.BaseClassName()
316 implemented_interfaces = [self._html_interface_name] +\
317 self._backend.AdditionalImplementedInterfaces()
318 self._implementation_members_emitter = implementation_emitter.Emit(
319 self._backend.ImplementationTemplate(),
320 CLASSNAME=self._backend.ImplementationClassName(),
321 EXTENDS=' extends %s' % base_class if base_class else '',
322 IMPLEMENTS=' implements ' + ', '.join(implemented_interfaces),
323 NATIVESPEC=self._backend.NativeSpec())
324 self._backend.StartInterface(self._implementation_members_emitter)
316 325
317 for constructor_info in constructors: 326 for constructor_info in constructors:
318 constructor_info.GenerateFactoryInvocation( 327 constructor_info.GenerateFactoryInvocation(
319 self._DartType, self._members_emitter, factory_provider) 328 self._DartType, self._members_emitter, factory_provider)
320 329
321 element_type = MaybeTypedArrayElementTypeInHierarchy( 330 element_type = MaybeTypedArrayElementTypeInHierarchy(
322 self._interface, self._database) 331 self._interface, self._database)
323 if element_type: 332 if element_type:
324 self._members_emitter.Emit( 333 self._members_emitter.Emit(
325 '\n' 334 '\n'
326 ' factory $CTOR(int length) =>\n' 335 ' factory $CTOR(int length) =>\n'
327 ' $FACTORY.create$(CTOR)(length);\n' 336 ' $FACTORY.create$(CTOR)(length);\n'
328 '\n' 337 '\n'
329 ' factory $CTOR.fromList(List<$TYPE> list) =>\n' 338 ' factory $CTOR.fromList(List<$TYPE> list) =>\n'
330 ' $FACTORY.create$(CTOR)_fromList(list);\n' 339 ' $FACTORY.create$(CTOR)_fromList(list);\n'
331 '\n' 340 '\n'
332 ' factory $CTOR.fromBuffer(ArrayBuffer buffer, [int byteOffset, int l ength]) => \n' 341 ' factory $CTOR.fromBuffer(ArrayBuffer buffer, [int byteOffset, int l ength]) => \n'
333 ' $FACTORY.create$(CTOR)_fromBuffer(buffer, byteOffset, length);\n' , 342 ' $FACTORY.create$(CTOR)_fromBuffer(buffer, byteOffset, length);\n' ,
334 CTOR=self._interface.id, 343 CTOR=self._interface.id,
335 TYPE=self._DartType(element_type), 344 TYPE=self._DartType(element_type),
336 FACTORY=factory_provider) 345 FACTORY=factory_provider)
337 346
338 events_interface = self._event_generator.ProcessInterface( 347 events_interface = self._event_generator.ProcessInterface(
339 self._interface, self._html_interface_name, 348 self._interface, self._html_interface_name,
340 self._backend.CustomJSMembers(), 349 self._backend.CustomJSMembers(),
341 self._interface_emitter, self._implementation_emitter) 350 interface_emitter, implementation_emitter)
342 if events_interface: 351 if events_interface:
343 self._EmitEventGetter(events_interface, '_%sImpl' % events_interface) 352 self._EmitEventGetter(events_interface, '_%sImpl' % events_interface)
344 353
345 old_backend = self._backend 354 old_backend = self._backend
346 if not self._backend.ImplementsMergedMembers(): 355 if not self._backend.ImplementsMergedMembers():
347 self._backend = HtmlGeneratorDummyBackend() 356 self._backend = HtmlGeneratorDummyBackend()
348 for merged_interface in _merged_html_interfaces: 357 for merged_interface in _merged_html_interfaces:
349 if _merged_html_interfaces[merged_interface] == self._interface.id: 358 if _merged_html_interfaces[merged_interface] == self._interface.id:
350 merged_interface = self._database.GetInterface(merged_interface) 359 merged_interface = self._database.GetInterface(merged_interface)
351 self.AddMembers(merged_interface) 360 self.AddMembers(merged_interface)
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
564 self._html_interface_name = options.renamer.RenameInterface(self._interface) 573 self._html_interface_name = options.renamer.RenameInterface(self._interface)
565 self._current_secondary_parent = None 574 self._current_secondary_parent = None
566 575
567 def HasImplementation(self): 576 def HasImplementation(self):
568 return not (IsPureInterface(self._interface.id) or 577 return not (IsPureInterface(self._interface.id) or
569 self._interface.id in _merged_html_interfaces) 578 self._interface.id in _merged_html_interfaces)
570 579
571 def ImplementationClassName(self): 580 def ImplementationClassName(self):
572 return self._ImplClassName(self._html_interface_name) 581 return self._ImplClassName(self._html_interface_name)
573 582
574 def SetImplementationEmitter(self, implementation_emitter):
575 self._dart_code = implementation_emitter
576
577 def ImplementsMergedMembers(self): 583 def ImplementsMergedMembers(self):
578 return True 584 return True
579 585
580 def _ImplClassName(self, type_name): 586 def _ImplClassName(self, type_name):
581 name = type_name 587 name = type_name
582 if type_name in nativified_classes: 588 if type_name in nativified_classes:
583 name = nativified_classes[type_name] 589 name = nativified_classes[type_name]
584 return '_%sImpl' % name 590 return '_%sImpl' % name
585 591
586 def GenerateCallback(self, info): 592 def GenerateCallback(self, info):
587 pass 593 pass
588 594
589 def StartInterface(self): 595 def BaseClassName(self):
590 interface = self._interface 596 if not self._interface.parents:
591 interface_name = interface.id 597 return None
598 supertype = self._interface.parents[0].type.id
599 if IsDartCollectionType(supertype):
600 # List methods are injected in AddIndexer.
601 return None
602 if IsPureInterface(supertype):
603 return None
604 return self._ImplClassName(self._DartType(supertype))
592 605
593 self._class_name = self._ImplClassName(self._html_interface_name) 606 def AdditionalImplementedInterfaces(self):
594
595 base = None
596 if interface.parents:
597 supertype = interface.parents[0].type.id
598 if IsDartCollectionType(supertype):
599 # List methods are injected in AddIndexer.
600 pass
601 elif IsPureInterface(supertype):
602 pass
603 else:
604 base = self._ImplClassName(self._DartType(supertype))
605
606 native_spec = MakeNativeSpec(interface.javascript_binding_name)
607
608 extends = ' extends ' + base if base else ''
609
610 # TODO: Include all implemented interfaces, including other Lists. 607 # TODO: Include all implemented interfaces, including other Lists.
611 implements = [self._html_interface_name] 608 implements = []
612 element_type = MaybeTypedArrayElementType(self._interface) 609 element_type = MaybeTypedArrayElementType(self._interface)
613 if element_type: 610 if element_type:
614 implements.append('List<%s>' % self._DartType(element_type)) 611 implements.append('List<%s>' % self._DartType(element_type))
615
616 if self._HasJavaScriptIndexingBehaviour(): 612 if self._HasJavaScriptIndexingBehaviour():
617 implements.append('JavaScriptIndexingBehavior') 613 implements.append('JavaScriptIndexingBehavior')
614 return implements
618 615
616 def NativeSpec(self):
617 native_spec = MakeNativeSpec(self._interface.javascript_binding_name)
618 return ' native "%s"' % native_spec
619
620 def ImplementationTemplate(self):
619 template_file = 'impl_%s.darttemplate' % self._html_interface_name 621 template_file = 'impl_%s.darttemplate' % self._html_interface_name
620 template = (self._template_loader.TryLoad(template_file) or 622 return (self._template_loader.TryLoad(template_file) or
621 self._template_loader.Load('dart2js_impl.darttemplate')) 623 self._template_loader.Load('dart2js_impl.darttemplate'))
622 self._members_emitter = self._dart_code.Emit(
623 template,
624 #class $CLASSNAME$EXTENDS$IMPLEMENTS$NATIVESPEC {
625 #$!MEMBERS
626 #}
627 CLASSNAME=self._class_name,
628 EXTENDS=extends,
629 IMPLEMENTS=' implements ' + ', '.join(implements),
630 NATIVESPEC=' native "' + native_spec + '"')
631 if self._members_emitter == None:
632 raise Exception("Class %s doesn't use the $!MEMBERS variable" %
633 self._class_name)
634 624
635 return self._members_emitter 625 def StartInterface(self, emitter):
626 self._members_emitter = emitter
636 627
637 def FinishInterface(self): 628 def FinishInterface(self):
638 pass 629 pass
639 630
640 def EmitFactoryProvider(self, constructor_info, factory_provider, emitter): 631 def EmitFactoryProvider(self, constructor_info, factory_provider, emitter):
641 template_file = ('factoryprovider_%s.darttemplate' % 632 template_file = ('factoryprovider_%s.darttemplate' %
642 self._html_interface_name) 633 self._html_interface_name)
643 template = self._template_loader.TryLoad(template_file) 634 template = self._template_loader.TryLoad(template_file)
644 if not template: 635 if not template:
645 template = self._template_loader.Load('factoryprovider.darttemplate') 636 template = self._template_loader.Load('factoryprovider.darttemplate')
(...skipping 473 matching lines...) Expand 10 before | Expand all | Expand 10 after
1119 1110
1120 library_emitter = self._multiemitter.FileEmitter(library_file_path) 1111 library_emitter = self._multiemitter.FileEmitter(library_file_path)
1121 library_file_dir = os.path.dirname(library_file_path) 1112 library_file_dir = os.path.dirname(library_file_path)
1122 auxiliary_dir = os.path.relpath(auxiliary_dir, library_file_dir) 1113 auxiliary_dir = os.path.relpath(auxiliary_dir, library_file_dir)
1123 imports_emitter = library_emitter.Emit( 1114 imports_emitter = library_emitter.Emit(
1124 self._template, AUXILIARY_DIR=massage_path(auxiliary_dir)) 1115 self._template, AUXILIARY_DIR=massage_path(auxiliary_dir))
1125 for path in sorted(self._path_to_emitter.keys()): 1116 for path in sorted(self._path_to_emitter.keys()):
1126 relpath = os.path.relpath(path, library_file_dir) 1117 relpath = os.path.relpath(path, library_file_dir)
1127 imports_emitter.Emit( 1118 imports_emitter.Emit(
1128 "#source('$PATH');\n", PATH=massage_path(relpath)) 1119 "#source('$PATH');\n", PATH=massage_path(relpath))
OLDNEW
« no previous file with comments | « lib/html/dartium/html_dartium.dart ('k') | lib/html/scripts/systemnative.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698