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

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

Issue 10915245: Removing interfaces from dart:html (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Further fixes to dartium. Created 8 years, 3 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
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 314 matching lines...) Expand 10 before | Expand all | Expand 10 after
325 infos = _html_element_constructors[typename] 325 infos = _html_element_constructors[typename]
326 if isinstance(infos, str): 326 if isinstance(infos, str):
327 infos = ElementConstructorInfo(tag=infos) 327 infos = ElementConstructorInfo(tag=infos)
328 if not isinstance(infos, list): 328 if not isinstance(infos, list):
329 infos = [infos] 329 infos = [infos]
330 return infos 330 return infos
331 331
332 def EmitHtmlElementFactoryConstructors(emitter, infos, typename, class_name): 332 def EmitHtmlElementFactoryConstructors(emitter, infos, typename, class_name):
333 for info in infos: 333 for info in infos:
334 constructor_info = info.ConstructorInfo(typename) 334 constructor_info = info.ConstructorInfo(typename)
335
335 inits = emitter.Emit( 336 inits = emitter.Emit(
336 '\n' 337 '\n'
337 ' factory $CONSTRUCTOR($PARAMS) {\n' 338 ' static $RETURN_TYPE $CONSTRUCTOR($PARAMS) {\n'
338 ' $CLASS _e = _document.$dom_createElement("$TAG");\n' 339 ' $CLASS _e = _document.$dom_createElement("$TAG");\n'
339 '$!INITS' 340 '$!INITS'
340 ' return _e;\n' 341 ' return _e;\n'
341 ' }\n', 342 ' }\n',
342 CONSTRUCTOR=constructor_info.ConstructorFullName(), 343 RETURN_TYPE=constructor_info.type_name,
344 CONSTRUCTOR=constructor_info.ConstructorFactoryName(DartType),
343 CLASS=class_name, 345 CLASS=class_name,
344 TAG=info.tag, 346 TAG=info.tag,
345 PARAMS=constructor_info.ParametersInterfaceDeclaration(DartType)) 347 PARAMS=constructor_info.ParametersInterfaceDeclaration(DartType))
346 for param in constructor_info.param_infos: 348 for param in constructor_info.param_infos:
347 inits.Emit(' if ($E != null) _e.$E = $E;\n', E=param.name) 349 inits.Emit(' if ($E != null) _e.$E = $E;\n', E=param.name)
348 350
349 351
350 # These classes require an explicit declaration for the "on" method even though 352 # These classes require an explicit declaration for the "on" method even though
351 # they don't declare any unique events, because the concrete class hierarchy 353 # they don't declare any unique events, because the concrete class hierarchy
352 # doesn't match the interface hierarchy. 354 # doesn't match the interface hierarchy.
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after
479 self._interface_emitter = self._system._emitters.FileEmitter(path) 481 self._interface_emitter = self._system._emitters.FileEmitter(path)
480 else: 482 else:
481 self._interface_emitter = emitter.Emitter() 483 self._interface_emitter = emitter.Emitter()
482 484
483 template_file = 'interface_%s.darttemplate' % self._html_interface_name 485 template_file = 'interface_%s.darttemplate' % self._html_interface_name
484 interface_template = (self._system._templates.TryLoad(template_file) or 486 interface_template = (self._system._templates.TryLoad(template_file) or
485 self._system._templates.Load('interface.darttemplate') ) 487 self._system._templates.Load('interface.darttemplate') )
486 488
487 typename = self._html_interface_name 489 typename = self._html_interface_name
488 490
489 extends = [] 491 extends = []
Anton Muhin 2012/09/17 10:11:29 extends -> implements?
blois 2012/09/17 19:48:22 Done.
490 suppressed_extends = [] 492 suppressed_extends = []
491 493
492 for parent in self._interface.parents: 494 for parent in self._interface.parents:
493 # TODO(vsm): Remove source_filter. 495 # TODO(vsm): Remove source_filter.
494 if MatchSourceFilter(parent): 496 if MatchSourceFilter(parent):
495 # Parent is a DOM type. 497 # Parent is a DOM type.
496 extends.append(self._DartType(parent.type.id)) 498 extends.append(self._DartType(parent.type.id))
497 elif '<' in parent.type.id: 499 elif '<' in parent.type.id:
498 # Parent is a Dart collection type. 500 # Parent is a Dart collection type.
499 # TODO(vsm): Make this check more robust. 501 # TODO(vsm): Make this check more robust.
500 extends.append(self._DartType(parent.type.id)) 502 extends.append(self._DartType(parent.type.id))
501 else: 503 else:
502 suppressed_extends.append('%s.%s' % 504 suppressed_extends.append('%s.%s' %
503 (self._common_prefix, self._DartType(parent.type.id))) 505 (self._common_prefix, self._DartType(parent.type.id)))
504 506
505 comment = ' extends' 507 comment = ' extends'
506 extends_str = '' 508 extends_str = ''
507 if extends: 509 if extends:
508 extends_str += ' extends ' + ', '.join(extends) 510 extends_str += ' implements ' + ', '.join(extends)
509 comment = ',' 511 comment = ','
510 if suppressed_extends: 512 if suppressed_extends:
511 extends_str += ' /*%s %s */' % (comment, ', '.join(suppressed_extends)) 513 extends_str += ' /*%s %s */' % (comment, ', '.join(suppressed_extends))
512 514
513 factory_provider = None 515 factory_provider = None
514 if typename in interface_factories: 516 if typename in interface_factories:
515 factory_provider = interface_factories[typename] 517 factory_provider = interface_factories[typename]
516 518
517 constructors = [] 519 constructors = []
518 constructor_info = AnalyzeConstructor(self._interface) 520 constructor_info = AnalyzeConstructor(self._interface)
(...skipping 21 matching lines...) Expand all
540 self._html_interface_name, 542 self._html_interface_name,
541 self._backend.ImplementationClassName()) 543 self._backend.ImplementationClassName())
542 544
543 for info in infos: 545 for info in infos:
544 constructors.append(info.ConstructorInfo(typename)) 546 constructors.append(info.ConstructorInfo(typename))
545 if factory_provider: 547 if factory_provider:
546 assert factory_provider == info.factory_provider_name 548 assert factory_provider == info.factory_provider_name
547 else: 549 else:
548 factory_provider = info.factory_provider_name 550 factory_provider = info.factory_provider_name
549 551
550 if factory_provider:
551 extends_str += ' default ' + factory_provider
552
553 # TODO(vsm): Add appropriate package / namespace syntax. 552 # TODO(vsm): Add appropriate package / namespace syntax.
554 (self._type_comment_emitter, 553 (self._type_comment_emitter,
555 self._members_emitter, 554 self._members_emitter,
556 self._top_level_emitter) = self._interface_emitter.Emit( 555 self._top_level_emitter) = self._interface_emitter.Emit(
557 interface_template + '$!TOP_LEVEL', 556 interface_template + '$!TOP_LEVEL',
558 ID=typename, 557 ID=typename,
559 EXTENDS=extends_str) 558 EXTENDS=extends_str)
560 559
561 self._type_comment_emitter.Emit("/// @domName $DOMNAME", 560 self._type_comment_emitter.Emit("/// @domName $DOMNAME",
562 DOMNAME=self._interface.doc_js_name) 561 DOMNAME=self._interface.doc_js_name)
563 562
564 if self._backend.HasImplementation(): 563 if self._backend.HasImplementation():
565 path = self._backend.FilePathForDartImplementation() 564 path = self._backend.FilePathForDartImplementation()
566 self._system._dart_interface_file_paths.append(path) 565 self._system._dart_interface_file_paths.append(path)
567 self._implementation_emitter = self._system._emitters.FileEmitter(path) 566 self._implementation_emitter = self._system._emitters.FileEmitter(path)
568 else: 567 else:
569 self._implementation_emitter = emitter.Emitter() 568 self._implementation_emitter = emitter.Emitter()
570 self._backend.SetImplementationEmitter(self._implementation_emitter) 569 self._backend.SetImplementationEmitter(self._implementation_emitter)
571 self._implementation_members_emitter = self._backend.StartInterface() 570 self._implementation_members_emitter = self._backend.StartInterface()
572 571
573 for constructor_info in constructors: 572 for constructor_info in constructors:
574 self._members_emitter.Emit( 573 constructor_info.GenerateFactoryInvocation(
575 '\n' 574 self._DartType, self._members_emitter, factory_provider)
576 ' $CTOR($PARAMS);\n',
577 CTOR=self._DartType(constructor_info.ConstructorFullName()),
578 PARAMS=constructor_info.ParametersInterfaceDeclaration(self._DartType) )
579 575
580 element_type = MaybeTypedArrayElementTypeInHierarchy( 576 element_type = MaybeTypedArrayElementTypeInHierarchy(
581 self._interface, self._system._database) 577 self._interface, self._system._database)
582 if element_type: 578 if element_type:
583 self._members_emitter.Emit( 579 self._members_emitter.Emit(
584 '\n' 580 '\n'
585 ' $CTOR(int length);\n' 581 ' factory $CTOR(int length) =>\n'
582 ' $FACTORY.create$(CTOR)(length);\n'
586 '\n' 583 '\n'
587 ' $CTOR.fromList(List<$TYPE> list);\n' 584 ' factory $CTOR.fromList(List<$TYPE> list) =>\n'
585 ' $FACTORY.create$(CTOR)_fromList(list);\n'
588 '\n' 586 '\n'
589 ' $CTOR.fromBuffer(ArrayBuffer buffer,' 587 ' factory $CTOR.fromBuffer(ArrayBuffer buffer, [int byteOffset, int l ength]) => \n'
590 ' [int byteOffset, int length]);\n', 588 ' $FACTORY.create$(CTOR)_fromBuffer(buffer, byteOffset, length);\n' ,
591 CTOR=self._interface.id, 589 CTOR=self._interface.id,
592 TYPE=self._DartType(element_type)) 590 TYPE=self._DartType(element_type),
591 FACTORY=factory_provider)
593 592
594 self._GenerateEvents() 593 self._GenerateEvents()
595 594
596 old_backend = self._backend 595 old_backend = self._backend
597 if not self._backend.ImplementsMergedMembers(): 596 if not self._backend.ImplementsMergedMembers():
598 self._backend = HtmlGeneratorDummyBackend() 597 self._backend = HtmlGeneratorDummyBackend()
599 for merged_interface in _merged_html_interfaces: 598 for merged_interface in _merged_html_interfaces:
600 if _merged_html_interfaces[merged_interface] == self._interface.id: 599 if _merged_html_interfaces[merged_interface] == self._interface.id:
601 merged_interface = self._database.GetInterface(merged_interface) 600 merged_interface = self._database.GetInterface(merged_interface)
602 self.AddMembers(merged_interface) 601 self.AddMembers(merged_interface)
(...skipping 17 matching lines...) Expand all
620 self._interface.id, dom_name, 'set:') 619 self._interface.id, dom_name, 'set:')
621 read_only = IsReadOnly(attribute) or not html_setter_name 620 read_only = IsReadOnly(attribute) or not html_setter_name
622 621
623 # We don't yet handle inconsistent renames of the getter and setter yet. 622 # We don't yet handle inconsistent renames of the getter and setter yet.
624 assert(not html_setter_name or html_name == html_setter_name) 623 assert(not html_setter_name or html_name == html_setter_name)
625 624
626 if not is_secondary: 625 if not is_secondary:
627 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */', 626 self._members_emitter.Emit('\n /** @domName $DOMINTERFACE.$DOMNAME */',
628 DOMINTERFACE=attribute.doc_js_interface_name, 627 DOMINTERFACE=attribute.doc_js_interface_name,
629 DOMNAME=dom_name) 628 DOMNAME=dom_name)
630 modifier = 'final ' if read_only else '' 629 if read_only:
Anton Muhin 2012/09/17 10:11:29 nit: I'd prefer not to duplicate the logic here to
blois 2012/09/17 19:48:22 Done.
631 self._members_emitter.Emit('\n $MODIFIER$TYPE $NAME;\n', 630 self._members_emitter.Emit('\n abstract $TYPE get $NAME;\n',
632 MODIFIER=modifier, 631 NAME=html_name,
633 NAME=html_name, 632 TYPE=self._DartType(attribute.type.id))
634 TYPE=self._DartType(attribute.type.id)) 633 else:
634 self._members_emitter.Emit('\n $TYPE $NAME;\n',
635 NAME=html_name,
636 TYPE=self._DartType(attribute.type.id))
635 self._backend.AddAttribute(attribute, html_name, read_only) 637 self._backend.AddAttribute(attribute, html_name, read_only)
636 638
637 def AddSecondaryAttribute(self, interface, attribute): 639 def AddSecondaryAttribute(self, interface, attribute):
638 self._backend.SecondaryContext(interface) 640 self._backend.SecondaryContext(interface)
639 self.AddAttribute(attribute, True) 641 self.AddAttribute(attribute, True)
640 642
641 def AddOperation(self, info, skip_declaration=False): 643 def AddOperation(self, info, skip_declaration=False):
642 """ 644 """
643 Arguments: 645 Arguments:
644 operations - contains the overloads, one or more operations with the same 646 operations - contains the overloads, one or more operations with the same
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
692 parent_events_interface = self._shared.GetParentEventsClass(self._interface) 694 parent_events_interface = self._shared.GetParentEventsClass(self._interface)
693 parent_events_class = '_%sImpl' % parent_events_interface 695 parent_events_class = '_%sImpl' % parent_events_interface
694 696
695 if not event_attrs: 697 if not event_attrs:
696 self._EmitEventGetter(parent_events_interface, parent_events_class) 698 self._EmitEventGetter(parent_events_interface, parent_events_class)
697 return 699 return
698 700
699 self._EmitEventGetter(events_interface, events_class) 701 self._EmitEventGetter(events_interface, events_class)
700 702
701 events_members = self._interface_emitter.Emit( 703 events_members = self._interface_emitter.Emit(
702 '\ninterface $INTERFACE extends $PARENTS {\n$!MEMBERS}\n', 704 '\nabstract class $INTERFACE implements $PARENTS {\n$!MEMBERS}\n',
703 INTERFACE=events_interface, 705 INTERFACE=events_interface,
704 PARENTS=', '.join( 706 PARENTS=', '.join(
705 self._shared.GetParentsEventsClasses(self._interface))) 707 self._shared.GetParentsEventsClasses(self._interface)))
706 708
707 # TODO(jacobr): specify the type of _ptr as EventTarget 709 # TODO(jacobr): specify the type of _ptr as EventTarget
708 implementation_events_members = self._implementation_emitter.Emit( 710 implementation_events_members = self._implementation_emitter.Emit(
709 '\n' 711 '\n'
710 'class $CLASSNAME extends $SUPER implements $INTERFACE {\n' 712 'class $CLASSNAME extends $SUPER implements $INTERFACE {\n'
711 ' $CLASSNAME(_ptr) : super(_ptr);\n' 713 ' $CLASSNAME(_ptr) : super(_ptr);\n'
712 '$!MEMBERS}\n', 714 '$!MEMBERS}\n',
(...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after
1234 return HtmlDart2JSClassGenerator(self, interface) 1236 return HtmlDart2JSClassGenerator(self, interface)
1235 1237
1236 def GenerateLibraries(self, dart_files): 1238 def GenerateLibraries(self, dart_files):
1237 self._GenerateLibFile( 1239 self._GenerateLibFile(
1238 'html_dart2js.darttemplate', 1240 'html_dart2js.darttemplate',
1239 os.path.join(self._output_dir, 'html_dart2js.dart'), 1241 os.path.join(self._output_dir, 'html_dart2js.dart'),
1240 dart_files) 1242 dart_files)
1241 1243
1242 def Finish(self): 1244 def Finish(self):
1243 pass 1245 pass
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698