| 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 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 905 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 916 constConstructors.add(member); | 916 constConstructors.add(member); |
| 917 } | 917 } |
| 918 } | 918 } |
| 919 if (member.isField()) { | 919 if (member.isField()) { |
| 920 if (!member.modifiers.isStatic() && | 920 if (!member.modifiers.isStatic() && |
| 921 !member.modifiers.isFinal()) { | 921 !member.modifiers.isFinal()) { |
| 922 nonFinalInstanceFields.add(member); | 922 nonFinalInstanceFields.add(member); |
| 923 } | 923 } |
| 924 } | 924 } |
| 925 checkAbstractField(member); | 925 checkAbstractField(member); |
| 926 checkValidOverride(member, cls.lookupSuperMember(member.name)); | |
| 927 checkUserDefinableOperator(member); | 926 checkUserDefinableOperator(member); |
| 928 }); | 927 }); |
| 929 }); | 928 }); |
| 930 if (!constConstructors.isEmpty && !nonFinalInstanceFields.isEmpty) { | 929 if (!constConstructors.isEmpty && !nonFinalInstanceFields.isEmpty) { |
| 931 Spannable span = constConstructors.length > 1 | 930 Spannable span = constConstructors.length > 1 |
| 932 ? cls : constConstructors[0]; | 931 ? cls : constConstructors[0]; |
| 933 compiler.reportError(span, | 932 compiler.reportError(span, |
| 934 MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS, | 933 MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS, |
| 935 {'className': cls.name}); | 934 {'className': cls.name}); |
| 936 if (constConstructors.length > 1) { | 935 if (constConstructors.length > 1) { |
| 937 for (Element constructor in constConstructors) { | 936 for (Element constructor in constConstructors) { |
| 938 compiler.reportInfo(constructor, | 937 compiler.reportInfo(constructor, |
| 939 MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_CONSTRUCTOR); | 938 MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_CONSTRUCTOR); |
| 940 } | 939 } |
| 941 } | 940 } |
| 942 for (Element field in nonFinalInstanceFields) { | 941 for (Element field in nonFinalInstanceFields) { |
| 943 compiler.reportInfo(field, | 942 compiler.reportInfo(field, |
| 944 MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_FIELD); | 943 MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_FIELD); |
| 945 } | 944 } |
| 946 } | 945 } |
| 947 | |
| 948 if (!cls.isAbstract) { | |
| 949 for (DartType supertype in cls.allSupertypes) { | |
| 950 // This must have been reported elsewhere. | |
| 951 if (!supertype.element.isClass()) continue; | |
| 952 ClassElement superclass = supertype.element; | |
| 953 superclass.forEachMember((ClassElement holder, Element member) { | |
| 954 if (member.isAbstract) { | |
| 955 Element mine = cls.lookupMember(member.name); | |
| 956 if (mine == null || mine.isAbstract) { | |
| 957 compiler.reportWarningCode( | |
| 958 cls, MessageKind.UNIMPLEMENTED_METHOD, | |
| 959 {'class_name': cls.name, 'member_name': member.name}); | |
| 960 compiler.reportHint(member, MessageKind.THIS_IS_THE_METHOD, {}); | |
| 961 } | |
| 962 } | |
| 963 }); | |
| 964 } | |
| 965 } | |
| 966 } | 946 } |
| 967 | 947 |
| 968 void checkAbstractField(Element member) { | 948 void checkAbstractField(Element member) { |
| 969 // Only check for getters. The test can only fail if there is both a setter | 949 // Only check for getters. The test can only fail if there is both a setter |
| 970 // and a getter with the same name, and we only need to check each abstract | 950 // and a getter with the same name, and we only need to check each abstract |
| 971 // field once, so we just ignore setters. | 951 // field once, so we just ignore setters. |
| 972 if (!member.isGetter()) return; | 952 if (!member.isGetter()) return; |
| 973 | 953 |
| 974 // Find the associated abstract field. | 954 // Find the associated abstract field. |
| 975 ClassElement classElement = member.getEnclosingClass(); | 955 ClassElement classElement = member.getEnclosingClass(); |
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1108 Element contextElement, | 1088 Element contextElement, |
| 1109 MessageKind contextMessage) { | 1089 MessageKind contextMessage) { |
| 1110 compiler.reportError( | 1090 compiler.reportError( |
| 1111 errorneousElement, | 1091 errorneousElement, |
| 1112 errorMessage, | 1092 errorMessage, |
| 1113 {'memberName': contextElement.name, | 1093 {'memberName': contextElement.name, |
| 1114 'className': contextElement.getEnclosingClass().name}); | 1094 'className': contextElement.getEnclosingClass().name}); |
| 1115 compiler.reportInfo(contextElement, contextMessage); | 1095 compiler.reportInfo(contextElement, contextMessage); |
| 1116 } | 1096 } |
| 1117 | 1097 |
| 1118 void checkValidOverride(Element member, Element superMember) { | |
| 1119 if (superMember == null) return; | |
| 1120 if (member.modifiers.isStatic()) { | |
| 1121 reportErrorWithContext( | |
| 1122 member, MessageKind.NO_STATIC_OVERRIDE, | |
| 1123 superMember, MessageKind.NO_STATIC_OVERRIDE_CONT); | |
| 1124 } else { | |
| 1125 FunctionElement superFunction = superMember.asFunctionElement(); | |
| 1126 FunctionElement function = member.asFunctionElement(); | |
| 1127 if (superFunction == null || superFunction.isAccessor()) { | |
| 1128 // Field or accessor in super. | |
| 1129 if (function != null && !function.isAccessor()) { | |
| 1130 // But a plain method in this class. | |
| 1131 reportErrorWithContext( | |
| 1132 member, MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD, | |
| 1133 superMember, MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD_CONT); | |
| 1134 } | |
| 1135 } else { | |
| 1136 // Instance method in super. | |
| 1137 if (function == null || function.isAccessor()) { | |
| 1138 // But a field (or accessor) in this class. | |
| 1139 reportErrorWithContext( | |
| 1140 member, MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD, | |
| 1141 superMember, MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD_CONT); | |
| 1142 } else { | |
| 1143 // Both are plain instance methods. | |
| 1144 if (superFunction.requiredParameterCount(compiler) != | |
| 1145 function.requiredParameterCount(compiler)) { | |
| 1146 reportErrorWithContext( | |
| 1147 member, | |
| 1148 MessageKind.BAD_ARITY_OVERRIDE, | |
| 1149 superMember, | |
| 1150 MessageKind.BAD_ARITY_OVERRIDE_CONT); | |
| 1151 } | |
| 1152 // TODO(ahe): Check optional parameters. | |
| 1153 } | |
| 1154 } | |
| 1155 } | |
| 1156 } | |
| 1157 | 1098 |
| 1158 FunctionSignature resolveSignature(FunctionElement element) { | 1099 FunctionSignature resolveSignature(FunctionElement element) { |
| 1159 MessageKind defaultValuesError = null; | 1100 MessageKind defaultValuesError = null; |
| 1160 if (element.isFactoryConstructor()) { | 1101 if (element.isFactoryConstructor()) { |
| 1161 FunctionExpression body = element.parseNode(compiler); | 1102 FunctionExpression body = element.parseNode(compiler); |
| 1162 if (body.isRedirectingFactory) { | 1103 if (body.isRedirectingFactory) { |
| 1163 defaultValuesError = MessageKind.REDIRECTING_FACTORY_WITH_DEFAULT; | 1104 defaultValuesError = MessageKind.REDIRECTING_FACTORY_WITH_DEFAULT; |
| 1164 } | 1105 } |
| 1165 } | 1106 } |
| 1166 return compiler.withCurrentElement(element, () { | 1107 return compiler.withCurrentElement(element, () { |
| (...skipping 3634 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4801 return finishConstructorReference(visit(expression), | 4742 return finishConstructorReference(visit(expression), |
| 4802 expression, expression); | 4743 expression, expression); |
| 4803 } | 4744 } |
| 4804 } | 4745 } |
| 4805 | 4746 |
| 4806 /// Looks up [name] in [scope] and unwraps the result. | 4747 /// Looks up [name] in [scope] and unwraps the result. |
| 4807 Element lookupInScope(Compiler compiler, Node node, | 4748 Element lookupInScope(Compiler compiler, Node node, |
| 4808 Scope scope, String name) { | 4749 Scope scope, String name) { |
| 4809 return Elements.unwrap(scope.lookup(name), compiler, node); | 4750 return Elements.unwrap(scope.lookup(name), compiler, node); |
| 4810 } | 4751 } |
| OLD | NEW |