| 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 176 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 187 } | 187 } |
| 188 | 188 |
| 189 Name name = new Name(element.name, library); | 189 Name name = new Name(element.name, library); |
| 190 if (element.isField) { | 190 if (element.isField) { |
| 191 DartType type = element.computeType(compiler); | 191 DartType type = element.computeType(compiler); |
| 192 addDeclaredMember(name, type, new FunctionType.synthesized(type)); | 192 addDeclaredMember(name, type, new FunctionType.synthesized(type)); |
| 193 if (!element.isConst && !element.isFinal) { | 193 if (!element.isConst && !element.isFinal) { |
| 194 addDeclaredMember(name.setter, type, | 194 addDeclaredMember(name.setter, type, |
| 195 new FunctionType.synthesized( | 195 new FunctionType.synthesized( |
| 196 const VoidType(), | 196 const VoidType(), |
| 197 const Link<DartType>().prepend(type))); | 197 <DartType>[type])); |
| 198 } | 198 } |
| 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.first; |
| 208 } else { | 208 } else { |
| 209 type = const 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 } |
| (...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 719 for (MemberSignature member in inheritedMembers) { | 719 for (MemberSignature member in inheritedMembers) { |
| 720 int requiredParameters = 0; | 720 int requiredParameters = 0; |
| 721 int optionalParameters = 0; | 721 int optionalParameters = 0; |
| 722 if (member.isSetter) { | 722 if (member.isSetter) { |
| 723 requiredParameters = 1; | 723 requiredParameters = 1; |
| 724 } | 724 } |
| 725 if (member.type.isFunctionType) { | 725 if (member.type.isFunctionType) { |
| 726 FunctionType type = member.type; | 726 FunctionType type = member.type; |
| 727 type.namedParameters.forEach( | 727 type.namedParameters.forEach( |
| 728 (String name) => names.add(name)); | 728 (String name) => names.add(name)); |
| 729 requiredParameters = type.parameterTypes.slowLength(); | 729 requiredParameters = type.parameterTypes.length; |
| 730 optionalParameters = type.optionalParameterTypes.slowLength(); | 730 optionalParameters = type.optionalParameterTypes.length; |
| 731 } | 731 } |
| 732 int positionalParameters = requiredParameters + optionalParameters; | 732 int positionalParameters = requiredParameters + optionalParameters; |
| 733 if (minRequiredParameters == null || | 733 if (minRequiredParameters == null || |
| 734 minRequiredParameters > requiredParameters) { | 734 minRequiredParameters > requiredParameters) { |
| 735 minRequiredParameters = requiredParameters; | 735 minRequiredParameters = requiredParameters; |
| 736 } | 736 } |
| 737 if (maxPositionalParameters == null || | 737 if (maxPositionalParameters == null || |
| 738 maxPositionalParameters < positionalParameters) { | 738 maxPositionalParameters < positionalParameters) { |
| 739 maxPositionalParameters = positionalParameters; | 739 maxPositionalParameters = positionalParameters; |
| 740 } | 740 } |
| 741 } | 741 } |
| 742 int optionalParameters = | 742 int optionalParameters = |
| 743 maxPositionalParameters - minRequiredParameters; | 743 maxPositionalParameters - minRequiredParameters; |
| 744 // TODO(johnniwinther): Support function types with both optional | 744 // TODO(johnniwinther): Support function types with both optional |
| 745 // and named parameters? | 745 // and named parameters? |
| 746 if (optionalParameters == 0 || names.isEmpty) { | 746 if (optionalParameters == 0 || names.isEmpty) { |
| 747 Link<DartType> requiredParameterTypes = const Link<DartType>(); | 747 DartType dynamic = const DynamicType(); |
| 748 while (--minRequiredParameters >= 0) { | 748 List<DartType> requiredParameterTypes = |
| 749 requiredParameterTypes = | 749 new List.filled(minRequiredParameters, dynamic); |
| 750 requiredParameterTypes.prepend(const DynamicType()); | 750 List<DartType> optionalParameterTypes = |
| 751 } | 751 new List.filled(optionalParameters, dynamic); |
| 752 Link<DartType> optionalParameterTypes = const Link<DartType>(); | 752 List<String> namedParameters = |
| 753 while (--optionalParameters >= 0) { | 753 names.toList()..sort((a, b) => a.compareTo(b)); |
| 754 optionalParameterTypes = | 754 List<DartType> namedParameterTypes = |
| 755 optionalParameterTypes.prepend(const DynamicType()); | 755 new List.filled(namedParameters.length, dynamic); |
| 756 } | |
| 757 Link<String> namedParameters = const Link<String>(); | |
| 758 Link<DartType> namedParameterTypes = const Link<DartType>(); | |
| 759 List<String> namesReversed = | |
| 760 names.toList()..sort((a, b) => -a.compareTo(b)); | |
| 761 for (String name in namesReversed) { | |
| 762 namedParameters = namedParameters.prepend(name); | |
| 763 namedParameterTypes = | |
| 764 namedParameterTypes.prepend(const DynamicType()); | |
| 765 } | |
| 766 FunctionType memberType = new FunctionType.synthesized( | 756 FunctionType memberType = new FunctionType.synthesized( |
| 767 const DynamicType(), | 757 const DynamicType(), |
| 768 requiredParameterTypes, | 758 requiredParameterTypes, |
| 769 optionalParameterTypes, | 759 optionalParameterTypes, |
| 770 namedParameters, namedParameterTypes); | 760 namedParameters, namedParameterTypes); |
| 771 DartType type = memberType; | 761 DartType type = memberType; |
| 772 if (inheritedMembers.first.isGetter || | 762 if (inheritedMembers.first.isGetter || |
| 773 inheritedMembers.first.isSetter) { | 763 inheritedMembers.first.isSetter) { |
| 774 type = const DynamicType(); | 764 type = const DynamicType(); |
| 775 } | 765 } |
| (...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 899 message: "Members have not been fully computed for $this.")); | 889 message: "Members have not been fully computed for $this.")); |
| 900 if (interfaceMembersAreClassMembers) { | 890 if (interfaceMembersAreClassMembers) { |
| 901 classMembers.forEach((_, member) { | 891 classMembers.forEach((_, member) { |
| 902 if (!member.isStatic) f(member); | 892 if (!member.isStatic) f(member); |
| 903 }); | 893 }); |
| 904 } else { | 894 } else { |
| 905 interfaceMembers.forEach((_, member) => f(member)); | 895 interfaceMembers.forEach((_, member) => f(member)); |
| 906 } | 896 } |
| 907 } | 897 } |
| 908 } | 898 } |
| OLD | NEW |