Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 analyzer.src.generated.error_verifier; | 5 library analyzer.src.generated.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/dart/ast/ast.dart'; | 10 import 'package:analyzer/dart/ast/ast.dart'; |
| (...skipping 479 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 490 */ | 490 */ |
| 491 void visitClassDeclarationIncrementally(ClassDeclaration node) { | 491 void visitClassDeclarationIncrementally(ClassDeclaration node) { |
| 492 _isInNativeClass = node.nativeClause != null; | 492 _isInNativeClass = node.nativeClause != null; |
| 493 _enclosingClass = AbstractClassElementImpl.getImpl(node.element); | 493 _enclosingClass = AbstractClassElementImpl.getImpl(node.element); |
| 494 // initialize initialFieldElementsMap | 494 // initialize initialFieldElementsMap |
| 495 if (_enclosingClass != null) { | 495 if (_enclosingClass != null) { |
| 496 List<FieldElement> fieldElements = _enclosingClass.fields; | 496 List<FieldElement> fieldElements = _enclosingClass.fields; |
| 497 _initialFieldElementsMap = new HashMap<FieldElement, INIT_STATE>(); | 497 _initialFieldElementsMap = new HashMap<FieldElement, INIT_STATE>(); |
| 498 for (FieldElement fieldElement in fieldElements) { | 498 for (FieldElement fieldElement in fieldElements) { |
| 499 if (!fieldElement.isSynthetic) { | 499 if (!fieldElement.isSynthetic) { |
| 500 _initialFieldElementsMap[fieldElement] = fieldElement.initializer == | 500 _initialFieldElementsMap[fieldElement] = |
| 501 null ? INIT_STATE.NOT_INIT : INIT_STATE.INIT_IN_DECLARATION; | 501 fieldElement.initializer == null |
| 502 ? INIT_STATE.NOT_INIT | |
| 503 : INIT_STATE.INIT_IN_DECLARATION; | |
| 502 } | 504 } |
| 503 } | 505 } |
| 504 } | 506 } |
| 505 } | 507 } |
| 506 | 508 |
| 507 @override | 509 @override |
| 508 Object visitClassTypeAlias(ClassTypeAlias node) { | 510 Object visitClassTypeAlias(ClassTypeAlias node) { |
| 509 _checkForBuiltInIdentifierAsName( | 511 _checkForBuiltInIdentifierAsName( |
| 510 node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME); | 512 node.name, CompileTimeErrorCode.BUILT_IN_IDENTIFIER_AS_TYPEDEF_NAME); |
| 511 ClassElementImpl outerClassElement = _enclosingClass; | 513 ClassElementImpl outerClassElement = _enclosingClass; |
| (...skipping 786 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1298 // Visit all of the field formal parameters | 1300 // Visit all of the field formal parameters |
| 1299 NodeList<FormalParameter> formalParameters = | 1301 NodeList<FormalParameter> formalParameters = |
| 1300 constructor.parameters.parameters; | 1302 constructor.parameters.parameters; |
| 1301 for (FormalParameter formalParameter in formalParameters) { | 1303 for (FormalParameter formalParameter in formalParameters) { |
| 1302 FormalParameter baseParameter(FormalParameter parameter) { | 1304 FormalParameter baseParameter(FormalParameter parameter) { |
| 1303 if (parameter is DefaultFormalParameter) { | 1305 if (parameter is DefaultFormalParameter) { |
| 1304 return parameter.parameter; | 1306 return parameter.parameter; |
| 1305 } | 1307 } |
| 1306 return parameter; | 1308 return parameter; |
| 1307 } | 1309 } |
| 1310 | |
| 1308 FormalParameter parameter = baseParameter(formalParameter); | 1311 FormalParameter parameter = baseParameter(formalParameter); |
| 1309 if (parameter is FieldFormalParameter) { | 1312 if (parameter is FieldFormalParameter) { |
| 1310 FieldElement fieldElement = | 1313 FieldElement fieldElement = |
| 1311 (parameter.element as FieldFormalParameterElementImpl).field; | 1314 (parameter.element as FieldFormalParameterElementImpl).field; |
| 1312 INIT_STATE state = fieldElementsMap[fieldElement]; | 1315 INIT_STATE state = fieldElementsMap[fieldElement]; |
| 1313 if (state == INIT_STATE.NOT_INIT) { | 1316 if (state == INIT_STATE.NOT_INIT) { |
| 1314 fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_FIELD_FORMAL; | 1317 fieldElementsMap[fieldElement] = INIT_STATE.INIT_IN_FIELD_FORMAL; |
| 1315 } else if (state == INIT_STATE.INIT_IN_DECLARATION) { | 1318 } else if (state == INIT_STATE.INIT_IN_DECLARATION) { |
| 1316 if (fieldElement.isFinal || fieldElement.isConst) { | 1319 if (fieldElement.isFinal || fieldElement.isConst) { |
| 1317 _errorReporter.reportErrorForNode( | 1320 _errorReporter.reportErrorForNode( |
| (...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1406 constructor.returnType, | 1409 constructor.returnType, |
| 1407 [names[0], names[1], names.length - 2]); | 1410 [names[0], names[1], names.length - 2]); |
| 1408 } | 1411 } |
| 1409 analysisError.setProperty( | 1412 analysisError.setProperty( |
| 1410 ErrorProperty.NOT_INITIALIZED_FIELDS, notInitFinalFields); | 1413 ErrorProperty.NOT_INITIALIZED_FIELDS, notInitFinalFields); |
| 1411 _errorReporter.reportError(analysisError); | 1414 _errorReporter.reportError(analysisError); |
| 1412 } | 1415 } |
| 1413 } | 1416 } |
| 1414 | 1417 |
| 1415 /** | 1418 /** |
| 1416 * Check the given [executableElement] against override-error codes. The | 1419 * Check the given [derivedElement] against override-error codes. The |
| 1417 * [overriddenExecutable] is the element that the executable element is | 1420 * [baseElement] is the element that the executable element is |
| 1418 * overriding. The [parameters] is the parameters of the executable element. | 1421 * overriding. The [parameters] is the parameters of the executable element. |
| 1419 * The [errorNameTarget] is the node to report problems on. | 1422 * The [errorNameTarget] is the node to report problems on. |
| 1420 * | 1423 * |
| 1421 * See [StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC ], | 1424 * See [StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC ], |
| 1422 * [CompileTimeErrorCode.INVALID_OVERRIDE_REQUIRED], | 1425 * [CompileTimeErrorCode.INVALID_OVERRIDE_REQUIRED], |
| 1423 * [CompileTimeErrorCode.INVALID_OVERRIDE_POSITIONAL], | 1426 * [CompileTimeErrorCode.INVALID_OVERRIDE_POSITIONAL], |
| 1424 * [CompileTimeErrorCode.INVALID_OVERRIDE_NAMED], | 1427 * [CompileTimeErrorCode.INVALID_OVERRIDE_NAMED], |
| 1425 * [StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE], | 1428 * [StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE], |
| 1426 * [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE], | 1429 * [StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE], |
| 1427 * [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE], | 1430 * [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE], |
| 1428 * [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE], | 1431 * [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE], |
| 1429 * [StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE], | 1432 * [StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE], |
| 1430 * [StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE], and | 1433 * [StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE], and |
| 1431 * [StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES]. | 1434 * [StaticWarningCode.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES]. |
| 1432 */ | 1435 */ |
| 1433 bool _checkForAllInvalidOverrideErrorCodes( | 1436 bool _checkForAllInvalidOverrideErrorCodes( |
| 1434 ExecutableElement executableElement, | 1437 ExecutableElement derivedElement, |
| 1435 ExecutableElement overriddenExecutable, | 1438 ExecutableElement baseElement, |
| 1436 List<ParameterElement> parameters, | 1439 List<ParameterElement> parameters, |
| 1437 List<AstNode> parameterLocations, | 1440 List<AstNode> parameterLocations, |
| 1438 SimpleIdentifier errorNameTarget) { | 1441 SimpleIdentifier errorNameTarget) { |
| 1439 bool isGetter = false; | 1442 bool isGetter = false; |
| 1440 bool isSetter = false; | 1443 bool isSetter = false; |
| 1441 if (executableElement is PropertyAccessorElement) { | 1444 if (derivedElement is PropertyAccessorElement) { |
| 1442 isGetter = executableElement.isGetter; | 1445 isGetter = derivedElement.isGetter; |
| 1443 isSetter = executableElement.isSetter; | 1446 isSetter = derivedElement.isSetter; |
| 1444 } | 1447 } |
| 1445 String executableElementName = executableElement.name; | 1448 String executableElementName = derivedElement.name; |
| 1446 FunctionType overridingFT = executableElement.type; | 1449 FunctionType derivedFT = derivedElement.type; |
|
Jennifer Messerly
2016/08/10 23:50:48
I renamed all of these to make it much easier to e
| |
| 1447 FunctionType overriddenFT = overriddenExecutable.type; | 1450 FunctionType baseFT = baseElement.type; |
| 1448 InterfaceType enclosingType = _enclosingClass.type; | 1451 InterfaceType enclosingType = _enclosingClass.type; |
| 1449 overriddenFT = | 1452 baseFT = _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance( |
| 1450 _inheritanceManager.substituteTypeArgumentsInMemberFromInheritance( | 1453 baseFT, executableElementName, enclosingType); |
| 1451 overriddenFT, executableElementName, enclosingType); | 1454 if (derivedFT == null || baseFT == null) { |
| 1452 if (overridingFT == null || overriddenFT == null) { | |
| 1453 return false; | 1455 return false; |
| 1454 } | 1456 } |
| 1455 | 1457 |
| 1456 // Handle generic function type parameters. | 1458 // Handle generic function type parameters. |
| 1457 // TODO(jmesserly): this duplicates some code in isSubtypeOf and most of | 1459 // TODO(jmesserly): this duplicates some code in isSubtypeOf and most of |
| 1458 // _isGenericFunctionSubtypeOf. Ideally, we'd let TypeSystem produce | 1460 // _isGenericFunctionSubtypeOf. Ideally, we'd let TypeSystem produce |
| 1459 // an error message once it's ready to "return false". | 1461 // an error message once it's ready to "return false". |
| 1460 if (!overridingFT.typeFormals.isEmpty) { | 1462 if (!derivedFT.typeFormals.isEmpty) { |
| 1461 if (overriddenFT.typeFormals.isEmpty) { | 1463 if (baseFT.typeFormals.isEmpty) { |
| 1462 overridingFT = _typeSystem.instantiateToBounds(overridingFT); | 1464 derivedFT = _typeSystem.instantiateToBounds(derivedFT); |
| 1463 } else { | 1465 } else { |
| 1464 List<TypeParameterElement> params1 = overridingFT.typeFormals; | 1466 List<TypeParameterElement> params1 = derivedFT.typeFormals; |
| 1465 List<TypeParameterElement> params2 = overriddenFT.typeFormals; | 1467 List<TypeParameterElement> params2 = baseFT.typeFormals; |
| 1466 int count = params1.length; | 1468 int count = params1.length; |
| 1467 if (params2.length != count) { | 1469 if (params2.length != count) { |
| 1468 _errorReporter.reportErrorForNode( | 1470 _errorReporter.reportErrorForNode( |
| 1469 StaticWarningCode.INVALID_METHOD_OVERRIDE_TYPE_PARAMETERS, | 1471 StaticWarningCode.INVALID_METHOD_OVERRIDE_TYPE_PARAMETERS, |
| 1470 errorNameTarget, [ | 1472 errorNameTarget, [ |
| 1471 count, | 1473 count, |
| 1472 params2.length, | 1474 params2.length, |
| 1473 overriddenExecutable.enclosingElement.displayName | 1475 baseElement.enclosingElement.displayName |
| 1474 ]); | 1476 ]); |
| 1475 return true; | 1477 return true; |
| 1476 } | 1478 } |
| 1477 // We build up a substitution matching up the type parameters | 1479 // We build up a substitution matching up the type parameters |
| 1478 // from the two types, {variablesFresh/variables1} and | 1480 // from the two types, {variablesFresh/variables1} and |
| 1479 // {variablesFresh/variables2} | 1481 // {variablesFresh/variables2} |
| 1480 List<DartType> variables1 = new List<DartType>(); | 1482 List<DartType> variables1 = new List<DartType>(); |
| 1481 List<DartType> variables2 = new List<DartType>(); | 1483 List<DartType> variables2 = new List<DartType>(); |
| 1482 List<DartType> variablesFresh = new List<DartType>(); | 1484 List<DartType> variablesFresh = new List<DartType>(); |
| 1483 for (int i = 0; i < count; i++) { | 1485 for (int i = 0; i < count; i++) { |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 1499 bound2 = bound2.substitute2(variablesFresh, variables2); | 1501 bound2 = bound2.substitute2(variablesFresh, variables2); |
| 1500 pFresh.bound = bound2; | 1502 pFresh.bound = bound2; |
| 1501 if (!_typeSystem.isSubtypeOf(bound2, bound1)) { | 1503 if (!_typeSystem.isSubtypeOf(bound2, bound1)) { |
| 1502 _errorReporter.reportErrorForNode( | 1504 _errorReporter.reportErrorForNode( |
| 1503 StaticWarningCode.INVALID_METHOD_OVERRIDE_TYPE_PARAMETER_BOUND, | 1505 StaticWarningCode.INVALID_METHOD_OVERRIDE_TYPE_PARAMETER_BOUND, |
| 1504 errorNameTarget, [ | 1506 errorNameTarget, [ |
| 1505 p1.displayName, | 1507 p1.displayName, |
| 1506 p1.bound, | 1508 p1.bound, |
| 1507 p2.displayName, | 1509 p2.displayName, |
| 1508 p2.bound, | 1510 p2.bound, |
| 1509 overriddenExecutable.enclosingElement.displayName | 1511 baseElement.enclosingElement.displayName |
| 1510 ]); | 1512 ]); |
| 1511 return true; | 1513 return true; |
| 1512 } | 1514 } |
| 1513 } | 1515 } |
| 1514 // Proceed with the rest of the checks, using instantiated types. | 1516 // Proceed with the rest of the checks, using instantiated types. |
| 1515 overridingFT = overridingFT.instantiate(variablesFresh); | 1517 derivedFT = derivedFT.instantiate(variablesFresh); |
| 1516 overriddenFT = overriddenFT.instantiate(variablesFresh); | 1518 baseFT = baseFT.instantiate(variablesFresh); |
| 1517 } | 1519 } |
| 1518 } | 1520 } |
| 1519 | 1521 |
| 1520 DartType overridingFTReturnType = overridingFT.returnType; | 1522 DartType derivedFTReturnType = derivedFT.returnType; |
| 1521 DartType overriddenFTReturnType = overriddenFT.returnType; | 1523 DartType baseFTReturnType = baseFT.returnType; |
| 1522 List<DartType> overridingNormalPT = overridingFT.normalParameterTypes; | 1524 List<DartType> derivedNormalPT = derivedFT.normalParameterTypes; |
| 1523 List<DartType> overriddenNormalPT = overriddenFT.normalParameterTypes; | 1525 List<DartType> baseNormalPT = baseFT.normalParameterTypes; |
| 1524 List<DartType> overridingPositionalPT = overridingFT.optionalParameterTypes; | 1526 List<DartType> derivedPositionalPT = derivedFT.optionalParameterTypes; |
| 1525 List<DartType> overriddenPositionalPT = overriddenFT.optionalParameterTypes; | 1527 List<DartType> basePositionalPT = baseFT.optionalParameterTypes; |
| 1526 Map<String, DartType> overridingNamedPT = overridingFT.namedParameterTypes; | 1528 Map<String, DartType> derivedNamedPT = derivedFT.namedParameterTypes; |
| 1527 Map<String, DartType> overriddenNamedPT = overriddenFT.namedParameterTypes; | 1529 Map<String, DartType> baseNamedPT = baseFT.namedParameterTypes; |
| 1528 // CTEC.INVALID_OVERRIDE_REQUIRED, CTEC.INVALID_OVERRIDE_POSITIONAL and | 1530 // CTEC.INVALID_OVERRIDE_REQUIRED, CTEC.INVALID_OVERRIDE_POSITIONAL and |
| 1529 // CTEC.INVALID_OVERRIDE_NAMED | 1531 // CTEC.INVALID_OVERRIDE_NAMED |
| 1530 if (overridingNormalPT.length > overriddenNormalPT.length) { | 1532 if (derivedNormalPT.length > baseNormalPT.length) { |
| 1531 _errorReporter.reportErrorForNode( | 1533 _errorReporter.reportErrorForNode( |
| 1532 StaticWarningCode.INVALID_OVERRIDE_REQUIRED, errorNameTarget, [ | 1534 StaticWarningCode.INVALID_OVERRIDE_REQUIRED, errorNameTarget, [ |
| 1533 overriddenNormalPT.length, | 1535 baseNormalPT.length, |
| 1534 overriddenExecutable, | 1536 baseElement, |
| 1535 overriddenExecutable.enclosingElement.displayName | 1537 baseElement.enclosingElement.displayName |
| 1536 ]); | 1538 ]); |
| 1537 return true; | 1539 return true; |
| 1538 } | 1540 } |
| 1539 if (overridingNormalPT.length + overridingPositionalPT.length < | 1541 if (derivedNormalPT.length + derivedPositionalPT.length < |
| 1540 overriddenPositionalPT.length + overriddenNormalPT.length) { | 1542 basePositionalPT.length + baseNormalPT.length) { |
| 1541 _errorReporter.reportErrorForNode( | 1543 _errorReporter.reportErrorForNode( |
| 1542 StaticWarningCode.INVALID_OVERRIDE_POSITIONAL, errorNameTarget, [ | 1544 StaticWarningCode.INVALID_OVERRIDE_POSITIONAL, errorNameTarget, [ |
| 1543 overriddenPositionalPT.length + overriddenNormalPT.length, | 1545 basePositionalPT.length + baseNormalPT.length, |
| 1544 overriddenExecutable, | 1546 baseElement, |
| 1545 overriddenExecutable.enclosingElement.displayName | 1547 baseElement.enclosingElement.displayName |
| 1546 ]); | 1548 ]); |
| 1547 return true; | 1549 return true; |
| 1548 } | 1550 } |
| 1549 // For each named parameter in the overridden method, verify that there is | 1551 // For each named parameter in the overridden method, verify that there is |
| 1550 // the same name in the overriding method. | 1552 // the same name in the overriding method. |
| 1551 for (String overriddenParamName in overriddenNamedPT.keys) { | 1553 for (String overriddenParamName in baseNamedPT.keys) { |
| 1552 if (!overridingNamedPT.containsKey(overriddenParamName)) { | 1554 if (!derivedNamedPT.containsKey(overriddenParamName)) { |
| 1553 // The overridden method expected the overriding method to have | 1555 // The overridden method expected the overriding method to have |
| 1554 // overridingParamName, but it does not. | 1556 // overridingParamName, but it does not. |
| 1555 _errorReporter.reportErrorForNode( | 1557 _errorReporter.reportErrorForNode( |
| 1556 StaticWarningCode.INVALID_OVERRIDE_NAMED, errorNameTarget, [ | 1558 StaticWarningCode.INVALID_OVERRIDE_NAMED, errorNameTarget, [ |
| 1557 overriddenParamName, | 1559 overriddenParamName, |
| 1558 overriddenExecutable, | 1560 baseElement, |
| 1559 overriddenExecutable.enclosingElement.displayName | 1561 baseElement.enclosingElement.displayName |
| 1560 ]); | 1562 ]); |
| 1561 return true; | 1563 return true; |
| 1562 } | 1564 } |
| 1563 } | 1565 } |
| 1564 // SWC.INVALID_METHOD_OVERRIDE_RETURN_TYPE | 1566 // SWC.INVALID_METHOD_OVERRIDE_RETURN_TYPE |
| 1565 if (overriddenFTReturnType != VoidTypeImpl.instance && | 1567 if (baseFTReturnType != VoidTypeImpl.instance && |
| 1566 !_typeSystem.isAssignableTo( | 1568 !_typeSystem.isAssignableTo(derivedFTReturnType, baseFTReturnType)) { |
| 1567 overridingFTReturnType, overriddenFTReturnType)) { | |
| 1568 _errorReporter.reportTypeErrorForNode( | 1569 _errorReporter.reportTypeErrorForNode( |
| 1569 !isGetter | 1570 !isGetter |
| 1570 ? StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE | 1571 ? StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE |
| 1571 : StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE, | 1572 : StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE, |
| 1572 errorNameTarget, | 1573 errorNameTarget, |
| 1573 [ | 1574 [ |
| 1574 overridingFTReturnType, | 1575 derivedFTReturnType, |
| 1575 overriddenFTReturnType, | 1576 baseFTReturnType, |
| 1576 overriddenExecutable.enclosingElement.displayName | 1577 baseElement.enclosingElement.displayName |
| 1577 ]); | 1578 ]); |
| 1578 return true; | 1579 return true; |
| 1579 } | 1580 } |
| 1580 // SWC.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE | 1581 // SWC.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE |
| 1581 if (parameterLocations == null) { | 1582 if (parameterLocations == null) { |
| 1582 return false; | 1583 return false; |
| 1583 } | 1584 } |
| 1584 int parameterIndex = 0; | 1585 int parameterIndex = 0; |
| 1585 for (int i = 0; i < overridingNormalPT.length; i++) { | 1586 for (int i = 0; i < derivedNormalPT.length; i++) { |
| 1586 if (!_typeSystem.isAssignableTo( | 1587 if (!_typeSystem.isAssignableTo(baseNormalPT[i], derivedNormalPT[i])) { |
| 1587 overridingNormalPT[i], overriddenNormalPT[i])) { | |
| 1588 _errorReporter.reportTypeErrorForNode( | 1588 _errorReporter.reportTypeErrorForNode( |
| 1589 !isSetter | 1589 !isSetter |
| 1590 ? StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE | 1590 ? StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE |
| 1591 : StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE, | 1591 : StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE, |
| 1592 parameterLocations[parameterIndex], | 1592 parameterLocations[parameterIndex], |
| 1593 [ | 1593 [ |
| 1594 overridingNormalPT[i], | 1594 derivedNormalPT[i], |
| 1595 overriddenNormalPT[i], | 1595 baseNormalPT[i], |
| 1596 overriddenExecutable.enclosingElement.displayName | 1596 baseElement.enclosingElement.displayName |
| 1597 ]); | 1597 ]); |
| 1598 return true; | 1598 return true; |
| 1599 } | 1599 } |
| 1600 parameterIndex++; | 1600 parameterIndex++; |
| 1601 } | 1601 } |
| 1602 // SWC.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE | 1602 // SWC.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE |
| 1603 for (int i = 0; i < overriddenPositionalPT.length; i++) { | 1603 for (int i = 0; i < basePositionalPT.length; i++) { |
| 1604 if (!_typeSystem.isAssignableTo( | 1604 if (!_typeSystem.isAssignableTo( |
| 1605 overridingPositionalPT[i], overriddenPositionalPT[i])) { | 1605 basePositionalPT[i], derivedPositionalPT[i])) { |
| 1606 _errorReporter.reportTypeErrorForNode( | 1606 _errorReporter.reportTypeErrorForNode( |
| 1607 StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE, | 1607 StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE, |
| 1608 parameterLocations[parameterIndex], [ | 1608 parameterLocations[parameterIndex], [ |
| 1609 overridingPositionalPT[i], | 1609 derivedPositionalPT[i], |
| 1610 overriddenPositionalPT[i], | 1610 basePositionalPT[i], |
| 1611 overriddenExecutable.enclosingElement.displayName | 1611 baseElement.enclosingElement.displayName |
| 1612 ]); | 1612 ]); |
| 1613 return true; | 1613 return true; |
| 1614 } | 1614 } |
| 1615 parameterIndex++; | 1615 parameterIndex++; |
| 1616 } | 1616 } |
| 1617 // SWC.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE & | 1617 // SWC.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE & |
| 1618 // SWC.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES | 1618 // SWC.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES |
| 1619 for (String overriddenName in overriddenNamedPT.keys) { | 1619 for (String overriddenName in baseNamedPT.keys) { |
| 1620 DartType overridingType = overridingNamedPT[overriddenName]; | 1620 DartType derivedType = derivedNamedPT[overriddenName]; |
| 1621 if (overridingType == null) { | 1621 if (derivedType == null) { |
| 1622 // Error, this is never reached- INVALID_OVERRIDE_NAMED would have been | 1622 // Error, this is never reached- INVALID_OVERRIDE_NAMED would have been |
| 1623 // created above if this could be reached. | 1623 // created above if this could be reached. |
| 1624 continue; | 1624 continue; |
| 1625 } | 1625 } |
| 1626 DartType overriddenType = overriddenNamedPT[overriddenName]; | 1626 DartType baseType = baseNamedPT[overriddenName]; |
| 1627 if (!_typeSystem.isAssignableTo(overriddenType, overridingType)) { | 1627 if (!_typeSystem.isAssignableTo(baseType, derivedType)) { |
| 1628 // lookup the parameter for the error to select | 1628 // lookup the parameter for the error to select |
| 1629 ParameterElement parameterToSelect = null; | 1629 ParameterElement parameterToSelect = null; |
| 1630 AstNode parameterLocationToSelect = null; | 1630 AstNode parameterLocationToSelect = null; |
| 1631 for (int i = 0; i < parameters.length; i++) { | 1631 for (int i = 0; i < parameters.length; i++) { |
| 1632 ParameterElement parameter = parameters[i]; | 1632 ParameterElement parameter = parameters[i]; |
| 1633 if (parameter.parameterKind == ParameterKind.NAMED && | 1633 if (parameter.parameterKind == ParameterKind.NAMED && |
| 1634 overriddenName == parameter.name) { | 1634 overriddenName == parameter.name) { |
| 1635 parameterToSelect = parameter; | 1635 parameterToSelect = parameter; |
| 1636 parameterLocationToSelect = parameterLocations[i]; | 1636 parameterLocationToSelect = parameterLocations[i]; |
| 1637 break; | 1637 break; |
| 1638 } | 1638 } |
| 1639 } | 1639 } |
| 1640 if (parameterToSelect != null) { | 1640 if (parameterToSelect != null) { |
| 1641 _errorReporter.reportTypeErrorForNode( | 1641 _errorReporter.reportTypeErrorForNode( |
| 1642 StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE, | 1642 StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE, |
| 1643 parameterLocationToSelect, [ | 1643 parameterLocationToSelect, [ |
| 1644 overridingType, | 1644 derivedType, |
| 1645 overriddenType, | 1645 baseType, |
| 1646 overriddenExecutable.enclosingElement.displayName | 1646 baseElement.enclosingElement.displayName |
| 1647 ]); | 1647 ]); |
| 1648 return true; | 1648 return true; |
| 1649 } | 1649 } |
| 1650 } | 1650 } |
| 1651 } | 1651 } |
| 1652 // SWC.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES | 1652 // SWC.INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES |
| 1653 // | 1653 // |
| 1654 // Create three lists: a list of the optional parameter ASTs | 1654 // Create three lists: a list of the optional parameter ASTs |
| 1655 // (FormalParameters), a list of the optional parameters elements from our | 1655 // (FormalParameters), a list of the optional parameters elements from our |
| 1656 // method, and finally a list of the optional parameter elements from the | 1656 // method, and finally a list of the optional parameter elements from the |
| 1657 // method we are overriding. | 1657 // method we are overriding. |
| 1658 // | 1658 // |
| 1659 bool foundError = false; | 1659 bool foundError = false; |
| 1660 List<AstNode> formalParameters = new List<AstNode>(); | 1660 List<AstNode> formalParameters = new List<AstNode>(); |
| 1661 List<ParameterElementImpl> parameterElts = new List<ParameterElementImpl>(); | 1661 List<ParameterElementImpl> parameterElts = new List<ParameterElementImpl>(); |
| 1662 List<ParameterElementImpl> overriddenParameterElts = | 1662 List<ParameterElementImpl> overriddenParameterElts = |
| 1663 new List<ParameterElementImpl>(); | 1663 new List<ParameterElementImpl>(); |
| 1664 List<ParameterElement> overriddenPEs = overriddenExecutable.parameters; | 1664 List<ParameterElement> overriddenPEs = baseElement.parameters; |
| 1665 for (int i = 0; i < parameters.length; i++) { | 1665 for (int i = 0; i < parameters.length; i++) { |
| 1666 ParameterElement parameter = parameters[i]; | 1666 ParameterElement parameter = parameters[i]; |
| 1667 if (parameter.parameterKind.isOptional) { | 1667 if (parameter.parameterKind.isOptional) { |
| 1668 formalParameters.add(parameterLocations[i]); | 1668 formalParameters.add(parameterLocations[i]); |
| 1669 parameterElts.add(parameter as ParameterElementImpl); | 1669 parameterElts.add(parameter as ParameterElementImpl); |
| 1670 } | 1670 } |
| 1671 } | 1671 } |
| 1672 for (ParameterElement parameterElt in overriddenPEs) { | 1672 for (ParameterElement parameterElt in overriddenPEs) { |
| 1673 if (parameterElt.parameterKind.isOptional) { | 1673 if (parameterElt.parameterKind.isOptional) { |
| 1674 if (parameterElt is ParameterElementImpl) { | 1674 if (parameterElt is ParameterElementImpl) { |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1707 overriddenParameterElt.evaluationResult; | 1707 overriddenParameterElt.evaluationResult; |
| 1708 if (_isUserDefinedObject(overriddenResult)) { | 1708 if (_isUserDefinedObject(overriddenResult)) { |
| 1709 break; | 1709 break; |
| 1710 } | 1710 } |
| 1711 if (!result.equalValues(_typeProvider, overriddenResult)) { | 1711 if (!result.equalValues(_typeProvider, overriddenResult)) { |
| 1712 _errorReporter.reportErrorForNode( | 1712 _errorReporter.reportErrorForNode( |
| 1713 StaticWarningCode | 1713 StaticWarningCode |
| 1714 .INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED, | 1714 .INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_NAMED, |
| 1715 formalParameters[i], | 1715 formalParameters[i], |
| 1716 [ | 1716 [ |
| 1717 overriddenExecutable.enclosingElement.displayName, | 1717 baseElement.enclosingElement.displayName, |
| 1718 overriddenExecutable.displayName, | 1718 baseElement.displayName, |
| 1719 parameterName | 1719 parameterName |
| 1720 ]); | 1720 ]); |
| 1721 foundError = true; | 1721 foundError = true; |
| 1722 } | 1722 } |
| 1723 } | 1723 } |
| 1724 } | 1724 } |
| 1725 } | 1725 } |
| 1726 } else { | 1726 } else { |
| 1727 // Positional parameters, consider the positions when matching the | 1727 // Positional parameters, consider the positions when matching the |
| 1728 // parameterElts to the overriddenParameterElts | 1728 // parameterElts to the overriddenParameterElts |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 1746 overriddenParameterElt.evaluationResult; | 1746 overriddenParameterElt.evaluationResult; |
| 1747 if (_isUserDefinedObject(overriddenResult)) { | 1747 if (_isUserDefinedObject(overriddenResult)) { |
| 1748 continue; | 1748 continue; |
| 1749 } | 1749 } |
| 1750 if (!result.equalValues(_typeProvider, overriddenResult)) { | 1750 if (!result.equalValues(_typeProvider, overriddenResult)) { |
| 1751 _errorReporter.reportErrorForNode( | 1751 _errorReporter.reportErrorForNode( |
| 1752 StaticWarningCode | 1752 StaticWarningCode |
| 1753 .INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL, | 1753 .INVALID_OVERRIDE_DIFFERENT_DEFAULT_VALUES_POSITIONAL, |
| 1754 formalParameters[i], | 1754 formalParameters[i], |
| 1755 [ | 1755 [ |
| 1756 overriddenExecutable.enclosingElement.displayName, | 1756 baseElement.enclosingElement.displayName, |
| 1757 overriddenExecutable.displayName | 1757 baseElement.displayName |
| 1758 ]); | 1758 ]); |
| 1759 foundError = true; | 1759 foundError = true; |
| 1760 } | 1760 } |
| 1761 } | 1761 } |
| 1762 } | 1762 } |
| 1763 } | 1763 } |
| 1764 return foundError; | 1764 return foundError; |
| 1765 } | 1765 } |
| 1766 | 1766 |
| 1767 /** | 1767 /** |
| (...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2195 highlightedNode = expression.identifier; | 2195 highlightedNode = expression.identifier; |
| 2196 } | 2196 } |
| 2197 } else if (expression is PropertyAccess) { | 2197 } else if (expression is PropertyAccess) { |
| 2198 element = expression.propertyName.staticElement; | 2198 element = expression.propertyName.staticElement; |
| 2199 highlightedNode = expression.propertyName; | 2199 highlightedNode = expression.propertyName; |
| 2200 } | 2200 } |
| 2201 // check if element is assignable | 2201 // check if element is assignable |
| 2202 Element toVariable(Element element) { | 2202 Element toVariable(Element element) { |
| 2203 return element is PropertyAccessorElement ? element.variable : element; | 2203 return element is PropertyAccessorElement ? element.variable : element; |
| 2204 } | 2204 } |
| 2205 | |
| 2205 element = toVariable(element); | 2206 element = toVariable(element); |
| 2206 if (element is VariableElement) { | 2207 if (element is VariableElement) { |
| 2207 if (element.isConst) { | 2208 if (element.isConst) { |
| 2208 _errorReporter.reportErrorForNode( | 2209 _errorReporter.reportErrorForNode( |
| 2209 StaticWarningCode.ASSIGNMENT_TO_CONST, expression); | 2210 StaticWarningCode.ASSIGNMENT_TO_CONST, expression); |
| 2210 } else if (element.isFinal) { | 2211 } else if (element.isFinal) { |
| 2211 if (element is FieldElementImpl && | 2212 if (element is FieldElementImpl && |
| 2212 element.setter == null && | 2213 element.setter == null && |
| 2213 element.isSynthetic) { | 2214 element.isSynthetic) { |
| 2214 _errorReporter.reportErrorForNode( | 2215 _errorReporter.reportErrorForNode( |
| (...skipping 3591 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5806 if (element == null || typeArguments == null) { | 5807 if (element == null || typeArguments == null) { |
| 5807 return; | 5808 return; |
| 5808 } | 5809 } |
| 5809 void reportError( | 5810 void reportError( |
| 5810 TypeName argument, DartType argumentType, DartType parameterType) { | 5811 TypeName argument, DartType argumentType, DartType parameterType) { |
| 5811 _errorReporter.reportTypeErrorForNode( | 5812 _errorReporter.reportTypeErrorForNode( |
| 5812 StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, | 5813 StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS, |
| 5813 argument, | 5814 argument, |
| 5814 [argumentType, parameterType]); | 5815 [argumentType, parameterType]); |
| 5815 } | 5816 } |
| 5817 | |
| 5816 if (element is FunctionTypedElement) { | 5818 if (element is FunctionTypedElement) { |
| 5817 _checkTypeArgumentsAgainstBounds( | 5819 _checkTypeArgumentsAgainstBounds( |
| 5818 element.typeParameters, typeArguments, targetType, reportError); | 5820 element.typeParameters, typeArguments, targetType, reportError); |
| 5819 } else if (element is ClassElement) { | 5821 } else if (element is ClassElement) { |
| 5820 _checkTypeArgumentsAgainstBounds( | 5822 _checkTypeArgumentsAgainstBounds( |
| 5821 element.typeParameters, typeArguments, targetType, reportError); | 5823 element.typeParameters, typeArguments, targetType, reportError); |
| 5822 } else if (element is ParameterElement || element is LocalVariableElement) { | 5824 } else if (element is ParameterElement || element is LocalVariableElement) { |
| 5823 // TODO(brianwilkerson) Implement this case | 5825 // TODO(brianwilkerson) Implement this case |
| 5824 } else { | 5826 } else { |
| 5825 print('Unhandled element type: ${element.runtimeType}'); | 5827 print('Unhandled element type: ${element.runtimeType}'); |
| (...skipping 629 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6455 class _InvocationCollector extends RecursiveAstVisitor { | 6457 class _InvocationCollector extends RecursiveAstVisitor { |
| 6456 final List<String> superCalls = <String>[]; | 6458 final List<String> superCalls = <String>[]; |
| 6457 | 6459 |
| 6458 @override | 6460 @override |
| 6459 visitMethodInvocation(MethodInvocation node) { | 6461 visitMethodInvocation(MethodInvocation node) { |
| 6460 if (node.target is SuperExpression) { | 6462 if (node.target is SuperExpression) { |
| 6461 superCalls.add(node.methodName.name); | 6463 superCalls.add(node.methodName.name); |
| 6462 } | 6464 } |
| 6463 } | 6465 } |
| 6464 } | 6466 } |
| OLD | NEW |