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

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

Issue 152593002: Version 1.2.0-dev.3.1 (Closed) Base URL: http://dart.googlecode.com/svn/trunk/dart/
Patch Set: Created 6 years, 10 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 part of resolution; 5 part of resolution;
6 6
7 abstract class TreeElements { 7 abstract class TreeElements {
8 Element get currentElement; 8 Element get currentElement;
9 Setlet<Node> get superUses; 9 Setlet<Node> get superUses;
10 10
(...skipping 929 matching lines...) Expand 10 before | Expand all | Expand 10 after
940 constConstructors.add(member); 940 constConstructors.add(member);
941 } 941 }
942 } 942 }
943 if (member.isField()) { 943 if (member.isField()) {
944 if (!member.modifiers.isStatic() && 944 if (!member.modifiers.isStatic() &&
945 !member.modifiers.isFinal()) { 945 !member.modifiers.isFinal()) {
946 nonFinalInstanceFields.add(member); 946 nonFinalInstanceFields.add(member);
947 } 947 }
948 } 948 }
949 checkAbstractField(member); 949 checkAbstractField(member);
950 checkValidOverride(member, cls.lookupSuperMember(member.name));
951 checkUserDefinableOperator(member); 950 checkUserDefinableOperator(member);
952 }); 951 });
953 }); 952 });
954 if (!constConstructors.isEmpty && !nonFinalInstanceFields.isEmpty) { 953 if (!constConstructors.isEmpty && !nonFinalInstanceFields.isEmpty) {
955 Spannable span = constConstructors.length > 1 954 Spannable span = constConstructors.length > 1
956 ? cls : constConstructors[0]; 955 ? cls : constConstructors[0];
957 compiler.reportError(span, 956 compiler.reportError(span,
958 MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS, 957 MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS,
959 {'className': cls.name}); 958 {'className': cls.name});
960 if (constConstructors.length > 1) { 959 if (constConstructors.length > 1) {
961 for (Element constructor in constConstructors) { 960 for (Element constructor in constConstructors) {
962 compiler.reportInfo(constructor, 961 compiler.reportInfo(constructor,
963 MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_CONSTRUCTOR); 962 MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_CONSTRUCTOR);
964 } 963 }
965 } 964 }
966 for (Element field in nonFinalInstanceFields) { 965 for (Element field in nonFinalInstanceFields) {
967 compiler.reportInfo(field, 966 compiler.reportInfo(field,
968 MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_FIELD); 967 MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_FIELD);
969 } 968 }
970 } 969 }
971
972 if (!cls.isAbstract) {
973 for (DartType supertype in cls.allSupertypes) {
974 // This must have been reported elsewhere.
975 if (!supertype.element.isClass()) continue;
976 ClassElement superclass = supertype.element;
977 superclass.forEachMember((ClassElement holder, Element member) {
978 if (member.isAbstract) {
979 Element mine = cls.lookupMember(member.name);
980 if (mine == null || mine.isAbstract) {
981 compiler.reportWarningCode(
982 cls, MessageKind.UNIMPLEMENTED_METHOD,
983 {'class_name': cls.name, 'member_name': member.name});
984 compiler.reportHint(member, MessageKind.THIS_IS_THE_METHOD, {});
985 }
986 }
987 });
988 }
989 }
990 } 970 }
991 971
992 void checkAbstractField(Element member) { 972 void checkAbstractField(Element member) {
993 // Only check for getters. The test can only fail if there is both a setter 973 // Only check for getters. The test can only fail if there is both a setter
994 // and a getter with the same name, and we only need to check each abstract 974 // and a getter with the same name, and we only need to check each abstract
995 // field once, so we just ignore setters. 975 // field once, so we just ignore setters.
996 if (!member.isGetter()) return; 976 if (!member.isGetter()) return;
997 977
998 // Find the associated abstract field. 978 // Find the associated abstract field.
999 ClassElement classElement = member.getEnclosingClass(); 979 ClassElement classElement = member.getEnclosingClass();
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
1132 Element contextElement, 1112 Element contextElement,
1133 MessageKind contextMessage) { 1113 MessageKind contextMessage) {
1134 compiler.reportError( 1114 compiler.reportError(
1135 errorneousElement, 1115 errorneousElement,
1136 errorMessage, 1116 errorMessage,
1137 {'memberName': contextElement.name, 1117 {'memberName': contextElement.name,
1138 'className': contextElement.getEnclosingClass().name}); 1118 'className': contextElement.getEnclosingClass().name});
1139 compiler.reportInfo(contextElement, contextMessage); 1119 compiler.reportInfo(contextElement, contextMessage);
1140 } 1120 }
1141 1121
1142 void checkValidOverride(Element member, Element superMember) {
1143 if (superMember == null) return;
1144 if (member.modifiers.isStatic()) {
1145 reportErrorWithContext(
1146 member, MessageKind.NO_STATIC_OVERRIDE,
1147 superMember, MessageKind.NO_STATIC_OVERRIDE_CONT);
1148 } else {
1149 FunctionElement superFunction = superMember.asFunctionElement();
1150 FunctionElement function = member.asFunctionElement();
1151 if (superFunction == null || superFunction.isAccessor()) {
1152 // Field or accessor in super.
1153 if (function != null && !function.isAccessor()) {
1154 // But a plain method in this class.
1155 reportErrorWithContext(
1156 member, MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD,
1157 superMember, MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD_CONT);
1158 }
1159 } else {
1160 // Instance method in super.
1161 if (function == null || function.isAccessor()) {
1162 // But a field (or accessor) in this class.
1163 reportErrorWithContext(
1164 member, MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD,
1165 superMember, MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD_CONT);
1166 } else {
1167 // Both are plain instance methods.
1168 if (superFunction.requiredParameterCount(compiler) !=
1169 function.requiredParameterCount(compiler)) {
1170 reportErrorWithContext(
1171 member,
1172 MessageKind.BAD_ARITY_OVERRIDE,
1173 superMember,
1174 MessageKind.BAD_ARITY_OVERRIDE_CONT);
1175 }
1176 // TODO(ahe): Check optional parameters.
1177 }
1178 }
1179 }
1180 }
1181 1122
1182 FunctionSignature resolveSignature(FunctionElement element) { 1123 FunctionSignature resolveSignature(FunctionElement element) {
1183 MessageKind defaultValuesError = null; 1124 MessageKind defaultValuesError = null;
1184 if (element.isFactoryConstructor()) { 1125 if (element.isFactoryConstructor()) {
1185 FunctionExpression body = element.parseNode(compiler); 1126 FunctionExpression body = element.parseNode(compiler);
1186 if (body.isRedirectingFactory) { 1127 if (body.isRedirectingFactory) {
1187 defaultValuesError = MessageKind.REDIRECTING_FACTORY_WITH_DEFAULT; 1128 defaultValuesError = MessageKind.REDIRECTING_FACTORY_WITH_DEFAULT;
1188 } 1129 }
1189 } 1130 }
1190 return compiler.withCurrentElement(element, () { 1131 return compiler.withCurrentElement(element, () {
(...skipping 3373 matching lines...) Expand 10 before | Expand all | Expand 10 after
4564 return finishConstructorReference(visit(expression), 4505 return finishConstructorReference(visit(expression),
4565 expression, expression); 4506 expression, expression);
4566 } 4507 }
4567 } 4508 }
4568 4509
4569 /// Looks up [name] in [scope] and unwraps the result. 4510 /// Looks up [name] in [scope] and unwraps the result.
4570 Element lookupInScope(Compiler compiler, Node node, 4511 Element lookupInScope(Compiler compiler, Node node,
4571 Scope scope, String name) { 4512 Scope scope, String name) {
4572 return Elements.unwrap(scope.lookup(name), compiler, node); 4513 return Elements.unwrap(scope.lookup(name), compiler, node);
4573 } 4514 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698