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

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

Issue 2236763002: fix wrong order to isAssignableTo for override params (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 4 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 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
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
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
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
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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698