OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library resolution.compute_members; | 5 library resolution.compute_members; |
6 | 6 |
7 import '../elements/elements.dart' | 7 import '../elements/elements.dart' |
8 show Element, | 8 show Element, |
9 Name, | 9 Name, |
10 PublicName, | 10 PublicName, |
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
199 } else if (element.isGetter) { | 199 } else if (element.isGetter) { |
200 FunctionType functionType = element.computeType(compiler); | 200 FunctionType functionType = element.computeType(compiler); |
201 DartType type = functionType.returnType; | 201 DartType type = functionType.returnType; |
202 addDeclaredMember(name, type, functionType); | 202 addDeclaredMember(name, type, functionType); |
203 } else if (element.isSetter) { | 203 } else if (element.isSetter) { |
204 FunctionType functionType = element.computeType(compiler); | 204 FunctionType functionType = element.computeType(compiler); |
205 DartType type; | 205 DartType type; |
206 if (!functionType.parameterTypes.isEmpty) { | 206 if (!functionType.parameterTypes.isEmpty) { |
207 type = functionType.parameterTypes.head; | 207 type = functionType.parameterTypes.head; |
208 } else { | 208 } else { |
209 type = compiler.types.dynamicType; | 209 type = const DynamicType(); |
210 } | 210 } |
211 name = name.setter; | 211 name = name.setter; |
212 addDeclaredMember(name, type, functionType); | 212 addDeclaredMember(name, type, functionType); |
213 } else { | 213 } else { |
214 assert(invariant(element, element.isFunction)); | 214 assert(invariant(element, element.isFunction)); |
215 FunctionType type = element.computeType(compiler); | 215 FunctionType type = element.computeType(compiler); |
216 addDeclaredMember(name, type, type); | 216 addDeclaredMember(name, type, type); |
217 } | 217 } |
218 } | 218 } |
219 | 219 |
(...skipping 475 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
695 // version. | 695 // version. |
696 int minRequiredParameters; | 696 int minRequiredParameters; |
697 int maxPositionalParameters; | 697 int maxPositionalParameters; |
698 Set<String> names = new Set<String>(); | 698 Set<String> names = new Set<String>(); |
699 for (MemberSignature member in inheritedMembers) { | 699 for (MemberSignature member in inheritedMembers) { |
700 int requiredParameters = 0; | 700 int requiredParameters = 0; |
701 int optionalParameters = 0; | 701 int optionalParameters = 0; |
702 if (member.isSetter) { | 702 if (member.isSetter) { |
703 requiredParameters = 1; | 703 requiredParameters = 1; |
704 } | 704 } |
705 if (member.type.kind == TypeKind.FUNCTION) { | 705 if (member.type.isFunctionType) { |
706 FunctionType type = member.type; | 706 FunctionType type = member.type; |
707 type.namedParameters.forEach( | 707 type.namedParameters.forEach( |
708 (String name) => names.add(name)); | 708 (String name) => names.add(name)); |
709 requiredParameters = type.parameterTypes.slowLength(); | 709 requiredParameters = type.parameterTypes.slowLength(); |
710 optionalParameters = type.optionalParameterTypes.slowLength(); | 710 optionalParameters = type.optionalParameterTypes.slowLength(); |
711 } | 711 } |
712 int positionalParameters = requiredParameters + optionalParameters; | 712 int positionalParameters = requiredParameters + optionalParameters; |
713 if (minRequiredParameters == null || | 713 if (minRequiredParameters == null || |
714 minRequiredParameters > requiredParameters) { | 714 minRequiredParameters > requiredParameters) { |
715 minRequiredParameters = requiredParameters; | 715 minRequiredParameters = requiredParameters; |
716 } | 716 } |
717 if (maxPositionalParameters == null || | 717 if (maxPositionalParameters == null || |
718 maxPositionalParameters < positionalParameters) { | 718 maxPositionalParameters < positionalParameters) { |
719 maxPositionalParameters = positionalParameters; | 719 maxPositionalParameters = positionalParameters; |
720 } | 720 } |
721 } | 721 } |
722 int optionalParameters = | 722 int optionalParameters = |
723 maxPositionalParameters - minRequiredParameters; | 723 maxPositionalParameters - minRequiredParameters; |
724 // TODO(johnniwinther): Support function types with both optional | 724 // TODO(johnniwinther): Support function types with both optional |
725 // and named parameters? | 725 // and named parameters? |
726 if (optionalParameters == 0 || names.isEmpty) { | 726 if (optionalParameters == 0 || names.isEmpty) { |
727 Link<DartType> requiredParameterTypes = const Link<DartType>(); | 727 Link<DartType> requiredParameterTypes = const Link<DartType>(); |
728 while (--minRequiredParameters >= 0) { | 728 while (--minRequiredParameters >= 0) { |
729 requiredParameterTypes = | 729 requiredParameterTypes = |
730 requiredParameterTypes.prepend(compiler.types.dynamicType); | 730 requiredParameterTypes.prepend(const DynamicType()); |
731 } | 731 } |
732 Link<DartType> optionalParameterTypes = const Link<DartType>(); | 732 Link<DartType> optionalParameterTypes = const Link<DartType>(); |
733 while (--optionalParameters >= 0) { | 733 while (--optionalParameters >= 0) { |
734 optionalParameterTypes = | 734 optionalParameterTypes = |
735 optionalParameterTypes.prepend(compiler.types.dynamicType); | 735 optionalParameterTypes.prepend(const DynamicType()); |
736 } | 736 } |
737 Link<String> namedParameters = const Link<String>(); | 737 Link<String> namedParameters = const Link<String>(); |
738 Link<DartType> namedParameterTypes = const Link<DartType>(); | 738 Link<DartType> namedParameterTypes = const Link<DartType>(); |
739 List<String> namesReversed = | 739 List<String> namesReversed = |
740 names.toList()..sort((a, b) => -a.compareTo(b)); | 740 names.toList()..sort((a, b) => -a.compareTo(b)); |
741 for (String name in namesReversed) { | 741 for (String name in namesReversed) { |
742 namedParameters = namedParameters.prepend(name); | 742 namedParameters = namedParameters.prepend(name); |
743 namedParameterTypes = | 743 namedParameterTypes = |
744 namedParameterTypes.prepend(compiler.types.dynamicType); | 744 namedParameterTypes.prepend(const DynamicType()); |
745 } | 745 } |
746 FunctionType memberType = new FunctionType.synthesized( | 746 FunctionType memberType = new FunctionType.synthesized( |
747 compiler.types.dynamicType, | 747 const DynamicType(), |
748 requiredParameterTypes, | 748 requiredParameterTypes, |
749 optionalParameterTypes, | 749 optionalParameterTypes, |
750 namedParameters, namedParameterTypes); | 750 namedParameters, namedParameterTypes); |
751 DartType type = memberType; | 751 DartType type = memberType; |
752 if (inheritedMembers.first.isGetter || | 752 if (inheritedMembers.first.isGetter || |
753 inheritedMembers.first.isSetter) { | 753 inheritedMembers.first.isSetter) { |
754 type = compiler.types.dynamicType; | 754 type = const DynamicType(); |
755 } | 755 } |
756 interfaceMembers[name] = | 756 interfaceMembers[name] = |
757 new SyntheticMember(inheritedMembers, type, memberType); | 757 new SyntheticMember(inheritedMembers, type, memberType); |
758 } | 758 } |
759 } | 759 } |
760 } | 760 } |
761 | 761 |
762 abstract class ClassMemberMixin implements ClassElement { | 762 abstract class ClassMemberMixin implements ClassElement { |
763 /// When [classMembers] and [interfaceMembers] have not been fully computed | 763 /// When [classMembers] and [interfaceMembers] have not been fully computed |
764 /// [computedMembersNames] holds the names for which members have already been | 764 /// [computedMembersNames] holds the names for which members have already been |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
878 message: "Members have not been fully computed for $this.")); | 878 message: "Members have not been fully computed for $this.")); |
879 if (interfaceMembersAreClassMembers) { | 879 if (interfaceMembersAreClassMembers) { |
880 classMembers.forEach((_, member) { | 880 classMembers.forEach((_, member) { |
881 if (!member.isStatic) f(member); | 881 if (!member.isStatic) f(member); |
882 }); | 882 }); |
883 } else { | 883 } else { |
884 interfaceMembers.forEach((_, member) => f(member)); | 884 interfaceMembers.forEach((_, member) => f(member)); |
885 } | 885 } |
886 } | 886 } |
887 } | 887 } |
OLD | NEW |