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 import logging | 10 import logging |
(...skipping 476 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
487 self._interface) | 487 self._interface) |
488 | 488 |
489 code.Emit('$(ANNOTATIONS)typedef void $NAME($PARAMS);\n', | 489 code.Emit('$(ANNOTATIONS)typedef void $NAME($PARAMS);\n', |
490 ANNOTATIONS=annotations, | 490 ANNOTATIONS=annotations, |
491 NAME=typedef_name, | 491 NAME=typedef_name, |
492 PARAMS=info.ParametersAsDeclaration(self._DartType)) | 492 PARAMS=info.ParametersAsDeclaration(self._DartType)) |
493 self._backend.GenerateCallback(info) | 493 self._backend.GenerateCallback(info) |
494 | 494 |
495 def GenerateInterface(self): | 495 def GenerateInterface(self): |
496 interface_name = self._interface_type_info.interface_name() | 496 interface_name = self._interface_type_info.interface_name() |
497 | |
498 implementation_name = self._interface_type_info.implementation_name() | 497 implementation_name = self._interface_type_info.implementation_name() |
499 self._library_emitter.AddTypeEntry(self._library_name, | 498 self._library_emitter.AddTypeEntry(self._library_name, |
500 self._interface.id, implementation_name) | 499 self._interface.id, implementation_name) |
501 | 500 |
502 factory_provider = None | 501 factory_provider = None |
503 if interface_name in interface_factories: | 502 if interface_name in interface_factories: |
504 factory_provider = interface_factories[interface_name] | 503 factory_provider = interface_factories[interface_name] |
505 factory_constructor_name = None | 504 factory_constructor_name = None |
506 | 505 |
507 constructors = [] | 506 constructors = [] |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
553 secure_base_name = self._backend.SecureBaseName(interface_name) | 552 secure_base_name = self._backend.SecureBaseName(interface_name) |
554 if secure_base_name: | 553 if secure_base_name: |
555 implements.append(secure_base_name) | 554 implements.append(secure_base_name) |
556 | 555 |
557 implements_str = '' | 556 implements_str = '' |
558 if implements: | 557 if implements: |
559 implements_str = ' implements ' + ', '.join(set(implements)) | 558 implements_str = ' implements ' + ', '.join(set(implements)) |
560 | 559 |
561 mixins = self._backend.Mixins() | 560 mixins = self._backend.Mixins() |
562 | 561 |
| 562 # TODO(terry): Do we need a more generic solution other than handling NamedN
odeMap |
| 563 # we can't call super on a mixin interface - yet. |
| 564 if self._options.templates._conditions['DARTIUM'] and self._options.dart_js_
interop and self._interface.id == 'NamedNodeMap': |
| 565 mixins = None |
563 mixins_str = '' | 566 mixins_str = '' |
564 if mixins: | 567 if mixins: |
565 mixins_str = ' with ' + ', '.join(mixins) | 568 mixins_str = ' with ' + ', '.join(mixins) |
566 if not base_class: | 569 if not base_class: |
567 base_class = 'Interceptor' | 570 base_class = 'Interceptor' |
568 elif (base_class == 'NativeFieldWrapperClass2' and | |
569 self._options.dart_js_interop and | |
570 not(isinstance(self._backend, Dart2JSBackend))): | |
571 base_class = 'JsoNativeFieldWrapper' | |
572 | 571 |
573 annotations = self._metadata.GetFormattedMetadata( | 572 annotations = self._metadata.GetFormattedMetadata( |
574 self._library_name, self._interface, None, '') | 573 self._library_name, self._interface, None, '') |
575 | 574 |
576 class_modifiers = '' | 575 class_modifiers = '' |
577 if (self._renamer.ShouldSuppressInterface(self._interface) or | 576 if (self._renamer.ShouldSuppressInterface(self._interface) or |
578 IsPureInterface(self._interface.id)): | 577 IsPureInterface(self._interface.id)): |
579 # XMLHttpRequestProgressEvent can't be abstract we need to instantiate | 578 # XMLHttpRequestProgressEvent can't be abstract we need to instantiate |
580 # for JsInterop. | 579 # for JsInterop. |
581 if (not(isinstance(self._backend, Dart2JSBackend)) and | 580 if (not(isinstance(self._backend, Dart2JSBackend)) and |
582 self._interface.id == 'XMLHttpRequestProgressEvent'): | 581 self._interface.id == 'XMLHttpRequestProgressEvent'): |
583 # Only suppress abstract for XMLHttpRequestProgressEvent for Dartium. | 582 # Only suppress abstract for XMLHttpRequestProgressEvent for Dartium. |
584 # Need to be able to instantiate the class; can't be abstract. | 583 # Need to be able to instantiate the class; can't be abstract. |
585 class_modifiers = '' | 584 class_modifiers = '' |
586 else: | 585 else: |
587 # For Dartium w/ JsInterop these suppressed interfaces are needed to | 586 class_modifiers = 'abstract ' |
588 # instanciate the internal classes when wrap_jso is called for a JS obje
ct. | |
589 if (self._renamer.ShouldSuppressInterface(self._interface) and | |
590 not(isinstance(self._backend, Dart2JSBackend)) and | |
591 self._options.dart_js_interop): | |
592 class_modifiers = '' | |
593 else: | |
594 class_modifiers = 'abstract ' | |
595 | 587 |
596 native_spec = '' | 588 native_spec = '' |
597 if not IsPureInterface(self._interface.id): | 589 if not IsPureInterface(self._interface.id): |
598 native_spec = self._backend.NativeSpec() | 590 native_spec = self._backend.NativeSpec() |
599 | 591 |
600 class_name = self._interface_type_info.implementation_name() | 592 class_name = self._interface_type_info.implementation_name() |
601 | 593 |
602 js_interop_equivalence_op = \ | 594 js_interop_equivalence_op = \ |
603 ' bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || ide
ntical(this, other);\n' \ | 595 ' bool operator ==(other) => unwrap_jso(other) == unwrap_jso(this) || ide
ntical(this, other);\n' |
604 + ' int get hashCode => unwrap_jso(this).hashCode;\n' | |
605 # ClientRect overrides the equivalence operator. | 596 # ClientRect overrides the equivalence operator. |
606 if interface_name == 'ClientRect' or interface_name == 'DomRectReadOnly': | 597 if interface_name == 'ClientRect' or interface_name == 'DomRectReadOnly': |
607 js_interop_equivalence_op = '' | 598 js_interop_equivalence_op = '' |
608 | 599 |
609 js_interop_wrapper = ''' | 600 js_interop_wrapper = ''' |
610 | 601 |
611 static {0} internalCreate{0}() {{ | 602 static {0} internalCreate{0}() {{ |
612 return new {0}._internalWrap(); | 603 return new {0}._internalWrap(); |
613 }} | 604 }} |
614 | 605 |
615 factory {0}._internalWrap() {{ | 606 factory {0}._internalWrap() {{ |
616 return new {0}.internal_(); | 607 return new {0}._internal(); |
617 }} | 608 }} |
618 | 609 |
619 {0}.internal_() : super.internal_(); | 610 {0}._internal() : super._internal(); |
620 | 611 |
621 '''.format(class_name) | 612 '''.format(class_name) |
622 if base_class == 'NativeFieldWrapperClass2' or base_class == 'JsoNativeField
Wrapper': | 613 """ |
| 614 TODO(terry): Don't use Dart expando really don't need. |
| 615 final Object expandoJsObject = new Object(); |
| 616 final Expando<JsObject> dartium_expando = new Expando<JsObject>("Expando_j
sObject"); |
| 617 """ |
| 618 if base_class == 'NativeFieldWrapperClass2': |
623 js_interop_wrapper = ''' | 619 js_interop_wrapper = ''' |
624 static {0} internalCreate{0}() {{ | 620 static {0} internalCreate{0}() {{ |
625 return new {0}._internalWrap(); | 621 return new {0}._internalWrap(); |
626 }} | 622 }} |
627 | 623 |
628 js.JsObject blink_jsObject; | 624 JsObject blink_jsObject = null; |
629 | 625 |
630 factory {0}._internalWrap() {{ | 626 factory {0}._internalWrap() {{ |
631 return new {0}.internal_(); | 627 return new {0}._internal(); |
632 }} | 628 }} |
633 | 629 |
634 {0}.internal_() {{ }} | 630 {0}._internal() {{ }} |
635 | 631 |
636 {1}'''.format(class_name, js_interop_equivalence_op) | 632 {1}'''.format(class_name, js_interop_equivalence_op) |
637 # Change to use the synthesized class so we can construct with a mixin | |
638 # classes prefixed with name of NativeFieldWrapperClass2 don't have a | |
639 # default constructor so classes with mixins can't be new'd. | |
640 if (self._options.templates._conditions['DARTIUM'] and | |
641 self._options.dart_js_interop and | |
642 (self._interface.id == 'NamedNodeMap' or | |
643 self._interface.id == 'CSSStyleDeclaration')): | |
644 base_class = 'JsoNativeFieldWrapper' | |
645 | 633 |
646 implementation_members_emitter = implementation_emitter.Emit( | 634 implementation_members_emitter = implementation_emitter.Emit( |
647 self._backend.ImplementationTemplate(), | 635 self._backend.ImplementationTemplate(), |
648 LIBRARYNAME='dart.dom.%s' % self._library_name, | 636 LIBRARYNAME='dart.dom.%s' % self._library_name, |
649 ANNOTATIONS=annotations, | 637 ANNOTATIONS=annotations, |
650 CLASS_MODIFIERS=class_modifiers, | 638 CLASS_MODIFIERS=class_modifiers, |
651 CLASSNAME=class_name, | 639 CLASSNAME=self._interface_type_info.implementation_name(), |
652 EXTENDS=' extends %s' % base_class if base_class else '', | 640 EXTENDS=' extends %s' % base_class if base_class else '', |
653 IMPLEMENTS=implements_str, | 641 IMPLEMENTS=implements_str, |
654 MIXINS=mixins_str, | 642 MIXINS=mixins_str, |
655 DOMNAME=self._interface.doc_js_name, | 643 DOMNAME=self._interface.doc_js_name, |
656 NATIVESPEC=native_spec) | 644 NATIVESPEC=native_spec) |
657 stream_getter_signatures_emitter = None | 645 stream_getter_signatures_emitter = None |
658 element_stream_getters_emitter = None | 646 element_stream_getters_emitter = None |
659 if type(implementation_members_emitter) == tuple: | 647 if type(implementation_members_emitter) == tuple: |
660 # We add event stream getters for both Element and ElementList, so in | 648 # We add event stream getters for both Element and ElementList, so in |
661 # impl_Element.darttemplate, we have two additional "holes" for emitters | 649 # impl_Element.darttemplate, we have two additional "holes" for emitters |
(...skipping 16 matching lines...) Expand all Loading... |
678 constructors, factory_provider, factory_constructor_name) | 666 constructors, factory_provider, factory_constructor_name) |
679 | 667 |
680 isElement = False | 668 isElement = False |
681 for parent in self._database.Hierarchy(self._interface): | 669 for parent in self._database.Hierarchy(self._interface): |
682 if parent.id == 'Element': | 670 if parent.id == 'Element': |
683 isElement = True | 671 isElement = True |
684 | 672 |
685 # Write out the JsInterop code. | 673 # Write out the JsInterop code. |
686 if (implementation_members_emitter and | 674 if (implementation_members_emitter and |
687 self._options.templates._conditions['DARTIUM'] and | 675 self._options.templates._conditions['DARTIUM'] and |
688 self._options.dart_js_interop and | 676 self._options.dart_js_interop): |
689 not IsPureInterface(class_name)): | |
690 implementation_members_emitter.Emit(js_interop_wrapper) | 677 implementation_members_emitter.Emit(js_interop_wrapper) |
691 | 678 |
692 if isElement and self._interface.id != 'Element': | 679 if isElement and self._interface.id != 'Element': |
693 implementation_members_emitter.Emit( | 680 implementation_members_emitter.Emit( |
694 ' /**\n' | 681 ' /**\n' |
695 ' * Constructor instantiated by the DOM when a custom element has be
en created.\n' | 682 ' * Constructor instantiated by the DOM when a custom element has be
en created.\n' |
696 ' *\n' | 683 ' *\n' |
697 ' * This can only be called by subclasses from their created constru
ctor.\n' | 684 ' * This can only be called by subclasses from their created constru
ctor.\n' |
698 ' */\n' | 685 ' */\n' |
699 ' $CLASSNAME.created() : super.created();\n', | 686 ' $CLASSNAME.created() : super.created();\n', |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
986 TYPE=return_type, | 973 TYPE=return_type, |
987 NATIVE_TYPE=native_type) | 974 NATIVE_TYPE=native_type) |
988 | 975 |
989 def _AddRenamingSetter(self, attr, html_name): | 976 def _AddRenamingSetter(self, attr, html_name): |
990 | 977 |
991 conversion = self._InputConversion(attr.type.id, attr.id) | 978 conversion = self._InputConversion(attr.type.id, attr.id) |
992 if conversion: | 979 if conversion: |
993 return self._AddConvertingSetter(attr, html_name, conversion) | 980 return self._AddConvertingSetter(attr, html_name, conversion) |
994 self._members_emitter.Emit( | 981 self._members_emitter.Emit( |
995 # TODO(sra): Use metadata to provide native name. | 982 # TODO(sra): Use metadata to provide native name. |
996 '\n set $HTML_NAME($TYPE value) {' | 983 '\n void set $HTML_NAME($TYPE value) {' |
997 '\n JS("void", "#.$NAME = #", this, value);' | 984 '\n JS("void", "#.$NAME = #", this, value);' |
998 '\n }' | 985 '\n }' |
999 '\n', | 986 '\n', |
1000 HTML_NAME=html_name, | 987 HTML_NAME=html_name, |
1001 NAME=attr.id, | 988 NAME=attr.id, |
1002 TYPE=self._NarrowInputType(attr.type.id)) | 989 TYPE=self._NarrowInputType(attr.type.id)) |
1003 | 990 |
1004 def _AddConvertingGetter(self, attr, html_name, conversion): | 991 def _AddConvertingGetter(self, attr, html_name, conversion): |
1005 self._members_emitter.Emit( | 992 self._members_emitter.Emit( |
1006 '\n $(METADATA)$RETURN_TYPE get $HTML_NAME => ' | 993 '\n $(METADATA)$RETURN_TYPE get $HTML_NAME => ' |
1007 '$CONVERT(this._get_$(HTML_NAME));' | 994 '$CONVERT(this._get_$(HTML_NAME));' |
1008 "\n @JSName('$NAME')" | 995 "\n @JSName('$NAME')" |
1009 '\n $(JS_METADATA)final $NATIVE_TYPE _get_$HTML_NAME;' | 996 '\n $(JS_METADATA)final $NATIVE_TYPE _get_$HTML_NAME;' |
1010 '\n', | 997 '\n', |
1011 METADATA=self._metadata.GetFormattedMetadata( | 998 METADATA=self._metadata.GetFormattedMetadata( |
1012 self._library_name, self._interface, html_name, ' '), | 999 self._library_name, self._interface, html_name, ' '), |
1013 JS_METADATA=self._Metadata(attr.type.id, html_name, conversion.input_typ
e), | 1000 JS_METADATA=self._Metadata(attr.type.id, html_name, conversion.input_typ
e), |
1014 CONVERT=conversion.function_name, | 1001 CONVERT=conversion.function_name, |
1015 HTML_NAME=html_name, | 1002 HTML_NAME=html_name, |
1016 NAME=attr.id, | 1003 NAME=attr.id, |
1017 RETURN_TYPE=conversion.output_type, | 1004 RETURN_TYPE=conversion.output_type, |
1018 NATIVE_TYPE=conversion.input_type) | 1005 NATIVE_TYPE=conversion.input_type) |
1019 | 1006 |
1020 def _AddConvertingSetter(self, attr, html_name, conversion): | 1007 def _AddConvertingSetter(self, attr, html_name, conversion): |
1021 self._members_emitter.Emit( | 1008 self._members_emitter.Emit( |
1022 # TODO(sra): Use metadata to provide native name. | 1009 # TODO(sra): Use metadata to provide native name. |
1023 '\n set $HTML_NAME($INPUT_TYPE value) {' | 1010 '\n void set $HTML_NAME($INPUT_TYPE value) {' |
1024 '\n this._set_$HTML_NAME = $CONVERT(value);' | 1011 '\n this._set_$HTML_NAME = $CONVERT(value);' |
1025 '\n }' | 1012 '\n }' |
1026 '\n set _set_$HTML_NAME(/*$NATIVE_TYPE*/ value) {' | 1013 '\n void set _set_$HTML_NAME(/*$NATIVE_TYPE*/ value) {' |
1027 '\n JS("void", "#.$NAME = #", this, value);' | 1014 '\n JS("void", "#.$NAME = #", this, value);' |
1028 '\n }' | 1015 '\n }' |
1029 '\n', | 1016 '\n', |
1030 CONVERT=conversion.function_name, | 1017 CONVERT=conversion.function_name, |
1031 HTML_NAME=html_name, | 1018 HTML_NAME=html_name, |
1032 NAME=attr.id, | 1019 NAME=attr.id, |
1033 INPUT_TYPE=conversion.input_type, | 1020 INPUT_TYPE=conversion.input_type, |
1034 NATIVE_TYPE=conversion.output_type) | 1021 NATIVE_TYPE=conversion.output_type) |
1035 | 1022 |
1036 def AmendIndexer(self, element_type): | 1023 def AmendIndexer(self, element_type): |
(...skipping 28 matching lines...) Expand all Loading... |
1065 '\n' | 1052 '\n' |
1066 ' $RENAME$METADATA$MODIFIERS$TYPE $NAME($PARAMS) native;\n', | 1053 ' $RENAME$METADATA$MODIFIERS$TYPE $NAME($PARAMS) native;\n', |
1067 RENAME=self._RenamingAnnotation(info.declared_name, html_name), | 1054 RENAME=self._RenamingAnnotation(info.declared_name, html_name), |
1068 METADATA=self._Metadata(info.type_name, info.declared_name, | 1055 METADATA=self._Metadata(info.type_name, info.declared_name, |
1069 self.SecureOutputType(info.type_name)), | 1056 self.SecureOutputType(info.type_name)), |
1070 MODIFIERS='static ' if info.IsStatic() else '', | 1057 MODIFIERS='static ' if info.IsStatic() else '', |
1071 TYPE=self.SecureOutputType(info.type_name, False, True), | 1058 TYPE=self.SecureOutputType(info.type_name, False, True), |
1072 NAME=html_name, | 1059 NAME=html_name, |
1073 PARAMS=info.ParametersAsDeclaration(self._NarrowInputType)) | 1060 PARAMS=info.ParametersAsDeclaration(self._NarrowInputType)) |
1074 | 1061 |
| 1062 def _ConvertArgumentTypes( |
| 1063 self, stmts_emitter, arguments, argument_count, info): |
| 1064 temp_version = [0] |
| 1065 converted_arguments = [] |
| 1066 target_parameters = [] |
| 1067 for position, arg in enumerate(arguments[:argument_count]): |
| 1068 conversion = self._InputConversion(arg.type.id, info.declared_name) |
| 1069 param_name = arguments[position].id |
| 1070 if conversion: |
| 1071 temp_version[0] += 1 |
| 1072 temp_name = '%s_%s' % (param_name, temp_version[0]) |
| 1073 temp_type = conversion.output_type |
| 1074 stmts_emitter.Emit( |
| 1075 '$(INDENT)$TYPE $NAME = $CONVERT($ARG);\n', |
| 1076 TYPE=TypeOrVar(temp_type), |
| 1077 NAME=temp_name, |
| 1078 CONVERT=conversion.function_name, |
| 1079 ARG=info.param_infos[position].name) |
| 1080 converted_arguments.append(temp_name) |
| 1081 param_type = temp_type |
| 1082 verified_type = temp_type # verified by assignment in checked mode. |
| 1083 else: |
| 1084 converted_arguments.append(info.param_infos[position].name) |
| 1085 param_type = self._NarrowInputType(arg.type.id) |
| 1086 # Verified by argument checking on entry to the dispatcher. |
| 1087 |
| 1088 verified_type = self._InputType( |
| 1089 info.param_infos[position].type_id, info) |
| 1090 # The native method does not need an argument type if we know the type. |
| 1091 # But we do need the native methods to have correct function types, so |
| 1092 # be conservative. |
| 1093 if param_type == verified_type: |
| 1094 if param_type in ['String', 'num', 'int', 'double', 'bool', 'Object']: |
| 1095 param_type = 'dynamic' |
| 1096 |
| 1097 target_parameters.append( |
| 1098 '%s%s' % (TypeOrNothing(param_type), param_name)) |
| 1099 |
| 1100 return target_parameters, converted_arguments |
| 1101 |
| 1102 def _InputType(self, type_name, info): |
| 1103 conversion = self._InputConversion(type_name, info.declared_name) |
| 1104 if conversion: |
| 1105 return conversion.input_type |
| 1106 else: |
| 1107 return self._NarrowInputType(type_name) if type_name else 'dynamic' |
| 1108 |
1075 def _AddOperationWithConversions(self, info, html_name): | 1109 def _AddOperationWithConversions(self, info, html_name): |
1076 # Assert all operations have same return type. | 1110 # Assert all operations have same return type. |
1077 assert len(set([op.type.id for op in info.operations])) == 1 | 1111 assert len(set([op.type.id for op in info.operations])) == 1 |
1078 output_conversion = self._OutputConversion(info.type_name, | 1112 output_conversion = self._OutputConversion(info.type_name, |
1079 info.declared_name) | 1113 info.declared_name) |
1080 if output_conversion: | 1114 if output_conversion: |
1081 return_type = output_conversion.output_type | 1115 return_type = output_conversion.output_type |
1082 native_return_type = output_conversion.input_type | 1116 native_return_type = output_conversion.input_type |
1083 else: | 1117 else: |
1084 return_type = self._NarrowInputType(info.type_name) | 1118 return_type = self._NarrowInputType(info.type_name) |
(...skipping 220 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1305 map_emitter.Emit( | 1339 map_emitter.Emit( |
1306 " '$IDL_NAME': () => $DART_NAME,\n", | 1340 " '$IDL_NAME': () => $DART_NAME,\n", |
1307 IDL_NAME=idl_name, | 1341 IDL_NAME=idl_name, |
1308 DART_NAME=dart_name) | 1342 DART_NAME=dart_name) |
1309 | 1343 |
1310 # Emit the $!TYPE_FUNCTION_MAP | 1344 # Emit the $!TYPE_FUNCTION_MAP |
1311 if function_emitter: | 1345 if function_emitter: |
1312 items = self._typeMap.items() | 1346 items = self._typeMap.items() |
1313 items.sort() | 1347 items.sort() |
1314 for (idl_name, dart_name) in items: | 1348 for (idl_name, dart_name) in items: |
1315 if not IsPureInterface(dart_name): | 1349 function_emitter.Emit( |
1316 # Handle classes that are concrete (abstract can't be instantiated). | 1350 " '$IDL_NAME': () => $DART_NAME.internalCreate$DART_NAME,\n", |
1317 function_emitter.Emit( | 1351 IDL_NAME=idl_name, |
1318 " '$IDL_NAME': () => $DART_NAME.internalCreate$DART_NAME,\n", | 1352 DART_NAME=dart_name) |
1319 IDL_NAME=idl_name, | |
1320 DART_NAME=dart_name) | |
1321 if self._dart_path.endswith('html_dartium.dart'): | 1353 if self._dart_path.endswith('html_dartium.dart'): |
1322 function_emitter.Emit(" 'polymer-element': () => HtmlElement.internalCr
eateHtmlElement,\n") | 1354 function_emitter.Emit(" 'polymer-element': () => HtmlElement.internalCr
eateHtmlElement,\n") |
1323 | 1355 |
1324 | 1356 |
1325 # ------------------------------------------------------------------------------ | 1357 # ------------------------------------------------------------------------------ |
1326 | 1358 |
1327 class DartLibraries(): | 1359 class DartLibraries(): |
1328 def __init__(self, libraries, template_loader, library_type, output_dir, dart_
js_interop): | 1360 def __init__(self, libraries, template_loader, library_type, output_dir, dart_
js_interop): |
1329 self._libraries = {} | 1361 self._libraries = {} |
1330 for library_name in libraries: | 1362 for library_name in libraries: |
1331 self._libraries[library_name] = DartLibrary( | 1363 self._libraries[library_name] = DartLibrary( |
1332 library_name, template_loader, library_type, output_dir, dart_js_inter
op) | 1364 library_name, template_loader, library_type, output_dir, dart_js_inter
op) |
1333 | 1365 |
1334 def AddFile(self, basename, library_name, path): | 1366 def AddFile(self, basename, library_name, path): |
1335 self._libraries[library_name].AddFile(path) | 1367 self._libraries[library_name].AddFile(path) |
1336 | 1368 |
1337 def AddTypeEntry(self, library_name, idl_name, dart_name): | 1369 def AddTypeEntry(self, library_name, idl_name, dart_name): |
1338 self._libraries[library_name].AddTypeEntry(idl_name, dart_name) | 1370 self._libraries[library_name].AddTypeEntry(idl_name, dart_name) |
1339 | 1371 |
1340 def Emit(self, emitter, auxiliary_dir): | 1372 def Emit(self, emitter, auxiliary_dir): |
1341 for lib in self._libraries.values(): | 1373 for lib in self._libraries.values(): |
1342 lib.Emit(emitter, auxiliary_dir) | 1374 lib.Emit(emitter, auxiliary_dir) |
OLD | NEW |