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 from generator import AnalyzeOperation, ConstantOutputOrder, \ | 10 from generator import AnalyzeOperation, ConstantOutputOrder, \ |
(...skipping 524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
535 | 535 |
536 metadata = self._metadata.GetFormattedMetadata( | 536 metadata = self._metadata.GetFormattedMetadata( |
537 self._library_name, self._interface, self._interface.id, ' ') | 537 self._library_name, self._interface, self._interface.id, ' ') |
538 | 538 |
539 if not factory_constructor_name: | 539 if not factory_constructor_name: |
540 factory_constructor_name = '_create' | 540 factory_constructor_name = '_create' |
541 factory_parameters = constructor_info.ParametersAsArgumentList() | 541 factory_parameters = constructor_info.ParametersAsArgumentList() |
542 else: | 542 else: |
543 factory_parameters = ', '.join(constructor_info.factory_parameters) | 543 factory_parameters = ', '.join(constructor_info.factory_parameters) |
544 | 544 |
| 545 def InputType(type_name): |
| 546 conversion = self._InputConversion( |
| 547 type_name, constructor_info.declared_name) |
| 548 if conversion: |
| 549 return conversion.input_type |
| 550 else: |
| 551 return self._NarrowInputType(type_name) if type_name else 'dynamic' |
| 552 |
545 if constructor_info.pure_dart_constructor: | 553 if constructor_info.pure_dart_constructor: |
546 # TODO(antonm): use common dispatcher generation for this case as well. | 554 # TODO(antonm): use common dispatcher generation for this case as well. |
547 has_optional = any(param_info.is_optional | 555 has_optional = any(param_info.is_optional |
548 for param_info in constructor_info.param_infos) | 556 for param_info in constructor_info.param_infos) |
549 | 557 |
550 if not has_optional: | 558 if not has_optional: |
551 self._members_emitter.Emit( | 559 self._members_emitter.Emit( |
552 '\n $(METADATA)' | 560 '\n $(METADATA)' |
553 'factory $CTOR($PARAMS) => ' | 561 'factory $CTOR($PARAMS) => ' |
554 '$FACTORY.$CTOR_FACTORY_NAME($FACTORY_PARAMS);\n', | 562 '$FACTORY.$CTOR_FACTORY_NAME($FACTORY_PARAMS);\n', |
555 CTOR=constructor_info._ConstructorFullName(self._DartType), | 563 CTOR=constructor_info._ConstructorFullName(self._DartType), |
556 PARAMS=constructor_info.ParametersAsDeclaration(self._DartType), | 564 PARAMS=constructor_info.ParametersAsDeclaration(InputType), |
557 FACTORY=factory_name, | 565 FACTORY=factory_name, |
558 METADATA=metadata, | 566 METADATA=metadata, |
559 CTOR_FACTORY_NAME=factory_constructor_name, | 567 CTOR_FACTORY_NAME=factory_constructor_name, |
560 FACTORY_PARAMS=factory_parameters) | 568 FACTORY_PARAMS=factory_parameters) |
561 else: | 569 else: |
562 inits = self._members_emitter.Emit( | 570 inits = self._members_emitter.Emit( |
563 '\n $(METADATA)' | 571 '\n $(METADATA)' |
564 'factory $CONSTRUCTOR($PARAMS) {\n' | 572 'factory $CONSTRUCTOR($PARAMS) {\n' |
565 ' var e = $FACTORY.$CTOR_FACTORY_NAME($FACTORY_PARAMS);\n' | 573 ' var e = $FACTORY.$CTOR_FACTORY_NAME($FACTORY_PARAMS);\n' |
566 '$!INITS' | 574 '$!INITS' |
567 ' return e;\n' | 575 ' return e;\n' |
568 ' }\n', | 576 ' }\n', |
569 CONSTRUCTOR=constructor_info._ConstructorFullName(self._DartType), | 577 CONSTRUCTOR=constructor_info._ConstructorFullName(self._DartType), |
570 METADATA=metadata, | 578 METADATA=metadata, |
571 FACTORY=factory_name, | 579 FACTORY=factory_name, |
572 CTOR_FACTORY_NAME=factory_constructor_name, | 580 CTOR_FACTORY_NAME=factory_constructor_name, |
573 PARAMS=constructor_info.ParametersAsDeclaration(self._DartType), | 581 PARAMS=constructor_info.ParametersAsDeclaration(InputType), |
574 FACTORY_PARAMS=factory_parameters) | 582 FACTORY_PARAMS=factory_parameters) |
575 | 583 |
576 for index, param_info in enumerate(constructor_info.param_infos): | 584 for index, param_info in enumerate(constructor_info.param_infos): |
577 if param_info.is_optional: | 585 if param_info.is_optional: |
578 inits.Emit(' if ($E != null) e.$E = $E;\n', E=param_info.name) | 586 inits.Emit(' if ($E != null) e.$E = $E;\n', E=param_info.name) |
579 else: | 587 else: |
580 custom_factory_ctr = self._interface.id in _custom_factories | 588 custom_factory_ctr = self._interface.id in _custom_factories |
581 constructor_full_name = constructor_info._ConstructorFullName( | 589 constructor_full_name = constructor_info._ConstructorFullName( |
582 self._DartType) | 590 self._DartType) |
583 | 591 |
584 def GenerateCall( | 592 def GenerateCall( |
585 stmts_emitter, call_emitter, | 593 stmts_emitter, call_emitter, |
586 version, signature_index, argument_count): | 594 version, signature_index, argument_count): |
587 name = emitter.Format('_create_$VERSION', VERSION=version) | 595 name = emitter.Format('_create_$VERSION', VERSION=version) |
588 arguments = constructor_info.idl_args[signature_index][:argument_count] | 596 arguments = constructor_info.idl_args[signature_index][:argument_count] |
| 597 args = None |
589 if self._dart_use_blink: | 598 if self._dart_use_blink: |
590 type_ids = [p.type.id for p in arguments] | 599 type_ids = [p.type.id for p in arguments] |
591 base_name, rs = \ | 600 base_name, rs = \ |
592 self.DeriveNativeEntry("constructorCallback", 'Constructor', arg
ument_count) | 601 self.DeriveNativeEntry("constructorCallback", 'Constructor', arg
ument_count) |
593 qualified_name = \ | 602 qualified_name = \ |
594 self.DeriveQualifiedBlinkName(self._interface.id, | 603 self.DeriveQualifiedBlinkName(self._interface.id, |
595 base_name) | 604 base_name) |
| 605 args = constructor_info.ParametersAsArgumentList(argument_count) |
596 else: | 606 else: |
597 qualified_name = emitter.Format( | 607 qualified_name = emitter.Format( |
598 '$FACTORY.$NAME', | 608 '$FACTORY.$NAME', |
599 FACTORY=factory_name, | 609 FACTORY=factory_name, |
600 NAME=name) | 610 NAME=name) |
| 611 (factory_params, converted_arguments) = self._ConvertArgumentTypes( |
| 612 stmts_emitter, arguments, argument_count, constructor_info) |
| 613 args = ', '.join(converted_arguments) |
601 call_emitter.Emit('$FACTORY_NAME($FACTORY_PARAMS)', | 614 call_emitter.Emit('$FACTORY_NAME($FACTORY_PARAMS)', |
602 FACTORY_NAME=qualified_name, | 615 FACTORY_NAME=qualified_name, |
603 FACTORY_PARAMS= \ | 616 FACTORY_PARAMS=args) |
604 constructor_info.ParametersAsArgumentList(argument_count)) | |
605 self.EmitStaticFactoryOverload(constructor_info, name, arguments) | 617 self.EmitStaticFactoryOverload(constructor_info, name, arguments) |
606 | 618 |
607 def IsOptional(signature_index, argument): | 619 def IsOptional(signature_index, argument): |
608 return self.IsConstructorArgumentOptional(argument) | 620 return self.IsConstructorArgumentOptional(argument) |
609 | 621 |
610 entry_declaration = emitter.Format( | 622 entry_declaration = emitter.Format( |
611 '$(METADATA)$FACTORY_KEYWORD $CTOR($PARAMS)', | 623 '$(METADATA)$FACTORY_KEYWORD $CTOR($PARAMS)', |
612 FACTORY_KEYWORD=('factory' if not custom_factory_ctr else | 624 FACTORY_KEYWORD=('factory' if not custom_factory_ctr else |
613 'static %s' % constructor_full_name), | 625 'static %s' % constructor_full_name), |
614 CTOR=(('' if not custom_factory_ctr else '_factory') | 626 CTOR=(('' if not custom_factory_ctr else '_factory') |
615 + constructor_full_name), | 627 + constructor_full_name), |
616 METADATA=metadata, | 628 METADATA=metadata, |
617 PARAMS=constructor_info.ParametersAsDeclaration(self._DartType)) | 629 PARAMS=constructor_info.ParametersAsDeclaration(InputType)) |
618 | 630 |
619 overload_emitter = self._members_emitter | 631 overload_emitter = self._members_emitter |
620 overload_declaration = entry_declaration | 632 overload_declaration = entry_declaration |
621 | 633 |
622 self._GenerateOverloadDispatcher( | 634 self._GenerateOverloadDispatcher( |
623 constructor_info, | 635 constructor_info, |
624 constructor_info.idl_args, | 636 constructor_info.idl_args, |
625 False, | 637 False, |
626 overload_declaration, | 638 overload_declaration, |
627 GenerateCall, | 639 GenerateCall, |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
778 return self._type_registry.TypeInfo(type_name).narrow_dart_type() | 790 return self._type_registry.TypeInfo(type_name).narrow_dart_type() |
779 | 791 |
780 def _NarrowInputType(self, type_name): | 792 def _NarrowInputType(self, type_name): |
781 return self._NarrowToImplementationType(type_name) | 793 return self._NarrowToImplementationType(type_name) |
782 | 794 |
783 def _DartType(self, type_name): | 795 def _DartType(self, type_name): |
784 return self._type_registry.DartType(type_name) | 796 return self._type_registry.DartType(type_name) |
785 | 797 |
786 def _TypeInfo(self, type_name): | 798 def _TypeInfo(self, type_name): |
787 return self._type_registry.TypeInfo(type_name) | 799 return self._type_registry.TypeInfo(type_name) |
OLD | NEW |