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 |