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

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

Issue 304153014: Remove element from DynamicType. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Fix infinite loop. Created 6 years, 6 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 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698