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

Side by Side Diff: pkg/analyzer/lib/src/generated/error_verifier.dart

Issue 1322513004: Reformat code to reduce churn (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 3 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
OLDNEW
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2014, 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 engine.resolver.error_verifier; 5 library engine.resolver.error_verifier;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 import "dart:math" as math; 8 import "dart:math" as math;
9 9
10 import 'package:analyzer/src/generated/static_type_analyzer.dart'; 10 import 'package:analyzer/src/generated/static_type_analyzer.dart';
(...skipping 1107 matching lines...) Expand 10 before | Expand all | Expand 10 after
1118 * See [StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS]. 1118 * See [StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS].
1119 */ 1119 */
1120 bool _checkExpectedTwoMapTypeArguments(TypeArgumentList typeArguments) { 1120 bool _checkExpectedTwoMapTypeArguments(TypeArgumentList typeArguments) {
1121 // check number of type arguments 1121 // check number of type arguments
1122 int num = typeArguments.arguments.length; 1122 int num = typeArguments.arguments.length;
1123 if (num == 2) { 1123 if (num == 2) {
1124 return false; 1124 return false;
1125 } 1125 }
1126 // report problem 1126 // report problem
1127 _errorReporter.reportErrorForNode( 1127 _errorReporter.reportErrorForNode(
1128 StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS, typeArguments, 1128 StaticTypeWarningCode.EXPECTED_TWO_MAP_TYPE_ARGUMENTS,
1129 typeArguments,
1129 [num]); 1130 [num]);
1130 return true; 1131 return true;
1131 } 1132 }
1132 1133
1133 /** 1134 /**
1134 * Verify that the given [constructor] declaration does not violate any of the 1135 * Verify that the given [constructor] declaration does not violate any of the
1135 * error codes relating to the initialization of fields in the enclosing 1136 * error codes relating to the initialization of fields in the enclosing
1136 * class. 1137 * class.
1137 * 1138 *
1138 * See [_initialFieldElementsMap], 1139 * See [_initialFieldElementsMap],
(...skipping 25 matching lines...) Expand all
1164 if (parameter is FieldFormalParameter) { 1165 if (parameter is FieldFormalParameter) {
1165 FieldElement fieldElement = 1166 FieldElement fieldElement =
1166 (parameter.element as FieldFormalParameterElementImpl).field; 1167 (parameter.element as FieldFormalParameterElementImpl).field;
1167 INIT_STATE state = fieldElementsMap[fieldElement]; 1168 INIT_STATE state = fieldElementsMap[fieldElement];
1168 if (state == INIT_STATE.NOT_INIT) { 1169 if (state == INIT_STATE.NOT_INIT) {
1169 fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_FIELD_FORMAL; 1170 fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_FIELD_FORMAL;
1170 } else if (state == INIT_STATE.INIT_IN_DECLARATION) { 1171 } else if (state == INIT_STATE.INIT_IN_DECLARATION) {
1171 if (fieldElement.isFinal || fieldElement.isConst) { 1172 if (fieldElement.isFinal || fieldElement.isConst) {
1172 _errorReporter.reportErrorForNode( 1173 _errorReporter.reportErrorForNode(
1173 StaticWarningCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCT OR, 1174 StaticWarningCode.FINAL_INITIALIZED_IN_DECLARATION_AND_CONSTRUCT OR,
1174 formalParameter.identifier, [fieldElement.displayName]); 1175 formalParameter.identifier,
1176 [fieldElement.displayName]);
1175 foundError = true; 1177 foundError = true;
1176 } 1178 }
1177 } else if (state == INIT_STATE.INIT_IN_FIELD_FORMAL) { 1179 } else if (state == INIT_STATE.INIT_IN_FIELD_FORMAL) {
1178 if (fieldElement.isFinal || fieldElement.isConst) { 1180 if (fieldElement.isFinal || fieldElement.isConst) {
1179 _errorReporter.reportErrorForNode( 1181 _errorReporter.reportErrorForNode(
1180 CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES, 1182 CompileTimeErrorCode.FINAL_INITIALIZED_MULTIPLE_TIMES,
1181 formalParameter.identifier, [fieldElement.displayName]); 1183 formalParameter.identifier,
1184 [fieldElement.displayName]);
1182 foundError = true; 1185 foundError = true;
1183 } 1186 }
1184 } 1187 }
1185 } 1188 }
1186 } 1189 }
1187 // Visit all of the initializers 1190 // Visit all of the initializers
1188 NodeList<ConstructorInitializer> initializers = constructor.initializers; 1191 NodeList<ConstructorInitializer> initializers = constructor.initializers;
1189 for (ConstructorInitializer constructorInitializer in initializers) { 1192 for (ConstructorInitializer constructorInitializer in initializers) {
1190 if (constructorInitializer is RedirectingConstructorInvocation) { 1193 if (constructorInitializer is RedirectingConstructorInvocation) {
1191 return false; 1194 return false;
(...skipping 16 matching lines...) Expand all
1208 foundError = true; 1211 foundError = true;
1209 } 1212 }
1210 } else if (state == INIT_STATE.INIT_IN_FIELD_FORMAL) { 1213 } else if (state == INIT_STATE.INIT_IN_FIELD_FORMAL) {
1211 _errorReporter.reportErrorForNode( 1214 _errorReporter.reportErrorForNode(
1212 CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALI ZER, 1215 CompileTimeErrorCode.FIELD_INITIALIZED_IN_PARAMETER_AND_INITIALI ZER,
1213 fieldName); 1216 fieldName);
1214 foundError = true; 1217 foundError = true;
1215 } else if (state == INIT_STATE.INIT_IN_INITIALIZERS) { 1218 } else if (state == INIT_STATE.INIT_IN_INITIALIZERS) {
1216 _errorReporter.reportErrorForNode( 1219 _errorReporter.reportErrorForNode(
1217 CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS, 1220 CompileTimeErrorCode.FIELD_INITIALIZED_BY_MULTIPLE_INITIALIZERS,
1218 fieldName, [fieldElement.displayName]); 1221 fieldName,
1222 [fieldElement.displayName]);
1219 foundError = true; 1223 foundError = true;
1220 } 1224 }
1221 } 1225 }
1222 } 1226 }
1223 } 1227 }
1224 // Prepare a list of not initialized fields. 1228 // Prepare a list of not initialized fields.
1225 List<FieldElement> notInitFinalFields = <FieldElement>[]; 1229 List<FieldElement> notInitFinalFields = <FieldElement>[];
1226 fieldElementsMap.forEach((FieldElement fieldElement, INIT_STATE state) { 1230 fieldElementsMap.forEach((FieldElement fieldElement, INIT_STATE state) {
1227 if (state == INIT_STATE.NOT_INIT) { 1231 if (state == INIT_STATE.NOT_INIT) {
1228 if (fieldElement.isFinal) { 1232 if (fieldElement.isFinal) {
1229 notInitFinalFields.add(fieldElement); 1233 notInitFinalFields.add(fieldElement);
1230 } 1234 }
1231 } 1235 }
1232 }); 1236 });
1233 // Visit all of the states in the map to ensure that none were never 1237 // Visit all of the states in the map to ensure that none were never
1234 // initialized. 1238 // initialized.
1235 fieldElementsMap.forEach((FieldElement fieldElement, INIT_STATE state) { 1239 fieldElementsMap.forEach((FieldElement fieldElement, INIT_STATE state) {
1236 if (state == INIT_STATE.NOT_INIT) { 1240 if (state == INIT_STATE.NOT_INIT) {
1237 if (fieldElement.isConst) { 1241 if (fieldElement.isConst) {
1238 _errorReporter.reportErrorForNode( 1242 _errorReporter.reportErrorForNode(
1239 CompileTimeErrorCode.CONST_NOT_INITIALIZED, 1243 CompileTimeErrorCode.CONST_NOT_INITIALIZED,
1240 constructor.returnType, [fieldElement.name]); 1244 constructor.returnType,
1245 [fieldElement.name]);
1241 foundError = true; 1246 foundError = true;
1242 } 1247 }
1243 } 1248 }
1244 }); 1249 });
1245 if (notInitFinalFields.isNotEmpty) { 1250 if (notInitFinalFields.isNotEmpty) {
1246 foundError = true; 1251 foundError = true;
1247 AnalysisErrorWithProperties analysisError; 1252 AnalysisErrorWithProperties analysisError;
1248 if (notInitFinalFields.length == 1) { 1253 if (notInitFinalFields.length == 1) {
1249 analysisError = _errorReporter.newErrorWithProperties( 1254 analysisError = _errorReporter.newErrorWithProperties(
1250 StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_1, 1255 StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_1,
1251 constructor.returnType, [notInitFinalFields[0].name]); 1256 constructor.returnType,
1257 [notInitFinalFields[0].name]);
1252 } else if (notInitFinalFields.length == 2) { 1258 } else if (notInitFinalFields.length == 2) {
1253 analysisError = _errorReporter.newErrorWithProperties( 1259 analysisError = _errorReporter.newErrorWithProperties(
1254 StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_2, 1260 StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_2,
1255 constructor.returnType, [ 1261 constructor.returnType,
1256 notInitFinalFields[0].name, 1262 [notInitFinalFields[0].name, notInitFinalFields[1].name]);
1257 notInitFinalFields[1].name
1258 ]);
1259 } else { 1263 } else {
1260 analysisError = _errorReporter.newErrorWithProperties( 1264 analysisError = _errorReporter.newErrorWithProperties(
1261 StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS, 1265 StaticWarningCode.FINAL_NOT_INITIALIZED_CONSTRUCTOR_3_PLUS,
1262 constructor.returnType, [ 1266 constructor.returnType, [
1263 notInitFinalFields[0].name, 1267 notInitFinalFields[0].name,
1264 notInitFinalFields[1].name, 1268 notInitFinalFields[1].name,
1265 notInitFinalFields.length - 2 1269 notInitFinalFields.length - 2
1266 ]); 1270 ]);
1267 } 1271 }
1268 analysisError.setProperty( 1272 analysisError.setProperty(
(...skipping 16 matching lines...) Expand all
1285 * [StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE], 1289 * [StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE],
1286 * [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE], 1290 * [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE],
1287 * [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE], 1291 * [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE],
1288 * [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE], 1292 * [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE],
1289 * [StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE], 1293 * [StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE],
1290 * [StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE], and 1294 * [StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE], and
1291 * [StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES]. 1295 * [StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES].
1292 */ 1296 */
1293 bool _checkForAllInvalidOverrideErrorCodes( 1297 bool _checkForAllInvalidOverrideErrorCodes(
1294 ExecutableElement executableElement, 1298 ExecutableElement executableElement,
1295 ExecutableElement overriddenExecutable, List<ParameterElement> parameters, 1299 ExecutableElement overriddenExecutable,
1296 List<AstNode> parameterLocations, SimpleIdentifier errorNameTarget) { 1300 List<ParameterElement> parameters,
1301 List<AstNode> parameterLocations,
1302 SimpleIdentifier errorNameTarget) {
1297 bool isGetter = false; 1303 bool isGetter = false;
1298 bool isSetter = false; 1304 bool isSetter = false;
1299 if (executableElement is PropertyAccessorElement) { 1305 if (executableElement is PropertyAccessorElement) {
1300 PropertyAccessorElement accessorElement = executableElement; 1306 PropertyAccessorElement accessorElement = executableElement;
1301 isGetter = accessorElement.isGetter; 1307 isGetter = accessorElement.isGetter;
1302 isSetter = accessorElement.isSetter; 1308 isSetter = accessorElement.isSetter;
1303 } 1309 }
1304 String executableElementName = executableElement.name; 1310 String executableElementName = executableElement.name;
1305 FunctionType overridingFT = executableElement.type; 1311 FunctionType overridingFT = executableElement.type;
1306 FunctionType overriddenFT = overriddenExecutable.type; 1312 FunctionType overriddenFT = overriddenExecutable.type;
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1348 StaticWarningCode.INVALID_OVERRIDE_NAMED, errorNameTarget, [ 1354 StaticWarningCode.INVALID_OVERRIDE_NAMED, errorNameTarget, [
1349 overriddenParamName, 1355 overriddenParamName,
1350 overriddenExecutable.enclosingElement.displayName 1356 overriddenExecutable.enclosingElement.displayName
1351 ]); 1357 ]);
1352 return true; 1358 return true;
1353 } 1359 }
1354 } 1360 }
1355 // SWC.INVALID_METHOD_OVERRIDE_RETURN_TYPE 1361 // SWC.INVALID_METHOD_OVERRIDE_RETURN_TYPE
1356 if (overriddenFTReturnType != VoidTypeImpl.instance && 1362 if (overriddenFTReturnType != VoidTypeImpl.instance &&
1357 !overridingFTReturnType.isAssignableTo(overriddenFTReturnType)) { 1363 !overridingFTReturnType.isAssignableTo(overriddenFTReturnType)) {
1358 _errorReporter.reportTypeErrorForNode(!isGetter 1364 _errorReporter.reportTypeErrorForNode(
1365 !isGetter
1359 ? StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE 1366 ? StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE
1360 : StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE, 1367 : StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE,
1361 errorNameTarget, [ 1368 errorNameTarget,
1369 [
1362 overridingFTReturnType, 1370 overridingFTReturnType,
1363 overriddenFTReturnType, 1371 overriddenFTReturnType,
1364 overriddenExecutable.enclosingElement.displayName 1372 overriddenExecutable.enclosingElement.displayName
1365 ]); 1373 ]);
1366 return true; 1374 return true;
1367 } 1375 }
1368 // SWC.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE 1376 // SWC.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE
1369 if (parameterLocations == null) { 1377 if (parameterLocations == null) {
1370 return false; 1378 return false;
1371 } 1379 }
1372 int parameterIndex = 0; 1380 int parameterIndex = 0;
1373 for (int i = 0; i < overridingNormalPT.length; i++) { 1381 for (int i = 0; i < overridingNormalPT.length; i++) {
1374 if (!overridingNormalPT[i].isAssignableTo(overriddenNormalPT[i])) { 1382 if (!overridingNormalPT[i].isAssignableTo(overriddenNormalPT[i])) {
1375 _errorReporter.reportTypeErrorForNode(!isSetter 1383 _errorReporter.reportTypeErrorForNode(
1384 !isSetter
1376 ? StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE 1385 ? StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE
1377 : StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE, 1386 : StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE,
1378 parameterLocations[parameterIndex], [ 1387 parameterLocations[parameterIndex],
1388 [
1379 overridingNormalPT[i], 1389 overridingNormalPT[i],
1380 overriddenNormalPT[i], 1390 overriddenNormalPT[i],
1381 overriddenExecutable.enclosingElement.displayName 1391 overriddenExecutable.enclosingElement.displayName
1382 ]); 1392 ]);
1383 return true; 1393 return true;
1384 } 1394 }
1385 parameterIndex++; 1395 parameterIndex++;
1386 } 1396 }
1387 // SWC.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE 1397 // SWC.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE
1388 for (int i = 0; i < overriddenPositionalPT.length; i++) { 1398 for (int i = 0; i < overriddenPositionalPT.length; i++) {
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
1548 /** 1558 /**
1549 * Check the given [executableElement] against override-error codes. This 1559 * Check the given [executableElement] against override-error codes. This
1550 * method computes the given executableElement is overriding and calls 1560 * method computes the given executableElement is overriding and calls
1551 * [_checkForAllInvalidOverrideErrorCodes] when the [InheritanceManager] 1561 * [_checkForAllInvalidOverrideErrorCodes] when the [InheritanceManager]
1552 * returns a [MultiplyInheritedExecutableElement], this method loops through 1562 * returns a [MultiplyInheritedExecutableElement], this method loops through
1553 * the list in the [MultiplyInheritedExecutableElement]. The [parameters] are 1563 * the list in the [MultiplyInheritedExecutableElement]. The [parameters] are
1554 * the parameters of the executable element. The [errorNameTarget] is the node 1564 * the parameters of the executable element. The [errorNameTarget] is the node
1555 * to report problems on. 1565 * to report problems on.
1556 */ 1566 */
1557 bool _checkForAllInvalidOverrideErrorCodesForExecutable( 1567 bool _checkForAllInvalidOverrideErrorCodesForExecutable(
1558 ExecutableElement executableElement, List<ParameterElement> parameters, 1568 ExecutableElement executableElement,
1559 List<AstNode> parameterLocations, SimpleIdentifier errorNameTarget) { 1569 List<ParameterElement> parameters,
1570 List<AstNode> parameterLocations,
1571 SimpleIdentifier errorNameTarget) {
1560 // 1572 //
1561 // Compute the overridden executable from the InheritanceManager 1573 // Compute the overridden executable from the InheritanceManager
1562 // 1574 //
1563 List<ExecutableElement> overriddenExecutables = _inheritanceManager 1575 List<ExecutableElement> overriddenExecutables = _inheritanceManager
1564 .lookupOverrides(_enclosingClass, executableElement.name); 1576 .lookupOverrides(_enclosingClass, executableElement.name);
1565 if (_checkForInstanceMethodNameCollidesWithSuperclassStatic( 1577 if (_checkForInstanceMethodNameCollidesWithSuperclassStatic(
1566 executableElement, errorNameTarget)) { 1578 executableElement, errorNameTarget)) {
1567 return true; 1579 return true;
1568 } 1580 }
1569 for (ExecutableElement overriddenElement in overriddenExecutables) { 1581 for (ExecutableElement overriddenElement in overriddenExecutables) {
(...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after
1714 // 1726 //
1715 // Prepare the constructor name 1727 // Prepare the constructor name
1716 // 1728 //
1717 String constructorStrName = constructorTypeName.name.name; 1729 String constructorStrName = constructorTypeName.name.name;
1718 if (redirectedConstructor.name != null) { 1730 if (redirectedConstructor.name != null) {
1719 constructorStrName += ".${redirectedConstructor.name.name}"; 1731 constructorStrName += ".${redirectedConstructor.name.name}";
1720 } 1732 }
1721 ErrorCode errorCode = (declaration.constKeyword != null 1733 ErrorCode errorCode = (declaration.constKeyword != null
1722 ? CompileTimeErrorCode.REDIRECT_TO_MISSING_CONSTRUCTOR 1734 ? CompileTimeErrorCode.REDIRECT_TO_MISSING_CONSTRUCTOR
1723 : StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR); 1735 : StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR);
1724 _errorReporter.reportErrorForNode(errorCode, redirectedConstructor, [ 1736 _errorReporter.reportErrorForNode(errorCode, redirectedConstructor,
1725 constructorStrName, 1737 [constructorStrName, redirectedType.displayName]);
1726 redirectedType.displayName
1727 ]);
1728 return true; 1738 return true;
1729 } 1739 }
1730 return false; 1740 return false;
1731 } 1741 }
1732 FunctionType redirectedType = redirectedElement.type; 1742 FunctionType redirectedType = redirectedElement.type;
1733 DartType redirectedReturnType = redirectedType.returnType; 1743 DartType redirectedReturnType = redirectedType.returnType;
1734 // 1744 //
1735 // Report specific problem when return type is incompatible 1745 // Report specific problem when return type is incompatible
1736 // 1746 //
1737 FunctionType constructorType = declaration.element.type; 1747 FunctionType constructorType = declaration.element.type;
1738 DartType constructorReturnType = constructorType.returnType; 1748 DartType constructorReturnType = constructorType.returnType;
1739 if (!redirectedReturnType.isAssignableTo(constructorReturnType)) { 1749 if (!redirectedReturnType.isAssignableTo(constructorReturnType)) {
1740 _errorReporter.reportErrorForNode( 1750 _errorReporter.reportErrorForNode(
1741 StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE, 1751 StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE,
1742 redirectedConstructor, [redirectedReturnType, constructorReturnType]); 1752 redirectedConstructor,
1753 [redirectedReturnType, constructorReturnType]);
1743 return true; 1754 return true;
1744 } 1755 }
1745 // 1756 //
1746 // Check parameters 1757 // Check parameters
1747 // 1758 //
1748 if (!redirectedType.isSubtypeOf(constructorType)) { 1759 if (!redirectedType.isSubtypeOf(constructorType)) {
1749 _errorReporter.reportErrorForNode( 1760 _errorReporter.reportErrorForNode(
1750 StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE, 1761 StaticWarningCode.REDIRECT_TO_INVALID_FUNCTION_TYPE,
1751 redirectedConstructor, [redirectedType, constructorType]); 1762 redirectedConstructor,
1763 [redirectedType, constructorType]);
1752 return true; 1764 return true;
1753 } 1765 }
1754 return false; 1766 return false;
1755 } 1767 }
1756 1768
1757 /** 1769 /**
1758 * Check that the return [statement] of the form <i>return e;</i> is not in a 1770 * Check that the return [statement] of the form <i>return e;</i> is not in a
1759 * generative constructor. 1771 * generative constructor.
1760 * 1772 *
1761 * Check that return statements without expressions are not in a generative 1773 * Check that return statements without expressions are not in a generative
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1823 return false; 1835 return false;
1824 } 1836 }
1825 // check exported names 1837 // check exported names
1826 Namespace namespace = 1838 Namespace namespace =
1827 new NamespaceBuilder().createExportNamespaceForDirective(exportElement); 1839 new NamespaceBuilder().createExportNamespaceForDirective(exportElement);
1828 Map<String, Element> definedNames = namespace.definedNames; 1840 Map<String, Element> definedNames = namespace.definedNames;
1829 for (String name in definedNames.keys) { 1841 for (String name in definedNames.keys) {
1830 Element element = definedNames[name]; 1842 Element element = definedNames[name];
1831 Element prevElement = _exportedElements[name]; 1843 Element prevElement = _exportedElements[name];
1832 if (element != null && prevElement != null && prevElement != element) { 1844 if (element != null && prevElement != null && prevElement != element) {
1833 _errorReporter.reportErrorForNode(CompileTimeErrorCode.AMBIGUOUS_EXPORT, 1845 _errorReporter.reportErrorForNode(
1834 directive, [ 1846 CompileTimeErrorCode.AMBIGUOUS_EXPORT, directive, [
1835 name, 1847 name,
1836 prevElement.library.definingCompilationUnit.displayName, 1848 prevElement.library.definingCompilationUnit.displayName,
1837 element.library.definingCompilationUnit.displayName 1849 element.library.definingCompilationUnit.displayName
1838 ]); 1850 ]);
1839 return true; 1851 return true;
1840 } else { 1852 } else {
1841 _exportedElements[name] = element; 1853 _exportedElements[name] = element;
1842 } 1854 }
1843 } 1855 }
1844 return false; 1856 return false;
1845 } 1857 }
1846 1858
1847 /** 1859 /**
1848 * Verify that the given [expression] can be assigned to its corresponding 1860 * Verify that the given [expression] can be assigned to its corresponding
1849 * parameters. The [expectedStaticType] is the expected static type of the 1861 * parameters. The [expectedStaticType] is the expected static type of the
1850 * parameter. The [actualStaticType] is the actual static type of the 1862 * parameter. The [actualStaticType] is the actual static type of the
1851 * argument. 1863 * argument.
1852 * 1864 *
1853 * This method corresponds to 1865 * This method corresponds to
1854 * [BestPracticesVerifier.checkForArgumentTypeNotAssignable]. 1866 * [BestPracticesVerifier.checkForArgumentTypeNotAssignable].
1855 * 1867 *
1856 * See [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE], 1868 * See [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE],
1857 * [CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE], 1869 * [CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE],
1858 * [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE], 1870 * [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE],
1859 * [CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE], 1871 * [CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE],
1860 * [CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE], 1872 * [CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE],
1861 * [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE], and 1873 * [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE], and
1862 * [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE]. 1874 * [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE].
1863 */ 1875 */
1864 bool _checkForArgumentTypeNotAssignable(Expression expression, 1876 bool _checkForArgumentTypeNotAssignable(
1865 DartType expectedStaticType, DartType actualStaticType, 1877 Expression expression,
1878 DartType expectedStaticType,
1879 DartType actualStaticType,
1866 ErrorCode errorCode) { 1880 ErrorCode errorCode) {
1867 // 1881 //
1868 // Warning case: test static type information 1882 // Warning case: test static type information
1869 // 1883 //
1870 if (actualStaticType != null && expectedStaticType != null) { 1884 if (actualStaticType != null && expectedStaticType != null) {
1871 if (!actualStaticType.isAssignableTo(expectedStaticType)) { 1885 if (!actualStaticType.isAssignableTo(expectedStaticType)) {
1872 _errorReporter.reportTypeErrorForNode( 1886 _errorReporter.reportTypeErrorForNode(
1873 errorCode, expression, [actualStaticType, expectedStaticType]); 1887 errorCode, expression, [actualStaticType, expectedStaticType]);
1874 return true; 1888 return true;
1875 } 1889 }
(...skipping 30 matching lines...) Expand all
1906 * 1920 *
1907 * See [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE], 1921 * See [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE],
1908 * [CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE], 1922 * [CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE],
1909 * [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE], 1923 * [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE],
1910 * [CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE], 1924 * [CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE],
1911 * [CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE], 1925 * [CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE],
1912 * [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE], and 1926 * [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE], and
1913 * [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE]. 1927 * [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE].
1914 */ 1928 */
1915 bool _checkForArgumentTypeNotAssignableWithExpectedTypes( 1929 bool _checkForArgumentTypeNotAssignableWithExpectedTypes(
1916 Expression expression, DartType expectedStaticType, 1930 Expression expression,
1917 ErrorCode errorCode) => _checkForArgumentTypeNotAssignable( 1931 DartType expectedStaticType,
1932 ErrorCode errorCode) =>
1933 _checkForArgumentTypeNotAssignable(
1918 expression, expectedStaticType, getStaticType(expression), errorCode); 1934 expression, expectedStaticType, getStaticType(expression), errorCode);
1919 1935
1920 /** 1936 /**
1921 * Verify that the arguments in the given [argumentList] can be assigned to 1937 * Verify that the arguments in the given [argumentList] can be assigned to
1922 * their corresponding parameters. 1938 * their corresponding parameters.
1923 * 1939 *
1924 * This method corresponds to 1940 * This method corresponds to
1925 * [BestPracticesVerifier.checkForArgumentTypesNotAssignableInList]. 1941 * [BestPracticesVerifier.checkForArgumentTypesNotAssignableInList].
1926 * 1942 *
1927 * See [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE]. 1943 * See [StaticWarningCode.ARGUMENT_TYPE_NOT_ASSIGNABLE].
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
1992 if (element.isConst) { 2008 if (element.isConst) {
1993 _errorReporter.reportErrorForNode( 2009 _errorReporter.reportErrorForNode(
1994 StaticWarningCode.ASSIGNMENT_TO_CONST, expression); 2010 StaticWarningCode.ASSIGNMENT_TO_CONST, expression);
1995 return true; 2011 return true;
1996 } 2012 }
1997 if (element.isFinal) { 2013 if (element.isFinal) {
1998 if (element is FieldElementImpl && 2014 if (element is FieldElementImpl &&
1999 element.setter == null && 2015 element.setter == null &&
2000 element.isSynthetic) { 2016 element.isSynthetic) {
2001 _errorReporter.reportErrorForNode( 2017 _errorReporter.reportErrorForNode(
2002 StaticWarningCode.ASSIGNMENT_TO_FINAL_NO_SETTER, highlightedNode, 2018 StaticWarningCode.ASSIGNMENT_TO_FINAL_NO_SETTER,
2019 highlightedNode,
2003 [element.name, element.enclosingElement.displayName]); 2020 [element.name, element.enclosingElement.displayName]);
2004 return true; 2021 return true;
2005 } 2022 }
2006 _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_FINAL, 2023 _errorReporter.reportErrorForNode(StaticWarningCode.ASSIGNMENT_TO_FINAL,
2007 highlightedNode, [element.name]); 2024 highlightedNode, [element.name]);
2008 return true; 2025 return true;
2009 } 2026 }
2010 return false; 2027 return false;
2011 } 2028 }
2012 if (element is FunctionElement) { 2029 if (element is FunctionElement) {
(...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after
2127 memberName, _currentLibrary); 2144 memberName, _currentLibrary);
2128 } else if (method.isSetter) { 2145 } else if (method.isSetter) {
2129 overriddenMember = _enclosingClass.lookUpInheritedConcreteSetter( 2146 overriddenMember = _enclosingClass.lookUpInheritedConcreteSetter(
2130 memberName, _currentLibrary); 2147 memberName, _currentLibrary);
2131 } else { 2148 } else {
2132 overriddenMember = _enclosingClass.lookUpInheritedConcreteMethod( 2149 overriddenMember = _enclosingClass.lookUpInheritedConcreteMethod(
2133 memberName, _currentLibrary); 2150 memberName, _currentLibrary);
2134 } 2151 }
2135 if (overriddenMember == null) { 2152 if (overriddenMember == null) {
2136 _errorReporter.reportErrorForNode( 2153 _errorReporter.reportErrorForNode(
2137 StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER, nameNode, [ 2154 StaticWarningCode.CONCRETE_CLASS_WITH_ABSTRACT_MEMBER,
2138 memberName, 2155 nameNode,
2139 _enclosingClass.displayName 2156 [memberName, _enclosingClass.displayName]);
2140 ]);
2141 return true; 2157 return true;
2142 } 2158 }
2143 } 2159 }
2144 return false; 2160 return false;
2145 } 2161 }
2146 2162
2147 /** 2163 /**
2148 * Verify all possible conflicts of the given [constructor]'s name with other 2164 * Verify all possible conflicts of the given [constructor]'s name with other
2149 * constructors and members of the same class. The [constructorElement] is the 2165 * constructors and members of the same class. The [constructorElement] is the
2150 * constructor's element. 2166 * constructor's element.
(...skipping 14 matching lines...) Expand all
2165 for (ConstructorElement otherConstructor in constructors) { 2181 for (ConstructorElement otherConstructor in constructors) {
2166 if (identical(otherConstructor, constructorElement)) { 2182 if (identical(otherConstructor, constructorElement)) {
2167 continue; 2183 continue;
2168 } 2184 }
2169 if (name == otherConstructor.name) { 2185 if (name == otherConstructor.name) {
2170 if (name == null || name.length == 0) { 2186 if (name == null || name.length == 0) {
2171 _errorReporter.reportErrorForNode( 2187 _errorReporter.reportErrorForNode(
2172 CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT, constructor); 2188 CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_DEFAULT, constructor);
2173 } else { 2189 } else {
2174 _errorReporter.reportErrorForNode( 2190 _errorReporter.reportErrorForNode(
2175 CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME, constructor, 2191 CompileTimeErrorCode.DUPLICATE_CONSTRUCTOR_NAME,
2192 constructor,
2176 [name]); 2193 [name]);
2177 } 2194 }
2178 return true; 2195 return true;
2179 } 2196 }
2180 } 2197 }
2181 // conflict with class member 2198 // conflict with class member
2182 if (constructorName != null && 2199 if (constructorName != null &&
2183 constructorElement != null && 2200 constructorElement != null &&
2184 !constructorName.isSynthetic) { 2201 !constructorName.isSynthetic) {
2185 // fields 2202 // fields
2186 FieldElement field = classElement.getField(name); 2203 FieldElement field = classElement.getField(name);
2187 if (field != null) { 2204 if (field != null) {
2188 _errorReporter.reportErrorForNode( 2205 _errorReporter.reportErrorForNode(
2189 CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD, 2206 CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_FIELD,
2190 constructor, [name]); 2207 constructor,
2208 [name]);
2191 return true; 2209 return true;
2192 } 2210 }
2193 // methods 2211 // methods
2194 MethodElement method = classElement.getMethod(name); 2212 MethodElement method = classElement.getMethod(name);
2195 if (method != null) { 2213 if (method != null) {
2196 _errorReporter.reportErrorForNode( 2214 _errorReporter.reportErrorForNode(
2197 CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD, 2215 CompileTimeErrorCode.CONFLICTING_CONSTRUCTOR_NAME_AND_METHOD,
2198 constructor, [name]); 2216 constructor,
2217 [name]);
2199 return true; 2218 return true;
2200 } 2219 }
2201 } 2220 }
2202 return false; 2221 return false;
2203 } 2222 }
2204 2223
2205 /** 2224 /**
2206 * Verify that the [_enclosingClass] does not have a method and getter pair 2225 * Verify that the [_enclosingClass] does not have a method and getter pair
2207 * with the same name on, via inheritance. 2226 * with the same name on, via inheritance.
2208 * 2227 *
(...skipping 10 matching lines...) Expand all
2219 String name = method.name; 2238 String name = method.name;
2220 // find inherited property accessor (and can be only getter) 2239 // find inherited property accessor (and can be only getter)
2221 ExecutableElement inherited = 2240 ExecutableElement inherited =
2222 _inheritanceManager.lookupInheritance(_enclosingClass, name); 2241 _inheritanceManager.lookupInheritance(_enclosingClass, name);
2223 if (inherited is! PropertyAccessorElement) { 2242 if (inherited is! PropertyAccessorElement) {
2224 continue; 2243 continue;
2225 } 2244 }
2226 // report problem 2245 // report problem
2227 hasProblem = true; 2246 hasProblem = true;
2228 _errorReporter.reportErrorForOffset( 2247 _errorReporter.reportErrorForOffset(
2229 CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD, method.nameOffset, 2248 CompileTimeErrorCode.CONFLICTING_GETTER_AND_METHOD,
2249 method.nameOffset,
2230 name.length, [ 2250 name.length, [
2231 _enclosingClass.displayName, 2251 _enclosingClass.displayName,
2232 inherited.enclosingElement.displayName, 2252 inherited.enclosingElement.displayName,
2233 name 2253 name
2234 ]); 2254 ]);
2235 } 2255 }
2236 // getter declared in the enclosing class vs. inherited method 2256 // getter declared in the enclosing class vs. inherited method
2237 for (PropertyAccessorElement accessor in _enclosingClass.accessors) { 2257 for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
2238 if (!accessor.isGetter) { 2258 if (!accessor.isGetter) {
2239 continue; 2259 continue;
2240 } 2260 }
2241 String name = accessor.name; 2261 String name = accessor.name;
2242 // find inherited method 2262 // find inherited method
2243 ExecutableElement inherited = 2263 ExecutableElement inherited =
2244 _inheritanceManager.lookupInheritance(_enclosingClass, name); 2264 _inheritanceManager.lookupInheritance(_enclosingClass, name);
2245 if (inherited is! MethodElement) { 2265 if (inherited is! MethodElement) {
2246 continue; 2266 continue;
2247 } 2267 }
2248 // report problem 2268 // report problem
2249 hasProblem = true; 2269 hasProblem = true;
2250 _errorReporter.reportErrorForOffset( 2270 _errorReporter.reportErrorForOffset(
2251 CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER, 2271 CompileTimeErrorCode.CONFLICTING_METHOD_AND_GETTER,
2252 accessor.nameOffset, name.length, [ 2272 accessor.nameOffset,
2273 name.length, [
2253 _enclosingClass.displayName, 2274 _enclosingClass.displayName,
2254 inherited.enclosingElement.displayName, 2275 inherited.enclosingElement.displayName,
2255 name 2276 name
2256 ]); 2277 ]);
2257 } 2278 }
2258 // done 2279 // done
2259 return hasProblem; 2280 return hasProblem;
2260 } 2281 }
2261 2282
2262 /** 2283 /**
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
2308 } 2329 }
2309 // prepare "super" type to report its name 2330 // prepare "super" type to report its name
2310 ClassElement superElementClass = 2331 ClassElement superElementClass =
2311 superElement.enclosingElement as ClassElement; 2332 superElement.enclosingElement as ClassElement;
2312 InterfaceType superElementType = superElementClass.type; 2333 InterfaceType superElementType = superElementClass.type;
2313 // report problem 2334 // report problem
2314 hasProblem = true; 2335 hasProblem = true;
2315 if (getter) { 2336 if (getter) {
2316 _errorReporter.reportErrorForElement( 2337 _errorReporter.reportErrorForElement(
2317 StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER, 2338 StaticWarningCode.CONFLICTING_INSTANCE_GETTER_AND_SUPERCLASS_MEMBER,
2318 accessor, [superElementType.displayName]); 2339 accessor,
2340 [superElementType.displayName]);
2319 } else { 2341 } else {
2320 _errorReporter.reportErrorForElement( 2342 _errorReporter.reportErrorForElement(
2321 StaticWarningCode.CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER, 2343 StaticWarningCode.CONFLICTING_INSTANCE_SETTER_AND_SUPERCLASS_MEMBER,
2322 accessor, [superElementType.displayName]); 2344 accessor,
2345 [superElementType.displayName]);
2323 } 2346 }
2324 } 2347 }
2325 // done 2348 // done
2326 return hasProblem; 2349 return hasProblem;
2327 } 2350 }
2328 2351
2329 /** 2352 /**
2330 * Verify that the enclosing class does not have a setter with the same name 2353 * Verify that the enclosing class does not have a setter with the same name
2331 * as the given instance method declaration. 2354 * as the given instance method declaration.
2332 * 2355 *
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
2394 addThisMemberToTheMap = false; 2417 addThisMemberToTheMap = false;
2395 } 2418 }
2396 } else if (isSetter) { 2419 } else if (isSetter) {
2397 String methodName = name.name; 2420 String methodName = name.name;
2398 ClassMember conflictingMethod = memberHashMap[methodName]; 2421 ClassMember conflictingMethod = memberHashMap[methodName];
2399 if (conflictingMethod != null && 2422 if (conflictingMethod != null &&
2400 conflictingMethod is MethodDeclaration && 2423 conflictingMethod is MethodDeclaration &&
2401 !conflictingMethod.isGetter) { 2424 !conflictingMethod.isGetter) {
2402 // report problem 2425 // report problem
2403 _errorReporter.reportErrorForNode( 2426 _errorReporter.reportErrorForNode(
2404 StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER2, name, [ 2427 StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER2,
2405 _enclosingClass.displayName, 2428 name,
2406 name.name 2429 [_enclosingClass.displayName, name.name]);
2407 ]);
2408 foundError = true; 2430 foundError = true;
2409 addThisMemberToTheMap = false; 2431 addThisMemberToTheMap = false;
2410 } 2432 }
2411 } 2433 }
2412 // Finally, add this member into the HashMap. 2434 // Finally, add this member into the HashMap.
2413 if (addThisMemberToTheMap) { 2435 if (addThisMemberToTheMap) {
2414 if (method.isSetter) { 2436 if (method.isSetter) {
2415 memberHashMap["${name.name}="] = method; 2437 memberHashMap["${name.name}="] = method;
2416 } else { 2438 } else {
2417 memberHashMap[name.name] = method; 2439 memberHashMap[name.name] = method;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
2453 // OK, also static 2475 // OK, also static
2454 if (setter.isStatic) { 2476 if (setter.isStatic) {
2455 return false; 2477 return false;
2456 } 2478 }
2457 // prepare "setter" type to report its name 2479 // prepare "setter" type to report its name
2458 ClassElement setterClass = setter.enclosingElement as ClassElement; 2480 ClassElement setterClass = setter.enclosingElement as ClassElement;
2459 InterfaceType setterType = setterClass.type; 2481 InterfaceType setterType = setterClass.type;
2460 // report problem 2482 // report problem
2461 _errorReporter.reportErrorForNode( 2483 _errorReporter.reportErrorForNode(
2462 StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER, 2484 StaticWarningCode.CONFLICTING_STATIC_GETTER_AND_INSTANCE_SETTER,
2463 nameNode, [setterType.displayName]); 2485 nameNode,
2486 [setterType.displayName]);
2464 return true; 2487 return true;
2465 } 2488 }
2466 2489
2467 /** 2490 /**
2468 * Verify that the enclosing class does not have an instance member with the 2491 * Verify that the enclosing class does not have an instance member with the
2469 * same name as the given static [method] declaration. 2492 * same name as the given static [method] declaration.
2470 * 2493 *
2471 * See [StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER]. 2494 * See [StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER].
2472 */ 2495 */
2473 bool _checkForConflictingStaticSetterAndInstanceMember( 2496 bool _checkForConflictingStaticSetterAndInstanceMember(
(...skipping 27 matching lines...) Expand all
2501 // OK, also static 2524 // OK, also static
2502 if (member.isStatic) { 2525 if (member.isStatic) {
2503 return false; 2526 return false;
2504 } 2527 }
2505 // prepare "member" type to report its name 2528 // prepare "member" type to report its name
2506 ClassElement memberClass = member.enclosingElement as ClassElement; 2529 ClassElement memberClass = member.enclosingElement as ClassElement;
2507 InterfaceType memberType = memberClass.type; 2530 InterfaceType memberType = memberClass.type;
2508 // report problem 2531 // report problem
2509 _errorReporter.reportErrorForNode( 2532 _errorReporter.reportErrorForNode(
2510 StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER, 2533 StaticWarningCode.CONFLICTING_STATIC_SETTER_AND_INSTANCE_MEMBER,
2511 nameNode, [memberType.displayName]); 2534 nameNode,
2535 [memberType.displayName]);
2512 return true; 2536 return true;
2513 } 2537 }
2514 2538
2515 /** 2539 /**
2516 * Verify all conflicts between type variable and enclosing class. 2540 * Verify all conflicts between type variable and enclosing class.
2517 * TODO(scheglov) 2541 * TODO(scheglov)
2518 * 2542 *
2519 * See [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS], and 2543 * See [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS], and
2520 * [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER]. 2544 * [CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER].
2521 */ 2545 */
2522 bool _checkForConflictingTypeVariableErrorCodes( 2546 bool _checkForConflictingTypeVariableErrorCodes(
2523 ClassDeclaration declaration) { 2547 ClassDeclaration declaration) {
2524 bool problemReported = false; 2548 bool problemReported = false;
2525 for (TypeParameterElement typeParameter in _enclosingClass.typeParameters) { 2549 for (TypeParameterElement typeParameter in _enclosingClass.typeParameters) {
2526 String name = typeParameter.name; 2550 String name = typeParameter.name;
2527 // name is same as the name of the enclosing class 2551 // name is same as the name of the enclosing class
2528 if (_enclosingClass.name == name) { 2552 if (_enclosingClass.name == name) {
2529 _errorReporter.reportErrorForOffset( 2553 _errorReporter.reportErrorForOffset(
2530 CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS, 2554 CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_CLASS,
2531 typeParameter.nameOffset, name.length, [name]); 2555 typeParameter.nameOffset,
2556 name.length,
2557 [name]);
2532 problemReported = true; 2558 problemReported = true;
2533 } 2559 }
2534 // check members 2560 // check members
2535 if (_enclosingClass.getMethod(name) != null || 2561 if (_enclosingClass.getMethod(name) != null ||
2536 _enclosingClass.getGetter(name) != null || 2562 _enclosingClass.getGetter(name) != null ||
2537 _enclosingClass.getSetter(name) != null) { 2563 _enclosingClass.getSetter(name) != null) {
2538 _errorReporter.reportErrorForOffset( 2564 _errorReporter.reportErrorForOffset(
2539 CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER, 2565 CompileTimeErrorCode.CONFLICTING_TYPE_VARIABLE_AND_MEMBER,
2540 typeParameter.nameOffset, name.length, [name]); 2566 typeParameter.nameOffset,
2567 name.length,
2568 [name]);
2541 problemReported = true; 2569 problemReported = true;
2542 } 2570 }
2543 } 2571 }
2544 return problemReported; 2572 return problemReported;
2545 } 2573 }
2546 2574
2547 /** 2575 /**
2548 * Verify that if the given [constructor] declaration is 'const' then there 2576 * Verify that if the given [constructor] declaration is 'const' then there
2549 * are no invocations of non-'const' super constructors. 2577 * are no invocations of non-'const' super constructors.
2550 * 2578 *
(...skipping 18 matching lines...) Expand all
2569 // try to find and check super constructor invocation 2597 // try to find and check super constructor invocation
2570 for (ConstructorInitializer initializer in constructor.initializers) { 2598 for (ConstructorInitializer initializer in constructor.initializers) {
2571 if (initializer is SuperConstructorInvocation) { 2599 if (initializer is SuperConstructorInvocation) {
2572 SuperConstructorInvocation superInvocation = initializer; 2600 SuperConstructorInvocation superInvocation = initializer;
2573 ConstructorElement element = superInvocation.staticElement; 2601 ConstructorElement element = superInvocation.staticElement;
2574 if (element == null || element.isConst) { 2602 if (element == null || element.isConst) {
2575 return false; 2603 return false;
2576 } 2604 }
2577 _errorReporter.reportErrorForNode( 2605 _errorReporter.reportErrorForNode(
2578 CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, 2606 CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER,
2579 superInvocation, [element.enclosingElement.displayName]); 2607 superInvocation,
2608 [element.enclosingElement.displayName]);
2580 return true; 2609 return true;
2581 } 2610 }
2582 } 2611 }
2583 // no explicit super constructor invocation, check default constructor 2612 // no explicit super constructor invocation, check default constructor
2584 InterfaceType supertype = _enclosingClass.supertype; 2613 InterfaceType supertype = _enclosingClass.supertype;
2585 if (supertype == null) { 2614 if (supertype == null) {
2586 return false; 2615 return false;
2587 } 2616 }
2588 if (supertype.isObject) { 2617 if (supertype.isObject) {
2589 return false; 2618 return false;
2590 } 2619 }
2591 ConstructorElement unnamedConstructor = 2620 ConstructorElement unnamedConstructor =
2592 supertype.element.unnamedConstructor; 2621 supertype.element.unnamedConstructor;
2593 if (unnamedConstructor == null) { 2622 if (unnamedConstructor == null) {
2594 return false; 2623 return false;
2595 } 2624 }
2596 if (unnamedConstructor.isConst) { 2625 if (unnamedConstructor.isConst) {
2597 return false; 2626 return false;
2598 } 2627 }
2599 // default constructor is not 'const', report problem 2628 // default constructor is not 'const', report problem
2600 _errorReporter.reportErrorForNode( 2629 _errorReporter.reportErrorForNode(
2601 CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER, 2630 CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_CONST_SUPER,
2602 constructor.returnType, [supertype.displayName]); 2631 constructor.returnType,
2632 [supertype.displayName]);
2603 return true; 2633 return true;
2604 } 2634 }
2605 2635
2606 /** 2636 /**
2607 * Verify that if the given [constructor] declaration is 'const' then there 2637 * Verify that if the given [constructor] declaration is 'const' then there
2608 * are no non-final instance variable. The [constructorElement] is the 2638 * are no non-final instance variable. The [constructorElement] is the
2609 * constructor element. 2639 * constructor element.
2610 * 2640 *
2611 * See [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD]. 2641 * See [CompileTimeErrorCode.CONST_CONSTRUCTOR_WITH_NON_FINAL_FIELD].
2612 */ 2642 */
(...skipping 20 matching lines...) Expand all
2633 * creating a deferred type. The [constructorName] is the constructor name, 2663 * creating a deferred type. The [constructorName] is the constructor name,
2634 * always non-`null`. The [typeName] is the name of the type defining the 2664 * always non-`null`. The [typeName] is the name of the type defining the
2635 * constructor, always non-`null`. 2665 * constructor, always non-`null`.
2636 * 2666 *
2637 * See [CompileTimeErrorCode.CONST_DEFERRED_CLASS]. 2667 * See [CompileTimeErrorCode.CONST_DEFERRED_CLASS].
2638 */ 2668 */
2639 bool _checkForConstDeferredClass(InstanceCreationExpression expression, 2669 bool _checkForConstDeferredClass(InstanceCreationExpression expression,
2640 ConstructorName constructorName, TypeName typeName) { 2670 ConstructorName constructorName, TypeName typeName) {
2641 if (typeName.isDeferred) { 2671 if (typeName.isDeferred) {
2642 _errorReporter.reportErrorForNode( 2672 _errorReporter.reportErrorForNode(
2643 CompileTimeErrorCode.CONST_DEFERRED_CLASS, constructorName, 2673 CompileTimeErrorCode.CONST_DEFERRED_CLASS,
2674 constructorName,
2644 [typeName.name.name]); 2675 [typeName.name.name]);
2645 return true; 2676 return true;
2646 } 2677 }
2647 return false; 2678 return false;
2648 } 2679 }
2649 2680
2650 /** 2681 /**
2651 * Verify that the given throw [expression] is not enclosed in a 'const' 2682 * Verify that the given throw [expression] is not enclosed in a 'const'
2652 * constructor declaration. 2683 * constructor declaration.
2653 * 2684 *
(...skipping 26 matching lines...) Expand all
2680 * Verify that the given instance creation [expression] is not being invoked 2711 * Verify that the given instance creation [expression] is not being invoked
2681 * on an abstract class. The [typeName] is the [TypeName] of the 2712 * on an abstract class. The [typeName] is the [TypeName] of the
2682 * [ConstructorName] from the [InstanceCreationExpression], this is the AST 2713 * [ConstructorName] from the [InstanceCreationExpression], this is the AST
2683 * node that the error is attached to. The [type] is the type being 2714 * node that the error is attached to. The [type] is the type being
2684 * constructed with this [InstanceCreationExpression]. 2715 * constructed with this [InstanceCreationExpression].
2685 * 2716 *
2686 * See [StaticWarningCode.CONST_WITH_ABSTRACT_CLASS], and 2717 * See [StaticWarningCode.CONST_WITH_ABSTRACT_CLASS], and
2687 * [StaticWarningCode.NEW_WITH_ABSTRACT_CLASS]. 2718 * [StaticWarningCode.NEW_WITH_ABSTRACT_CLASS].
2688 */ 2719 */
2689 bool _checkForConstOrNewWithAbstractClass( 2720 bool _checkForConstOrNewWithAbstractClass(
2690 InstanceCreationExpression expression, TypeName typeName, 2721 InstanceCreationExpression expression,
2722 TypeName typeName,
2691 InterfaceType type) { 2723 InterfaceType type) {
2692 if (type.element.isAbstract) { 2724 if (type.element.isAbstract) {
2693 ConstructorElement element = expression.staticElement; 2725 ConstructorElement element = expression.staticElement;
2694 if (element != null && !element.isFactory) { 2726 if (element != null && !element.isFactory) {
2695 if ((expression.keyword as sc.KeywordToken).keyword == 2727 if ((expression.keyword as sc.KeywordToken).keyword ==
2696 sc.Keyword.CONST) { 2728 sc.Keyword.CONST) {
2697 _errorReporter.reportErrorForNode( 2729 _errorReporter.reportErrorForNode(
2698 StaticWarningCode.CONST_WITH_ABSTRACT_CLASS, typeName); 2730 StaticWarningCode.CONST_WITH_ABSTRACT_CLASS, typeName);
2699 } else { 2731 } else {
2700 _errorReporter.reportErrorForNode( 2732 _errorReporter.reportErrorForNode(
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
2784 * constructor name, always non-`null`. The [typeName] is the name of the type 2816 * constructor name, always non-`null`. The [typeName] is the name of the type
2785 * defining the constructor, always non-`null`. 2817 * defining the constructor, always non-`null`.
2786 * 2818 *
2787 * This method assumes that the instance creation was tested to be 'const' 2819 * This method assumes that the instance creation was tested to be 'const'
2788 * before being called. 2820 * before being called.
2789 * 2821 *
2790 * See [CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR], and 2822 * See [CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR], and
2791 * [CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT]. 2823 * [CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT].
2792 */ 2824 */
2793 bool _checkForConstWithUndefinedConstructor( 2825 bool _checkForConstWithUndefinedConstructor(
2794 InstanceCreationExpression expression, ConstructorName constructorName, 2826 InstanceCreationExpression expression,
2827 ConstructorName constructorName,
2795 TypeName typeName) { 2828 TypeName typeName) {
2796 // OK if resolved 2829 // OK if resolved
2797 if (expression.staticElement != null) { 2830 if (expression.staticElement != null) {
2798 return false; 2831 return false;
2799 } 2832 }
2800 DartType type = typeName.type; 2833 DartType type = typeName.type;
2801 if (type is InterfaceType) { 2834 if (type is InterfaceType) {
2802 ClassElement element = type.element; 2835 ClassElement element = type.element;
2803 if (element != null && element.isEnum) { 2836 if (element != null && element.isEnum) {
2804 // We have already reported the error. 2837 // We have already reported the error.
2805 return false; 2838 return false;
2806 } 2839 }
2807 } 2840 }
2808 Identifier className = typeName.name; 2841 Identifier className = typeName.name;
2809 // report as named or default constructor absence 2842 // report as named or default constructor absence
2810 SimpleIdentifier name = constructorName.name; 2843 SimpleIdentifier name = constructorName.name;
2811 if (name != null) { 2844 if (name != null) {
2812 _errorReporter.reportErrorForNode( 2845 _errorReporter.reportErrorForNode(
2813 CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR, name, [ 2846 CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR,
2814 className, 2847 name,
2815 name 2848 [className, name]);
2816 ]);
2817 } else { 2849 } else {
2818 _errorReporter.reportErrorForNode( 2850 _errorReporter.reportErrorForNode(
2819 CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, 2851 CompileTimeErrorCode.CONST_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT,
2820 constructorName, [className]); 2852 constructorName,
2853 [className]);
2821 } 2854 }
2822 return true; 2855 return true;
2823 } 2856 }
2824 2857
2825 /** 2858 /**
2826 * Verify that there are no default parameters in the given function type 2859 * Verify that there are no default parameters in the given function type
2827 * [alias]. 2860 * [alias].
2828 * 2861 *
2829 * See [CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS]. 2862 * See [CompileTimeErrorCode.DEFAULT_VALUE_IN_FUNCTION_TYPE_ALIAS].
2830 */ 2863 */
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
2961 String displayName; 2994 String displayName;
2962 Element enclosingElement = inheritedMember.enclosingElement; 2995 Element enclosingElement = inheritedMember.enclosingElement;
2963 if (enclosingElement.source == _enclosingClass.source) { 2996 if (enclosingElement.source == _enclosingClass.source) {
2964 displayName = enclosingElement.displayName; 2997 displayName = enclosingElement.displayName;
2965 } else { 2998 } else {
2966 displayName = enclosingElement.getExtendedDisplayName(null); 2999 displayName = enclosingElement.getExtendedDisplayName(null);
2967 } 3000 }
2968 // report problem 3001 // report problem
2969 _errorReporter.reportErrorForOffset( 3002 _errorReporter.reportErrorForOffset(
2970 CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE, 3003 CompileTimeErrorCode.DUPLICATE_DEFINITION_INHERITANCE,
2971 staticMember.nameOffset, name.length, [name, displayName]); 3004 staticMember.nameOffset,
3005 name.length,
3006 [name, displayName]);
2972 return true; 3007 return true;
2973 } 3008 }
2974 3009
2975 /** 3010 /**
2976 * Verify that if the given list [literal] has type arguments then there is 3011 * Verify that if the given list [literal] has type arguments then there is
2977 * exactly one. The [typeArguments] are the type arguments. 3012 * exactly one. The [typeArguments] are the type arguments.
2978 * 3013 *
2979 * See [StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS]. 3014 * See [StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS].
2980 */ 3015 */
2981 bool _checkForExpectedOneListTypeArgument( 3016 bool _checkForExpectedOneListTypeArgument(
2982 ListLiteral literal, TypeArgumentList typeArguments) { 3017 ListLiteral literal, TypeArgumentList typeArguments) {
2983 // check number of type arguments 3018 // check number of type arguments
2984 int num = typeArguments.arguments.length; 3019 int num = typeArguments.arguments.length;
2985 if (num == 1) { 3020 if (num == 1) {
2986 return false; 3021 return false;
2987 } 3022 }
2988 // report problem 3023 // report problem
2989 _errorReporter.reportErrorForNode( 3024 _errorReporter.reportErrorForNode(
2990 StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS, typeArguments, 3025 StaticTypeWarningCode.EXPECTED_ONE_LIST_TYPE_ARGUMENTS,
3026 typeArguments,
2991 [num]); 3027 [num]);
2992 return true; 3028 return true;
2993 } 3029 }
2994 3030
2995 /** 3031 /**
2996 * Verify that the given export [directive] has a unique name among other 3032 * Verify that the given export [directive] has a unique name among other
2997 * exported libraries. The [exportElement] is the [ExportElement] retrieved 3033 * exported libraries. The [exportElement] is the [ExportElement] retrieved
2998 * from the node, if the element in the node was `null`, then this method is 3034 * from the node, if the element in the node was `null`, then this method is
2999 * not called. The [exportedLibrary] is the library element containing the 3035 * not called. The [exportedLibrary] is the library element containing the
3000 * exported element. 3036 * exported element.
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
3046 String uri = exportElement.uri; 3082 String uri = exportElement.uri;
3047 SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri); 3083 SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri);
3048 if (sdkLibrary == null) { 3084 if (sdkLibrary == null) {
3049 return false; 3085 return false;
3050 } 3086 }
3051 if (!sdkLibrary.isInternal) { 3087 if (!sdkLibrary.isInternal) {
3052 return false; 3088 return false;
3053 } 3089 }
3054 // report problem 3090 // report problem
3055 _errorReporter.reportErrorForNode( 3091 _errorReporter.reportErrorForNode(
3056 CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY, directive, 3092 CompileTimeErrorCode.EXPORT_INTERNAL_LIBRARY,
3093 directive,
3057 [directive.uri]); 3094 [directive.uri]);
3058 return true; 3095 return true;
3059 } 3096 }
3060 3097
3061 /** 3098 /**
3062 * Verify that the given extends [clause] does not extend a deferred class. 3099 * Verify that the given extends [clause] does not extend a deferred class.
3063 * 3100 *
3064 * See [CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS]. 3101 * See [CompileTimeErrorCode.EXTENDS_DEFERRED_CLASS].
3065 */ 3102 */
3066 bool _checkForExtendsDeferredClass(ExtendsClause clause) { 3103 bool _checkForExtendsDeferredClass(ExtendsClause clause) {
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
3215 } 3252 }
3216 if (staticType.isAssignableTo(fieldType)) { 3253 if (staticType.isAssignableTo(fieldType)) {
3217 return false; 3254 return false;
3218 } 3255 }
3219 // report problem 3256 // report problem
3220 if (_isEnclosingConstructorConst) { 3257 if (_isEnclosingConstructorConst) {
3221 // TODO(paulberry): this error should be based on the actual type of the 3258 // TODO(paulberry): this error should be based on the actual type of the
3222 // constant, not the static type. See dartbug.com/21119. 3259 // constant, not the static type. See dartbug.com/21119.
3223 _errorReporter.reportTypeErrorForNode( 3260 _errorReporter.reportTypeErrorForNode(
3224 CheckedModeCompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE , 3261 CheckedModeCompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE ,
3225 expression, [staticType, fieldType]); 3262 expression,
3263 [staticType, fieldType]);
3226 } 3264 }
3227 _errorReporter.reportTypeErrorForNode( 3265 _errorReporter.reportTypeErrorForNode(
3228 StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [ 3266 StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE,
3229 staticType, 3267 expression,
3230 fieldType 3268 [staticType, fieldType]);
3231 ]);
3232 return true; 3269 return true;
3233 // TODO(brianwilkerson) Define a hint corresponding to these errors and 3270 // TODO(brianwilkerson) Define a hint corresponding to these errors and
3234 // report it if appropriate. 3271 // report it if appropriate.
3235 // // test the propagated type of the expression 3272 // // test the propagated type of the expression
3236 // Type propagatedType = expression.getPropagatedType(); 3273 // Type propagatedType = expression.getPropagatedType();
3237 // if (propagatedType != null && propagatedType.isAssignableTo(fieldType) ) { 3274 // if (propagatedType != null && propagatedType.isAssignableTo(fieldType) ) {
3238 // return false; 3275 // return false;
3239 // } 3276 // }
3240 // // report problem 3277 // // report problem
3241 // if (isEnclosingConstructorConst) { 3278 // if (isEnclosingConstructorConst) {
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
3301 if (_isInNativeClass) { 3338 if (_isInNativeClass) {
3302 return false; 3339 return false;
3303 } 3340 }
3304 bool foundError = false; 3341 bool foundError = false;
3305 if (!list.isSynthetic) { 3342 if (!list.isSynthetic) {
3306 NodeList<VariableDeclaration> variables = list.variables; 3343 NodeList<VariableDeclaration> variables = list.variables;
3307 for (VariableDeclaration variable in variables) { 3344 for (VariableDeclaration variable in variables) {
3308 if (variable.initializer == null) { 3345 if (variable.initializer == null) {
3309 if (list.isConst) { 3346 if (list.isConst) {
3310 _errorReporter.reportErrorForNode( 3347 _errorReporter.reportErrorForNode(
3311 CompileTimeErrorCode.CONST_NOT_INITIALIZED, variable.name, 3348 CompileTimeErrorCode.CONST_NOT_INITIALIZED,
3349 variable.name,
3312 [variable.name.name]); 3350 [variable.name.name]);
3313 } else if (list.isFinal) { 3351 } else if (list.isFinal) {
3314 _errorReporter.reportErrorForNode( 3352 _errorReporter.reportErrorForNode(
3315 StaticWarningCode.FINAL_NOT_INITIALIZED, variable.name, 3353 StaticWarningCode.FINAL_NOT_INITIALIZED,
3354 variable.name,
3316 [variable.name.name]); 3355 [variable.name.name]);
3317 } 3356 }
3318 foundError = true; 3357 foundError = true;
3319 } 3358 }
3320 } 3359 }
3321 } 3360 }
3322 return foundError; 3361 return foundError;
3323 } 3362 }
3324 3363
3325 /** 3364 /**
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
3553 String uri = importElement.uri; 3592 String uri = importElement.uri;
3554 SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri); 3593 SdkLibrary sdkLibrary = sdk.getSdkLibrary(uri);
3555 if (sdkLibrary == null) { 3594 if (sdkLibrary == null) {
3556 return false; 3595 return false;
3557 } 3596 }
3558 if (!sdkLibrary.isInternal) { 3597 if (!sdkLibrary.isInternal) {
3559 return false; 3598 return false;
3560 } 3599 }
3561 // report problem 3600 // report problem
3562 _errorReporter.reportErrorForNode( 3601 _errorReporter.reportErrorForNode(
3563 CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY, directive, 3602 CompileTimeErrorCode.IMPORT_INTERNAL_LIBRARY,
3603 directive,
3564 [directive.uri]); 3604 [directive.uri]);
3565 return true; 3605 return true;
3566 } 3606 }
3567 3607
3568 /** 3608 /**
3569 * For each class declaration, this method is called which verifies that all 3609 * For each class declaration, this method is called which verifies that all
3570 * inherited members are inherited consistently. 3610 * inherited members are inherited consistently.
3571 * 3611 *
3572 * See [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE]. 3612 * See [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE].
3573 */ 3613 */
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
3612 // OK, top-level element 3652 // OK, top-level element
3613 if (executableElement.enclosingElement is! ClassElement) { 3653 if (executableElement.enclosingElement is! ClassElement) {
3614 return false; 3654 return false;
3615 } 3655 }
3616 // OK, instance member 3656 // OK, instance member
3617 if (!executableElement.isStatic) { 3657 if (!executableElement.isStatic) {
3618 return false; 3658 return false;
3619 } 3659 }
3620 // report problem 3660 // report problem
3621 _errorReporter.reportErrorForNode( 3661 _errorReporter.reportErrorForNode(
3622 StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER, name, 3662 StaticTypeWarningCode.INSTANCE_ACCESS_TO_STATIC_MEMBER,
3663 name,
3623 [name.name]); 3664 [name.name]);
3624 return true; 3665 return true;
3625 } 3666 }
3626 3667
3627 /** 3668 /**
3628 * Check whether the given [executableElement] collides with the name of a 3669 * Check whether the given [executableElement] collides with the name of a
3629 * static method in one of its superclasses, and reports the appropriate 3670 * static method in one of its superclasses, and reports the appropriate
3630 * warning if it does. The [errorNameTarget] is the node to report problems 3671 * warning if it does. The [errorNameTarget] is the node to report problems
3631 * on. 3672 * on.
3632 * 3673 *
(...skipping 20 matching lines...) Expand all
3653 if (fieldElt != null) { 3694 if (fieldElt != null) {
3654 // Ignore if private in a different library - cannot collide. 3695 // Ignore if private in a different library - cannot collide.
3655 if (executableElementPrivate && 3696 if (executableElementPrivate &&
3656 _currentLibrary != superclassLibrary) { 3697 _currentLibrary != superclassLibrary) {
3657 continue; 3698 continue;
3658 } 3699 }
3659 // instance vs. static 3700 // instance vs. static
3660 if (fieldElt.isStatic) { 3701 if (fieldElt.isStatic) {
3661 _errorReporter.reportErrorForNode( 3702 _errorReporter.reportErrorForNode(
3662 StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_ STATIC, 3703 StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_ STATIC,
3663 errorNameTarget, [ 3704 errorNameTarget,
3664 executableElementName, 3705 [executableElementName, fieldElt.enclosingElement.displayName]);
3665 fieldElt.enclosingElement.displayName
3666 ]);
3667 return true; 3706 return true;
3668 } 3707 }
3669 } 3708 }
3670 // Check methods. 3709 // Check methods.
3671 List<MethodElement> methodElements = superclassElement.methods; 3710 List<MethodElement> methodElements = superclassElement.methods;
3672 for (MethodElement methodElement in methodElements) { 3711 for (MethodElement methodElement in methodElements) {
3673 // We need the same name. 3712 // We need the same name.
3674 if (methodElement.name != executableElementName) { 3713 if (methodElement.name != executableElementName) {
3675 continue; 3714 continue;
3676 } 3715 }
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
3744 if (lhs == null || rhs == null) { 3783 if (lhs == null || rhs == null) {
3745 return false; 3784 return false;
3746 } 3785 }
3747 VariableElement leftVariableElement = getVariableElement(lhs); 3786 VariableElement leftVariableElement = getVariableElement(lhs);
3748 DartType leftType = (leftVariableElement == null) 3787 DartType leftType = (leftVariableElement == null)
3749 ? getStaticType(lhs) 3788 ? getStaticType(lhs)
3750 : leftVariableElement.type; 3789 : leftVariableElement.type;
3751 DartType staticRightType = getStaticType(rhs); 3790 DartType staticRightType = getStaticType(rhs);
3752 if (!staticRightType.isAssignableTo(leftType)) { 3791 if (!staticRightType.isAssignableTo(leftType)) {
3753 _errorReporter.reportTypeErrorForNode( 3792 _errorReporter.reportTypeErrorForNode(
3754 StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [ 3793 StaticTypeWarningCode.INVALID_ASSIGNMENT,
3755 staticRightType, 3794 rhs,
3756 leftType 3795 [staticRightType, leftType]);
3757 ]);
3758 return true; 3796 return true;
3759 } 3797 }
3760 return false; 3798 return false;
3761 } 3799 }
3762 3800
3763 /** 3801 /**
3764 * Given an [assignment] using a compound assignment operator, this verifies 3802 * Given an [assignment] using a compound assignment operator, this verifies
3765 * that the given assignment is valid. The [lhs] is the left hand side 3803 * that the given assignment is valid. The [lhs] is the left hand side
3766 * expression. The [rhs] is the right hand side expression. 3804 * expression. The [rhs] is the right hand side expression.
3767 * 3805 *
(...skipping 30 matching lines...) Expand all
3798 * [ConstructorFieldInitializer]. The [staticElement] is the static element 3836 * [ConstructorFieldInitializer]. The [staticElement] is the static element
3799 * from the name in the [ConstructorFieldInitializer]. 3837 * from the name in the [ConstructorFieldInitializer].
3800 */ 3838 */
3801 void _checkForInvalidField(ConstructorFieldInitializer initializer, 3839 void _checkForInvalidField(ConstructorFieldInitializer initializer,
3802 SimpleIdentifier fieldName, Element staticElement) { 3840 SimpleIdentifier fieldName, Element staticElement) {
3803 if (staticElement is FieldElement) { 3841 if (staticElement is FieldElement) {
3804 FieldElement fieldElement = staticElement; 3842 FieldElement fieldElement = staticElement;
3805 if (fieldElement.isSynthetic) { 3843 if (fieldElement.isSynthetic) {
3806 _errorReporter.reportErrorForNode( 3844 _errorReporter.reportErrorForNode(
3807 CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD, 3845 CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD,
3808 initializer, [fieldName]); 3846 initializer,
3847 [fieldName]);
3809 } else if (fieldElement.isStatic) { 3848 } else if (fieldElement.isStatic) {
3810 _errorReporter.reportErrorForNode( 3849 _errorReporter.reportErrorForNode(
3811 CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD, initializer, 3850 CompileTimeErrorCode.INITIALIZER_FOR_STATIC_FIELD,
3851 initializer,
3812 [fieldName]); 3852 [fieldName]);
3813 } 3853 }
3814 } else { 3854 } else {
3815 _errorReporter.reportErrorForNode( 3855 _errorReporter.reportErrorForNode(
3816 CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD, initializer, 3856 CompileTimeErrorCode.INITIALIZER_FOR_NON_EXISTENT_FIELD,
3857 initializer,
3817 [fieldName]); 3858 [fieldName]);
3818 return; 3859 return;
3819 } 3860 }
3820 } 3861 }
3821 3862
3822 /** 3863 /**
3823 * Check to see whether the given function [body] has a modifier associated 3864 * Check to see whether the given function [body] has a modifier associated
3824 * with it, and report it as an error if it does. 3865 * with it, and report it as an error if it does.
3825 */ 3866 */
3826 bool _checkForInvalidModifierOnBody( 3867 bool _checkForInvalidModifierOnBody(
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
3878 if (typeNames.length < 1) { 3919 if (typeNames.length < 1) {
3879 return false; 3920 return false;
3880 } 3921 }
3881 DartType listElementType = typeNames[0].type; 3922 DartType listElementType = typeNames[0].type;
3882 // Check every list element. 3923 // Check every list element.
3883 bool hasProblems = false; 3924 bool hasProblems = false;
3884 for (Expression element in literal.elements) { 3925 for (Expression element in literal.elements) {
3885 if (literal.constKeyword != null) { 3926 if (literal.constKeyword != null) {
3886 // TODO(paulberry): this error should be based on the actual type of the 3927 // TODO(paulberry): this error should be based on the actual type of the
3887 // list element, not the static type. See dartbug.com/21119. 3928 // list element, not the static type. See dartbug.com/21119.
3888 if (_checkForArgumentTypeNotAssignableWithExpectedTypes(element, 3929 if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
3930 element,
3889 listElementType, 3931 listElementType,
3890 CheckedModeCompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE)) { 3932 CheckedModeCompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE)) {
3891 hasProblems = true; 3933 hasProblems = true;
3892 } 3934 }
3893 } 3935 }
3894 if (_checkForArgumentTypeNotAssignableWithExpectedTypes(element, 3936 if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
3937 element,
3895 listElementType, 3938 listElementType,
3896 StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE)) { 3939 StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE)) {
3897 hasProblems = true; 3940 hasProblems = true;
3898 } 3941 }
3899 } 3942 }
3900 return hasProblems; 3943 return hasProblems;
3901 } 3944 }
3902 3945
3903 /** 3946 /**
3904 * Verify that the key/value of entries of the given map [literal] are 3947 * Verify that the key/value of entries of the given map [literal] are
(...skipping 20 matching lines...) Expand all
3925 for (MapLiteralEntry entry in entries) { 3968 for (MapLiteralEntry entry in entries) {
3926 Expression key = entry.key; 3969 Expression key = entry.key;
3927 Expression value = entry.value; 3970 Expression value = entry.value;
3928 if (literal.constKeyword != null) { 3971 if (literal.constKeyword != null) {
3929 // TODO(paulberry): this error should be based on the actual type of the 3972 // TODO(paulberry): this error should be based on the actual type of the
3930 // list element, not the static type. See dartbug.com/21119. 3973 // list element, not the static type. See dartbug.com/21119.
3931 if (_checkForArgumentTypeNotAssignableWithExpectedTypes(key, keyType, 3974 if (_checkForArgumentTypeNotAssignableWithExpectedTypes(key, keyType,
3932 CheckedModeCompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE)) { 3975 CheckedModeCompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE)) {
3933 hasProblems = true; 3976 hasProblems = true;
3934 } 3977 }
3935 if (_checkForArgumentTypeNotAssignableWithExpectedTypes(value, 3978 if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
3979 value,
3936 valueType, 3980 valueType,
3937 CheckedModeCompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE)) { 3981 CheckedModeCompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE)) {
3938 hasProblems = true; 3982 hasProblems = true;
3939 } 3983 }
3940 } 3984 }
3941 if (_checkForArgumentTypeNotAssignableWithExpectedTypes( 3985 if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
3942 key, keyType, StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE)) { 3986 key, keyType, StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE)) {
3943 hasProblems = true; 3987 hasProblems = true;
3944 } 3988 }
3945 if (_checkForArgumentTypeNotAssignableWithExpectedTypes( 3989 if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
(...skipping 16 matching lines...) Expand all
3962 } 4006 }
3963 String className = _enclosingClass.name; 4007 String className = _enclosingClass.name;
3964 if (className == null) { 4008 if (className == null) {
3965 return false; 4009 return false;
3966 } 4010 }
3967 bool problemReported = false; 4011 bool problemReported = false;
3968 // check accessors 4012 // check accessors
3969 for (PropertyAccessorElement accessor in _enclosingClass.accessors) { 4013 for (PropertyAccessorElement accessor in _enclosingClass.accessors) {
3970 if (className == accessor.name) { 4014 if (className == accessor.name) {
3971 _errorReporter.reportErrorForOffset( 4015 _errorReporter.reportErrorForOffset(
3972 CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME, accessor.nameOffset, 4016 CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME,
4017 accessor.nameOffset,
3973 className.length); 4018 className.length);
3974 problemReported = true; 4019 problemReported = true;
3975 } 4020 }
3976 } 4021 }
3977 // don't check methods, they would be constructors 4022 // don't check methods, they would be constructors
3978 // done 4023 // done
3979 return problemReported; 4024 return problemReported;
3980 } 4025 }
3981 4026
3982 /** 4027 /**
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
4048 getterType = _getGetterType(counterpartAccessor); 4093 getterType = _getGetterType(counterpartAccessor);
4049 } 4094 }
4050 // If either types are not assignable to each other, report an error 4095 // If either types are not assignable to each other, report an error
4051 // (if the getter is null, it is dynamic which is assignable to everything). 4096 // (if the getter is null, it is dynamic which is assignable to everything).
4052 if (setterType != null && 4097 if (setterType != null &&
4053 getterType != null && 4098 getterType != null &&
4054 !getterType.isAssignableTo(setterType)) { 4099 !getterType.isAssignableTo(setterType)) {
4055 if (enclosingClassForCounterpart == null) { 4100 if (enclosingClassForCounterpart == null) {
4056 _errorReporter.reportTypeErrorForNode( 4101 _errorReporter.reportTypeErrorForNode(
4057 StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES, 4102 StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES,
4058 accessorDeclaration, [accessorTextName, setterType, getterType]); 4103 accessorDeclaration,
4104 [accessorTextName, setterType, getterType]);
4059 return true; 4105 return true;
4060 } else { 4106 } else {
4061 _errorReporter.reportTypeErrorForNode( 4107 _errorReporter.reportTypeErrorForNode(
4062 StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, 4108 StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE,
4063 accessorDeclaration, [ 4109 accessorDeclaration, [
4064 accessorTextName, 4110 accessorTextName,
4065 setterType, 4111 setterType,
4066 getterType, 4112 getterType,
4067 enclosingClassForCounterpart.displayName 4113 enclosingClassForCounterpart.displayName
4068 ]); 4114 ]);
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
4114 } 4160 }
4115 } 4161 }
4116 int nameCount = constantNames.length; 4162 int nameCount = constantNames.length;
4117 if (nameCount == 0) { 4163 if (nameCount == 0) {
4118 return false; 4164 return false;
4119 } 4165 }
4120 for (int i = 0; i < nameCount; i++) { 4166 for (int i = 0; i < nameCount; i++) {
4121 int offset = statement.offset; 4167 int offset = statement.offset;
4122 int end = statement.rightParenthesis.end; 4168 int end = statement.rightParenthesis.end;
4123 _errorReporter.reportErrorForOffset( 4169 _errorReporter.reportErrorForOffset(
4124 CompileTimeErrorCode.MISSING_ENUM_CONSTANT_IN_SWITCH, offset, 4170 CompileTimeErrorCode.MISSING_ENUM_CONSTANT_IN_SWITCH,
4125 end - offset, [constantNames[i]]); 4171 offset,
4172 end - offset,
4173 [constantNames[i]]);
4126 } 4174 }
4127 return true; 4175 return true;
4128 } 4176 }
4129 4177
4130 /** 4178 /**
4131 * Verify that the given function [body] does not contain return statements 4179 * Verify that the given function [body] does not contain return statements
4132 * that both have and do not have return values. 4180 * that both have and do not have return values.
4133 * 4181 *
4134 * See [StaticWarningCode.MIXED_RETURN_TYPES]. 4182 * See [StaticWarningCode.MIXED_RETURN_TYPES].
4135 */ 4183 */
(...skipping 22 matching lines...) Expand all
4158 * constructor. The [mixinName] is the node to report problem on. The 4206 * constructor. The [mixinName] is the node to report problem on. The
4159 * [mixinElement] is the mixing to evaluate. 4207 * [mixinElement] is the mixing to evaluate.
4160 * 4208 *
4161 * See [CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR]. 4209 * See [CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR].
4162 */ 4210 */
4163 bool _checkForMixinDeclaresConstructor( 4211 bool _checkForMixinDeclaresConstructor(
4164 TypeName mixinName, ClassElement mixinElement) { 4212 TypeName mixinName, ClassElement mixinElement) {
4165 for (ConstructorElement constructor in mixinElement.constructors) { 4213 for (ConstructorElement constructor in mixinElement.constructors) {
4166 if (!constructor.isSynthetic && !constructor.isFactory) { 4214 if (!constructor.isSynthetic && !constructor.isFactory) {
4167 _errorReporter.reportErrorForNode( 4215 _errorReporter.reportErrorForNode(
4168 CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR, mixinName, 4216 CompileTimeErrorCode.MIXIN_DECLARES_CONSTRUCTOR,
4217 mixinName,
4169 [mixinElement.name]); 4218 [mixinElement.name]);
4170 return true; 4219 return true;
4171 } 4220 }
4172 } 4221 }
4173 return false; 4222 return false;
4174 } 4223 }
4175 4224
4176 /** 4225 /**
4177 * Report the error [CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS] if 4226 * Report the error [CompileTimeErrorCode.MIXIN_HAS_NO_CONSTRUCTORS] if
4178 * appropriate. 4227 * appropriate.
(...skipping 13 matching lines...) Expand all
4192 * 4241 *
4193 * See [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT]. 4242 * See [CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT].
4194 */ 4243 */
4195 bool _checkForMixinInheritsNotFromObject( 4244 bool _checkForMixinInheritsNotFromObject(
4196 TypeName mixinName, ClassElement mixinElement) { 4245 TypeName mixinName, ClassElement mixinElement) {
4197 InterfaceType mixinSupertype = mixinElement.supertype; 4246 InterfaceType mixinSupertype = mixinElement.supertype;
4198 if (mixinSupertype != null) { 4247 if (mixinSupertype != null) {
4199 if (!mixinSupertype.isObject || 4248 if (!mixinSupertype.isObject ||
4200 !mixinElement.isMixinApplication && mixinElement.mixins.length != 0) { 4249 !mixinElement.isMixinApplication && mixinElement.mixins.length != 0) {
4201 _errorReporter.reportErrorForNode( 4250 _errorReporter.reportErrorForNode(
4202 CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT, mixinName, 4251 CompileTimeErrorCode.MIXIN_INHERITS_FROM_NOT_OBJECT,
4252 mixinName,
4203 [mixinElement.name]); 4253 [mixinElement.name]);
4204 return true; 4254 return true;
4205 } 4255 }
4206 } 4256 }
4207 return false; 4257 return false;
4208 } 4258 }
4209 4259
4210 /** 4260 /**
4211 * Verify that the given mixin does not reference 'super'. The [mixinName] is 4261 * Verify that the given mixin does not reference 'super'. The [mixinName] is
4212 * the node to report problem on. The [mixinElement] is the mixing to 4262 * the node to report problem on. The [mixinElement] is the mixing to
4213 * evaluate. 4263 * evaluate.
4214 * 4264 *
4215 * See [CompileTimeErrorCode.MIXIN_REFERENCES_SUPER]. 4265 * See [CompileTimeErrorCode.MIXIN_REFERENCES_SUPER].
4216 */ 4266 */
4217 bool _checkForMixinReferencesSuper( 4267 bool _checkForMixinReferencesSuper(
4218 TypeName mixinName, ClassElement mixinElement) { 4268 TypeName mixinName, ClassElement mixinElement) {
4219 if (!enableSuperMixins && mixinElement.hasReferenceToSuper) { 4269 if (!enableSuperMixins && mixinElement.hasReferenceToSuper) {
4220 _errorReporter.reportErrorForNode( 4270 _errorReporter.reportErrorForNode(
4221 CompileTimeErrorCode.MIXIN_REFERENCES_SUPER, mixinName, 4271 CompileTimeErrorCode.MIXIN_REFERENCES_SUPER,
4272 mixinName,
4222 [mixinElement.name]); 4273 [mixinElement.name]);
4223 } 4274 }
4224 return false; 4275 return false;
4225 } 4276 }
4226 4277
4227 /** 4278 /**
4228 * Verify that the given [constructor] has at most one 'super' initializer. 4279 * Verify that the given [constructor] has at most one 'super' initializer.
4229 * 4280 *
4230 * See [CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS]. 4281 * See [CompileTimeErrorCode.MULTIPLE_SUPER_INITIALIZERS].
4231 */ 4282 */
(...skipping 29 matching lines...) Expand all
4261 * Verify that the given instance creation [expression] invokes an existing 4312 * Verify that the given instance creation [expression] invokes an existing
4262 * constructor. The [constructorName] is the constructor name. The [typeName] 4313 * constructor. The [constructorName] is the constructor name. The [typeName]
4263 * is the name of the type defining the constructor. 4314 * is the name of the type defining the constructor.
4264 * 4315 *
4265 * This method assumes that the instance creation was tested to be 'new' 4316 * This method assumes that the instance creation was tested to be 'new'
4266 * before being called. 4317 * before being called.
4267 * 4318 *
4268 * See [StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR]. 4319 * See [StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR].
4269 */ 4320 */
4270 bool _checkForNewWithUndefinedConstructor( 4321 bool _checkForNewWithUndefinedConstructor(
4271 InstanceCreationExpression expression, ConstructorName constructorName, 4322 InstanceCreationExpression expression,
4323 ConstructorName constructorName,
4272 TypeName typeName) { 4324 TypeName typeName) {
4273 // OK if resolved 4325 // OK if resolved
4274 if (expression.staticElement != null) { 4326 if (expression.staticElement != null) {
4275 return false; 4327 return false;
4276 } 4328 }
4277 DartType type = typeName.type; 4329 DartType type = typeName.type;
4278 if (type is InterfaceType) { 4330 if (type is InterfaceType) {
4279 ClassElement element = type.element; 4331 ClassElement element = type.element;
4280 if (element != null && element.isEnum) { 4332 if (element != null && element.isEnum) {
4281 // We have already reported the error. 4333 // We have already reported the error.
4282 return false; 4334 return false;
4283 } 4335 }
4284 } 4336 }
4285 // prepare class name 4337 // prepare class name
4286 Identifier className = typeName.name; 4338 Identifier className = typeName.name;
4287 // report as named or default constructor absence 4339 // report as named or default constructor absence
4288 SimpleIdentifier name = constructorName.name; 4340 SimpleIdentifier name = constructorName.name;
4289 if (name != null) { 4341 if (name != null) {
4290 _errorReporter.reportErrorForNode( 4342 _errorReporter.reportErrorForNode(
4291 StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR, name, [ 4343 StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR,
4292 className, 4344 name,
4293 name 4345 [className, name]);
4294 ]);
4295 } else { 4346 } else {
4296 _errorReporter.reportErrorForNode( 4347 _errorReporter.reportErrorForNode(
4297 StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT, 4348 StaticWarningCode.NEW_WITH_UNDEFINED_CONSTRUCTOR_DEFAULT,
4298 constructorName, [className]); 4349 constructorName,
4350 [className]);
4299 } 4351 }
4300 return true; 4352 return true;
4301 } 4353 }
4302 4354
4303 /** 4355 /**
4304 * Check that if the given class [declaration] implicitly calls default 4356 * Check that if the given class [declaration] implicitly calls default
4305 * constructor of its superclass, there should be such default constructor - 4357 * constructor of its superclass, there should be such default constructor -
4306 * implicit or explicit. 4358 * implicit or explicit.
4307 * 4359 *
4308 * See [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT]. 4360 * See [CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT].
(...skipping 15 matching lines...) Expand all
4324 if (superType == null) { 4376 if (superType == null) {
4325 return false; 4377 return false;
4326 } 4378 }
4327 ClassElement superElement = superType.element; 4379 ClassElement superElement = superType.element;
4328 // try to find default generative super constructor 4380 // try to find default generative super constructor
4329 ConstructorElement superUnnamedConstructor = 4381 ConstructorElement superUnnamedConstructor =
4330 superElement.unnamedConstructor; 4382 superElement.unnamedConstructor;
4331 if (superUnnamedConstructor != null) { 4383 if (superUnnamedConstructor != null) {
4332 if (superUnnamedConstructor.isFactory) { 4384 if (superUnnamedConstructor.isFactory) {
4333 _errorReporter.reportErrorForNode( 4385 _errorReporter.reportErrorForNode(
4334 CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, declaration.name, 4386 CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR,
4387 declaration.name,
4335 [superUnnamedConstructor]); 4388 [superUnnamedConstructor]);
4336 return true; 4389 return true;
4337 } 4390 }
4338 if (superUnnamedConstructor.isDefaultConstructor && 4391 if (superUnnamedConstructor.isDefaultConstructor &&
4339 _enclosingClass 4392 _enclosingClass
4340 .isSuperConstructorAccessible(superUnnamedConstructor)) { 4393 .isSuperConstructorAccessible(superUnnamedConstructor)) {
4341 return true; 4394 return true;
4342 } 4395 }
4343 } 4396 }
4344 // report problem 4397 // report problem
4345 _errorReporter.reportErrorForNode( 4398 _errorReporter.reportErrorForNode(
4346 CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT, 4399 CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT,
4347 declaration.name, [superType.displayName]); 4400 declaration.name,
4401 [superType.displayName]);
4348 return true; 4402 return true;
4349 } 4403 }
4350 4404
4351 /** 4405 /**
4352 * Check that the given class declaration overrides all members required by 4406 * Check that the given class declaration overrides all members required by
4353 * its superclasses and interfaces. The [classNameNode] is the 4407 * its superclasses and interfaces. The [classNameNode] is the
4354 * [SimpleIdentifier] to be used if there is a violation, this is either the 4408 * [SimpleIdentifier] to be used if there is a violation, this is either the
4355 * named from the [ClassDeclaration] or from the [ClassTypeAlias]. 4409 * named from the [ClassDeclaration] or from the [ClassTypeAlias].
4356 * 4410 *
4357 * See [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE], 4411 * See [StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE],
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
4479 } else { 4533 } else {
4480 newStrMember = "$prefix'${missingOverridesArray[i].displayName}'"; 4534 newStrMember = "$prefix'${missingOverridesArray[i].displayName}'";
4481 } 4535 }
4482 stringMembersArrayListSet.add(newStrMember); 4536 stringMembersArrayListSet.add(newStrMember);
4483 } 4537 }
4484 List<String> stringMembersArray = new List.from(stringMembersArrayListSet); 4538 List<String> stringMembersArray = new List.from(stringMembersArrayListSet);
4485 AnalysisErrorWithProperties analysisError; 4539 AnalysisErrorWithProperties analysisError;
4486 if (stringMembersArray.length == 1) { 4540 if (stringMembersArray.length == 1) {
4487 analysisError = _errorReporter.newErrorWithProperties( 4541 analysisError = _errorReporter.newErrorWithProperties(
4488 StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE, 4542 StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_ONE,
4489 classNameNode, [stringMembersArray[0]]); 4543 classNameNode,
4544 [stringMembersArray[0]]);
4490 } else if (stringMembersArray.length == 2) { 4545 } else if (stringMembersArray.length == 2) {
4491 analysisError = _errorReporter.newErrorWithProperties( 4546 analysisError = _errorReporter.newErrorWithProperties(
4492 StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO, 4547 StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_TWO,
4493 classNameNode, [stringMembersArray[0], stringMembersArray[1]]); 4548 classNameNode,
4549 [stringMembersArray[0], stringMembersArray[1]]);
4494 } else if (stringMembersArray.length == 3) { 4550 } else if (stringMembersArray.length == 3) {
4495 analysisError = _errorReporter.newErrorWithProperties( 4551 analysisError = _errorReporter.newErrorWithProperties(
4496 StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE, 4552 StaticWarningCode.NON_ABSTRACT_CLASS_INHERITS_ABSTRACT_MEMBER_THREE,
4497 classNameNode, [ 4553 classNameNode, [
4498 stringMembersArray[0], 4554 stringMembersArray[0],
4499 stringMembersArray[1], 4555 stringMembersArray[1],
4500 stringMembersArray[2] 4556 stringMembersArray[2]
4501 ]); 4557 ]);
4502 } else if (stringMembersArray.length == 4) { 4558 } else if (stringMembersArray.length == 4) {
4503 analysisError = _errorReporter.newErrorWithProperties( 4559 analysisError = _errorReporter.newErrorWithProperties(
(...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after
4819 RedirectingConstructorInvocation invocation = initializer; 4875 RedirectingConstructorInvocation invocation = initializer;
4820 ConstructorElement redirectingElement = invocation.staticElement; 4876 ConstructorElement redirectingElement = invocation.staticElement;
4821 if (redirectingElement == null) { 4877 if (redirectingElement == null) {
4822 String enclosingTypeName = _enclosingClass.displayName; 4878 String enclosingTypeName = _enclosingClass.displayName;
4823 String constructorStrName = enclosingTypeName; 4879 String constructorStrName = enclosingTypeName;
4824 if (invocation.constructorName != null) { 4880 if (invocation.constructorName != null) {
4825 constructorStrName += ".${invocation.constructorName.name}"; 4881 constructorStrName += ".${invocation.constructorName.name}";
4826 } 4882 }
4827 _errorReporter.reportErrorForNode( 4883 _errorReporter.reportErrorForNode(
4828 CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR, 4884 CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR,
4829 invocation, [constructorStrName, enclosingTypeName]); 4885 invocation,
4886 [constructorStrName, enclosingTypeName]);
4830 } else { 4887 } else {
4831 if (redirectingElement.isFactory) { 4888 if (redirectingElement.isFactory) {
4832 _errorReporter.reportErrorForNode( 4889 _errorReporter.reportErrorForNode(
4833 CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CON STRUCTOR, 4890 CompileTimeErrorCode.REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CON STRUCTOR,
4834 initializer); 4891 initializer);
4835 } 4892 }
4836 } 4893 }
4837 } 4894 }
4838 numRedirections++; 4895 numRedirections++;
4839 } 4896 }
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
4967 staticReturnType, 5024 staticReturnType,
4968 expectedReturnType, 5025 expectedReturnType,
4969 _enclosingFunction.displayName 5026 _enclosingFunction.displayName
4970 ]); 5027 ]);
4971 return true; 5028 return true;
4972 } 5029 }
4973 if (staticReturnType.isAssignableTo(expectedReturnType)) { 5030 if (staticReturnType.isAssignableTo(expectedReturnType)) {
4974 return false; 5031 return false;
4975 } 5032 }
4976 _errorReporter.reportTypeErrorForNode( 5033 _errorReporter.reportTypeErrorForNode(
4977 StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [ 5034 StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
4978 staticReturnType, 5035 returnExpression,
4979 expectedReturnType, 5036 [staticReturnType, expectedReturnType, _enclosingFunction.displayName]);
4980 _enclosingFunction.displayName
4981 ]);
4982 return true; 5037 return true;
4983 // TODO(brianwilkerson) Define a hint corresponding to the warning and 5038 // TODO(brianwilkerson) Define a hint corresponding to the warning and
4984 // report it if appropriate. 5039 // report it if appropriate.
4985 // Type propagatedReturnType = returnExpression.getPropagatedType(); 5040 // Type propagatedReturnType = returnExpression.getPropagatedType();
4986 // boolean isPropagatedAssignable = propagatedReturnType.isAssignableTo(e xpectedReturnType); 5041 // boolean isPropagatedAssignable = propagatedReturnType.isAssignableTo(e xpectedReturnType);
4987 // if (isStaticAssignable || isPropagatedAssignable) { 5042 // if (isStaticAssignable || isPropagatedAssignable) {
4988 // return false; 5043 // return false;
4989 // } 5044 // }
4990 // errorReporter.reportTypeErrorForNode( 5045 // errorReporter.reportTypeErrorForNode(
4991 // StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, 5046 // StaticTypeWarningCode.RETURN_OF_INVALID_TYPE,
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
5046 SwitchCase switchCase = switchMember as SwitchCase; 5101 SwitchCase switchCase = switchMember as SwitchCase;
5047 // prepare 'case' type 5102 // prepare 'case' type
5048 Expression caseExpression = switchCase.expression; 5103 Expression caseExpression = switchCase.expression;
5049 DartType caseType = getStaticType(caseExpression); 5104 DartType caseType = getStaticType(caseExpression);
5050 // check types 5105 // check types
5051 if (expressionType.isAssignableTo(caseType)) { 5106 if (expressionType.isAssignableTo(caseType)) {
5052 return false; 5107 return false;
5053 } 5108 }
5054 // report problem 5109 // report problem
5055 _errorReporter.reportErrorForNode( 5110 _errorReporter.reportErrorForNode(
5056 StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE, expression, [ 5111 StaticWarningCode.SWITCH_EXPRESSION_NOT_ASSIGNABLE,
5057 expressionType, 5112 expression,
5058 caseType 5113 [expressionType, caseType]);
5059 ]);
5060 return true; 5114 return true;
5061 } 5115 }
5062 return false; 5116 return false;
5063 } 5117 }
5064 5118
5065 /** 5119 /**
5066 * Verify that the given function type [alias] does not reference itself 5120 * Verify that the given function type [alias] does not reference itself
5067 * directly. 5121 * directly.
5068 * 5122 *
5069 * See [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF]. 5123 * See [CompileTimeErrorCode.TYPE_ALIAS_CANNOT_REFERENCE_ITSELF].
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
5176 DartType bound = element.bound; 5230 DartType bound = element.bound;
5177 if (bound == null) { 5231 if (bound == null) {
5178 return false; 5232 return false;
5179 } 5233 }
5180 // OK, type parameter is not supertype of its bound 5234 // OK, type parameter is not supertype of its bound
5181 if (!bound.isMoreSpecificThan(element.type)) { 5235 if (!bound.isMoreSpecificThan(element.type)) {
5182 return false; 5236 return false;
5183 } 5237 }
5184 // report problem 5238 // report problem
5185 _errorReporter.reportErrorForNode( 5239 _errorReporter.reportErrorForNode(
5186 StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND, parameter, 5240 StaticTypeWarningCode.TYPE_PARAMETER_SUPERTYPE_OF_ITS_BOUND,
5241 parameter,
5187 [element.displayName]); 5242 [element.displayName]);
5188 return true; 5243 return true;
5189 } 5244 }
5190 5245
5191 /** 5246 /**
5192 * Check that if the given generative [constructor] has neither an explicit 5247 * Check that if the given generative [constructor] has neither an explicit
5193 * super constructor invocation nor a redirecting constructor invocation, that 5248 * super constructor invocation nor a redirecting constructor invocation, that
5194 * the superclass has a default generative constructor. 5249 * the superclass has a default generative constructor.
5195 * 5250 *
5196 * See [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT], 5251 * See [CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT],
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
5232 if (superType == null) { 5287 if (superType == null) {
5233 return false; 5288 return false;
5234 } 5289 }
5235 ClassElement superElement = superType.element; 5290 ClassElement superElement = superType.element;
5236 ConstructorElement superUnnamedConstructor = 5291 ConstructorElement superUnnamedConstructor =
5237 superElement.unnamedConstructor; 5292 superElement.unnamedConstructor;
5238 if (superUnnamedConstructor != null) { 5293 if (superUnnamedConstructor != null) {
5239 if (superUnnamedConstructor.isFactory) { 5294 if (superUnnamedConstructor.isFactory) {
5240 _errorReporter.reportErrorForNode( 5295 _errorReporter.reportErrorForNode(
5241 CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR, 5296 CompileTimeErrorCode.NON_GENERATIVE_CONSTRUCTOR,
5242 constructor.returnType, [superUnnamedConstructor]); 5297 constructor.returnType,
5298 [superUnnamedConstructor]);
5243 return true; 5299 return true;
5244 } 5300 }
5245 if (!superUnnamedConstructor.isDefaultConstructor || 5301 if (!superUnnamedConstructor.isDefaultConstructor ||
5246 !_enclosingClass 5302 !_enclosingClass
5247 .isSuperConstructorAccessible(superUnnamedConstructor)) { 5303 .isSuperConstructorAccessible(superUnnamedConstructor)) {
5248 int offset; 5304 int offset;
5249 int length; 5305 int length;
5250 { 5306 {
5251 Identifier returnType = constructor.returnType; 5307 Identifier returnType = constructor.returnType;
5252 SimpleIdentifier name = constructor.name; 5308 SimpleIdentifier name = constructor.name;
5253 offset = returnType.offset; 5309 offset = returnType.offset;
5254 length = (name != null ? name.end : returnType.end) - offset; 5310 length = (name != null ? name.end : returnType.end) - offset;
5255 } 5311 }
5256 _errorReporter.reportErrorForOffset( 5312 _errorReporter.reportErrorForOffset(
5257 CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT, offset, 5313 CompileTimeErrorCode.NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT,
5258 length, [superType.displayName]); 5314 offset,
5315 length,
5316 [superType.displayName]);
5259 } 5317 }
5260 return false; 5318 return false;
5261 } 5319 }
5262 _errorReporter.reportErrorForNode( 5320 _errorReporter.reportErrorForNode(
5263 CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT, 5321 CompileTimeErrorCode.UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT,
5264 constructor.returnType, [superElement.name]); 5322 constructor.returnType,
5323 [superElement.name]);
5265 return true; 5324 return true;
5266 } 5325 }
5267 5326
5268 /** 5327 /**
5269 * Check that if the given [name] is a reference to a static member it is 5328 * Check that if the given [name] is a reference to a static member it is
5270 * defined in the enclosing class rather than in a superclass. 5329 * defined in the enclosing class rather than in a superclass.
5271 * 5330 *
5272 * See [StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER ]. 5331 * See [StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER ].
5273 */ 5332 */
5274 bool _checkForUnqualifiedReferenceToNonLocalStaticMember( 5333 bool _checkForUnqualifiedReferenceToNonLocalStaticMember(
5275 SimpleIdentifier name) { 5334 SimpleIdentifier name) {
5276 Element element = name.staticElement; 5335 Element element = name.staticElement;
5277 if (element == null || element is TypeParameterElement) { 5336 if (element == null || element is TypeParameterElement) {
5278 return false; 5337 return false;
5279 } 5338 }
5280 Element enclosingElement = element.enclosingElement; 5339 Element enclosingElement = element.enclosingElement;
5281 if (enclosingElement is! ClassElement) { 5340 if (enclosingElement is! ClassElement) {
5282 return false; 5341 return false;
5283 } 5342 }
5284 if ((element is MethodElement && !element.isStatic) || 5343 if ((element is MethodElement && !element.isStatic) ||
5285 (element is PropertyAccessorElement && !element.isStatic)) { 5344 (element is PropertyAccessorElement && !element.isStatic)) {
5286 return false; 5345 return false;
5287 } 5346 }
5288 if (identical(enclosingElement, _enclosingClass)) { 5347 if (identical(enclosingElement, _enclosingClass)) {
5289 return false; 5348 return false;
5290 } 5349 }
5291 _errorReporter.reportErrorForNode( 5350 _errorReporter.reportErrorForNode(
5292 StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER, 5351 StaticTypeWarningCode.UNQUALIFIED_REFERENCE_TO_NON_LOCAL_STATIC_MEMBER,
5293 name, [name.name]); 5352 name,
5353 [name.name]);
5294 return true; 5354 return true;
5295 } 5355 }
5296 5356
5297 void _checkForValidField(FieldFormalParameter parameter) { 5357 void _checkForValidField(FieldFormalParameter parameter) {
5298 ParameterElement element = parameter.element; 5358 ParameterElement element = parameter.element;
5299 if (element is FieldFormalParameterElement) { 5359 if (element is FieldFormalParameterElement) {
5300 FieldElement fieldElement = element.field; 5360 FieldElement fieldElement = element.field;
5301 if (fieldElement == null || fieldElement.isSynthetic) { 5361 if (fieldElement == null || fieldElement.isSynthetic) {
5302 _errorReporter.reportErrorForNode( 5362 _errorReporter.reportErrorForNode(
5303 CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD, 5363 CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD,
5304 parameter, [parameter.identifier.name]); 5364 parameter,
5365 [parameter.identifier.name]);
5305 } else { 5366 } else {
5306 ParameterElement parameterElement = parameter.element; 5367 ParameterElement parameterElement = parameter.element;
5307 if (parameterElement is FieldFormalParameterElementImpl) { 5368 if (parameterElement is FieldFormalParameterElementImpl) {
5308 FieldFormalParameterElementImpl fieldFormal = parameterElement; 5369 FieldFormalParameterElementImpl fieldFormal = parameterElement;
5309 DartType declaredType = fieldFormal.type; 5370 DartType declaredType = fieldFormal.type;
5310 DartType fieldType = fieldElement.type; 5371 DartType fieldType = fieldElement.type;
5311 if (fieldElement.isSynthetic) { 5372 if (fieldElement.isSynthetic) {
5312 _errorReporter.reportErrorForNode( 5373 _errorReporter.reportErrorForNode(
5313 CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD, 5374 CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD,
5314 parameter, [parameter.identifier.name]); 5375 parameter,
5376 [parameter.identifier.name]);
5315 } else if (fieldElement.isStatic) { 5377 } else if (fieldElement.isStatic) {
5316 _errorReporter.reportErrorForNode( 5378 _errorReporter.reportErrorForNode(
5317 CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, 5379 CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD,
5318 parameter, [parameter.identifier.name]); 5380 parameter,
5381 [parameter.identifier.name]);
5319 } else if (declaredType != null && 5382 } else if (declaredType != null &&
5320 fieldType != null && 5383 fieldType != null &&
5321 !declaredType.isAssignableTo(fieldType)) { 5384 !declaredType.isAssignableTo(fieldType)) {
5322 _errorReporter.reportTypeErrorForNode( 5385 _errorReporter.reportTypeErrorForNode(
5323 StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, 5386 StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE,
5324 parameter, [declaredType, fieldType]); 5387 parameter,
5388 [declaredType, fieldType]);
5325 } 5389 }
5326 } else { 5390 } else {
5327 if (fieldElement.isSynthetic) { 5391 if (fieldElement.isSynthetic) {
5328 _errorReporter.reportErrorForNode( 5392 _errorReporter.reportErrorForNode(
5329 CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD, 5393 CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_NON_EXISTENT_FIELD,
5330 parameter, [parameter.identifier.name]); 5394 parameter,
5395 [parameter.identifier.name]);
5331 } else if (fieldElement.isStatic) { 5396 } else if (fieldElement.isStatic) {
5332 _errorReporter.reportErrorForNode( 5397 _errorReporter.reportErrorForNode(
5333 CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, 5398 CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD,
5334 parameter, [parameter.identifier.name]); 5399 parameter,
5400 [parameter.identifier.name]);
5335 } 5401 }
5336 } 5402 }
5337 } 5403 }
5338 } 5404 }
5339 // else { 5405 // else {
5340 // // TODO(jwren) Report error, constructor initializer variable is a top level element 5406 // // TODO(jwren) Report error, constructor initializer variable is a top level element
5341 // // (Either here or in ErrorVerifier.checkForAllFinalInitializedErrorCo des) 5407 // // (Either here or in ErrorVerifier.checkForAllFinalInitializedErrorCo des)
5342 // } 5408 // }
5343 } 5409 }
5344 5410
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
5400 "<<" == name || 5466 "<<" == name ||
5401 ">>" == name || 5467 ">>" == name ||
5402 "[]" == name) { 5468 "[]" == name) {
5403 expected = 1; 5469 expected = 1;
5404 } else if ("~" == name) { 5470 } else if ("~" == name) {
5405 expected = 0; 5471 expected = 0;
5406 } 5472 }
5407 if (expected != -1 && numParameters != expected) { 5473 if (expected != -1 && numParameters != expected) {
5408 _errorReporter.reportErrorForNode( 5474 _errorReporter.reportErrorForNode(
5409 CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR, 5475 CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR,
5410 nameNode, [name, expected, numParameters]); 5476 nameNode,
5477 [name, expected, numParameters]);
5411 return true; 5478 return true;
5412 } 5479 }
5413 // check for operator "-" 5480 // check for operator "-"
5414 if ("-" == name && numParameters > 1) { 5481 if ("-" == name && numParameters > 1) {
5415 _errorReporter.reportErrorForNode( 5482 _errorReporter.reportErrorForNode(
5416 CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS, 5483 CompileTimeErrorCode.WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS,
5417 nameNode, [numParameters]); 5484 nameNode,
5485 [numParameters]);
5418 return true; 5486 return true;
5419 } 5487 }
5420 // OK 5488 // OK
5421 return false; 5489 return false;
5422 } 5490 }
5423 5491
5424 /** 5492 /**
5425 * Verify that the given setter [parameterList] has only one required 5493 * Verify that the given setter [parameterList] has only one required
5426 * parameter. The [setterName] is the name of the setter to report problems 5494 * parameter. The [setterName] is the name of the setter to report problems
5427 * on. 5495 * on.
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
5469 impliedReturnType = staticYieldedType; 5537 impliedReturnType = staticYieldedType;
5470 } else if (_enclosingFunction.isAsynchronous) { 5538 } else if (_enclosingFunction.isAsynchronous) {
5471 impliedReturnType = 5539 impliedReturnType =
5472 _typeProvider.streamType.substitute4(<DartType>[staticYieldedType]); 5540 _typeProvider.streamType.substitute4(<DartType>[staticYieldedType]);
5473 } else { 5541 } else {
5474 impliedReturnType = 5542 impliedReturnType =
5475 _typeProvider.iterableType.substitute4(<DartType>[staticYieldedType]); 5543 _typeProvider.iterableType.substitute4(<DartType>[staticYieldedType]);
5476 } 5544 }
5477 if (!impliedReturnType.isAssignableTo(declaredReturnType)) { 5545 if (!impliedReturnType.isAssignableTo(declaredReturnType)) {
5478 _errorReporter.reportTypeErrorForNode( 5546 _errorReporter.reportTypeErrorForNode(
5479 StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, yieldExpression, [ 5547 StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
5480 impliedReturnType, 5548 yieldExpression,
5481 declaredReturnType 5549 [impliedReturnType, declaredReturnType]);
5482 ]);
5483 return true; 5550 return true;
5484 } 5551 }
5485 if (isYieldEach) { 5552 if (isYieldEach) {
5486 // Since the declared return type might have been "dynamic", we need to 5553 // Since the declared return type might have been "dynamic", we need to
5487 // also check that the implied return type is assignable to generic 5554 // also check that the implied return type is assignable to generic
5488 // Stream/Iterable. 5555 // Stream/Iterable.
5489 DartType requiredReturnType; 5556 DartType requiredReturnType;
5490 if (_enclosingFunction.isAsynchronous) { 5557 if (_enclosingFunction.isAsynchronous) {
5491 requiredReturnType = _typeProvider.streamDynamicType; 5558 requiredReturnType = _typeProvider.streamDynamicType;
5492 } else { 5559 } else {
5493 requiredReturnType = _typeProvider.iterableDynamicType; 5560 requiredReturnType = _typeProvider.iterableDynamicType;
5494 } 5561 }
5495 if (!impliedReturnType.isAssignableTo(requiredReturnType)) { 5562 if (!impliedReturnType.isAssignableTo(requiredReturnType)) {
5496 _errorReporter.reportTypeErrorForNode( 5563 _errorReporter.reportTypeErrorForNode(
5497 StaticTypeWarningCode.YIELD_OF_INVALID_TYPE, yieldExpression, [ 5564 StaticTypeWarningCode.YIELD_OF_INVALID_TYPE,
5498 impliedReturnType, 5565 yieldExpression,
5499 requiredReturnType 5566 [impliedReturnType, requiredReturnType]);
5500 ]);
5501 return true; 5567 return true;
5502 } 5568 }
5503 } 5569 }
5504 return false; 5570 return false;
5505 } 5571 }
5506 5572
5507 /** 5573 /**
5508 * Verify that if the given class [declaration] implements the class Function 5574 * Verify that if the given class [declaration] implements the class Function
5509 * that it has a concrete implementation of the call method. 5575 * that it has a concrete implementation of the call method.
5510 * 5576 *
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
5555 ImplementsClause implementsClause = declaration.implementsClause; 5621 ImplementsClause implementsClause = declaration.implementsClause;
5556 if (implementsClause == null) { 5622 if (implementsClause == null) {
5557 return false; 5623 return false;
5558 } 5624 }
5559 // check interfaces 5625 // check interfaces
5560 bool hasProblem = false; 5626 bool hasProblem = false;
5561 for (TypeName interfaceNode in implementsClause.interfaces) { 5627 for (TypeName interfaceNode in implementsClause.interfaces) {
5562 if (interfaceNode.type == superType) { 5628 if (interfaceNode.type == superType) {
5563 hasProblem = true; 5629 hasProblem = true;
5564 _errorReporter.reportErrorForNode( 5630 _errorReporter.reportErrorForNode(
5565 CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS, interfaceNode, 5631 CompileTimeErrorCode.IMPLEMENTS_SUPER_CLASS,
5632 interfaceNode,
5566 [superType.displayName]); 5633 [superType.displayName]);
5567 } 5634 }
5568 } 5635 }
5569 // done 5636 // done
5570 return hasProblem; 5637 return hasProblem;
5571 } 5638 }
5572 5639
5573 DartType _computeReturnTypeForMethod(Expression returnExpression) { 5640 DartType _computeReturnTypeForMethod(Expression returnExpression) {
5574 // This method should never be called for generators, since generators are 5641 // This method should never be called for generators, since generators are
5575 // never allowed to contain return statements with expressions. 5642 // never allowed to contain return statements with expressions.
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after
5876 // "A, B, C, D, A" 5943 // "A, B, C, D, A"
5877 String separator = ", "; 5944 String separator = ", ";
5878 StringBuffer buffer = new StringBuffer(); 5945 StringBuffer buffer = new StringBuffer();
5879 for (int i = 0; i < size; i++) { 5946 for (int i = 0; i < size; i++) {
5880 buffer.write(path[i].displayName); 5947 buffer.write(path[i].displayName);
5881 buffer.write(separator); 5948 buffer.write(separator);
5882 } 5949 }
5883 buffer.write(element.displayName); 5950 buffer.write(element.displayName);
5884 _errorReporter.reportErrorForOffset( 5951 _errorReporter.reportErrorForOffset(
5885 CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE, 5952 CompileTimeErrorCode.RECURSIVE_INTERFACE_INHERITANCE,
5886 _enclosingClass.nameOffset, enclosingClassName.length, [ 5953 _enclosingClass.nameOffset,
5887 enclosingClassName, 5954 enclosingClassName.length,
5888 buffer.toString() 5955 [enclosingClassName, buffer.toString()]);
5889 ]);
5890 return true; 5956 return true;
5891 } else { 5957 } else {
5892 // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS or 5958 // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS or
5893 // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS or 5959 // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS or
5894 // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH 5960 // RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH
5895 _errorReporter.reportErrorForOffset(_getBaseCaseErrorCode(element), 5961 _errorReporter.reportErrorForOffset(
5896 _enclosingClass.nameOffset, enclosingClassName.length, 5962 _getBaseCaseErrorCode(element),
5963 _enclosingClass.nameOffset,
5964 enclosingClassName.length,
5897 [enclosingClassName]); 5965 [enclosingClassName]);
5898 return true; 5966 return true;
5899 } 5967 }
5900 } 5968 }
5901 if (path.indexOf(element) > 0) { 5969 if (path.indexOf(element) > 0) {
5902 return false; 5970 return false;
5903 } 5971 }
5904 path.add(element); 5972 path.add(element);
5905 // n-case 5973 // n-case
5906 InterfaceType supertype = element.supertype; 5974 InterfaceType supertype = element.supertype;
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after
5992 toCheck.add(type.element); 6060 toCheck.add(type.element);
5993 // type arguments 6061 // type arguments
5994 if (type is InterfaceType) { 6062 if (type is InterfaceType) {
5995 InterfaceType interfaceType = type; 6063 InterfaceType interfaceType = type;
5996 for (DartType typeArgument in interfaceType.typeArguments) { 6064 for (DartType typeArgument in interfaceType.typeArguments) {
5997 _addTypeToCheck(typeArgument); 6065 _addTypeToCheck(typeArgument);
5998 } 6066 }
5999 } 6067 }
6000 } 6068 }
6001 } 6069 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/generated/element_resolver.dart ('k') | pkg/analyzer/lib/src/generated/html.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698