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

Side by Side Diff: sdk/lib/_internal/compiler/implementation/resolution/class_members.dart

Issue 177963002: Use List instead of Link in the type system. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Address comments. Created 6 years, 5 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 // 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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698