OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 part of resolution; | 5 part of resolution; |
6 | 6 |
7 abstract class TreeElements { | 7 abstract class TreeElements { |
8 AnalyzableElement get analyzedElement; | 8 AnalyzableElement get analyzedElement; |
9 Iterable<Node> get superUses; | 9 Iterable<Node> get superUses; |
10 | 10 |
(...skipping 1482 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1493 call); | 1493 call); |
1494 Selector constructorSelector = | 1494 Selector constructorSelector = |
1495 visitor.getRedirectingThisOrSuperConstructorSelector(call); | 1495 visitor.getRedirectingThisOrSuperConstructorSelector(call); |
1496 FunctionElement calledConstructor = | 1496 FunctionElement calledConstructor = |
1497 lookupTarget.lookupConstructor(constructorSelector.name); | 1497 lookupTarget.lookupConstructor(constructorSelector.name); |
1498 | 1498 |
1499 final bool isImplicitSuperCall = false; | 1499 final bool isImplicitSuperCall = false; |
1500 final String className = lookupTarget.name; | 1500 final String className = lookupTarget.name; |
1501 verifyThatConstructorMatchesCall(constructor, | 1501 verifyThatConstructorMatchesCall(constructor, |
1502 calledConstructor, | 1502 calledConstructor, |
1503 selector, | 1503 selector.callStructure, |
1504 isImplicitSuperCall, | 1504 isImplicitSuperCall, |
1505 call, | 1505 call, |
1506 className, | 1506 className, |
1507 constructorSelector); | 1507 constructorSelector); |
1508 | 1508 |
1509 registry.useElement(call, calledConstructor); | 1509 registry.useElement(call, calledConstructor); |
1510 registry.registerStaticUse(calledConstructor); | 1510 registry.registerStaticUse(calledConstructor); |
1511 return calledConstructor; | 1511 return calledConstructor; |
1512 } | 1512 } |
1513 | 1513 |
1514 void resolveImplicitSuperConstructorSend(FunctionElement constructor, | 1514 void resolveImplicitSuperConstructorSend(FunctionElement constructor, |
1515 FunctionExpression functionNode) { | 1515 FunctionExpression functionNode) { |
1516 // If the class has a super resolve the implicit super call. | 1516 // If the class has a super resolve the implicit super call. |
1517 ClassElement classElement = constructor.enclosingClass; | 1517 ClassElement classElement = constructor.enclosingClass; |
1518 ClassElement superClass = classElement.superclass; | 1518 ClassElement superClass = classElement.superclass; |
1519 if (classElement != visitor.compiler.objectClass) { | 1519 if (classElement != visitor.compiler.objectClass) { |
1520 assert(superClass != null); | 1520 assert(superClass != null); |
1521 assert(superClass.resolutionState == STATE_DONE); | 1521 assert(superClass.resolutionState == STATE_DONE); |
1522 String constructorName = ''; | |
1523 Selector callToMatch = new Selector.call( | |
1524 constructorName, | |
1525 classElement.library, | |
1526 0); | |
1527 | 1522 |
1528 final bool isSuperCall = true; | 1523 final bool isSuperCall = true; |
1529 ClassElement lookupTarget = getSuperOrThisLookupTarget(constructor, | 1524 ClassElement lookupTarget = getSuperOrThisLookupTarget(constructor, |
1530 isSuperCall, | 1525 isSuperCall, |
1531 functionNode); | 1526 functionNode); |
1532 Selector constructorSelector = new Selector.callDefaultConstructor(); | 1527 Selector constructorSelector = new Selector.callDefaultConstructor(); |
1533 Element calledConstructor = lookupTarget.lookupConstructor( | 1528 Element calledConstructor = lookupTarget.lookupConstructor( |
1534 constructorSelector.name); | 1529 constructorSelector.name); |
1535 | 1530 |
1536 final String className = lookupTarget.name; | 1531 final String className = lookupTarget.name; |
1537 final bool isImplicitSuperCall = true; | 1532 final bool isImplicitSuperCall = true; |
1538 verifyThatConstructorMatchesCall(constructor, | 1533 verifyThatConstructorMatchesCall(constructor, |
1539 calledConstructor, | 1534 calledConstructor, |
1540 callToMatch, | 1535 CallStructure.NO_ARGS, |
1541 isImplicitSuperCall, | 1536 isImplicitSuperCall, |
1542 functionNode, | 1537 functionNode, |
1543 className, | 1538 className, |
1544 constructorSelector); | 1539 constructorSelector); |
1545 registry.registerImplicitSuperCall(calledConstructor); | 1540 registry.registerImplicitSuperCall(calledConstructor); |
1546 registry.registerStaticUse(calledConstructor); | 1541 registry.registerStaticUse(calledConstructor); |
1547 } | 1542 } |
1548 } | 1543 } |
1549 | 1544 |
1550 void verifyThatConstructorMatchesCall( | 1545 void verifyThatConstructorMatchesCall( |
1551 FunctionElement caller, | 1546 FunctionElement caller, |
1552 ConstructorElementX lookedupConstructor, | 1547 ConstructorElementX lookedupConstructor, |
1553 Selector call, | 1548 CallStructure call, |
1554 bool isImplicitSuperCall, | 1549 bool isImplicitSuperCall, |
1555 Node diagnosticNode, | 1550 Node diagnosticNode, |
1556 String className, | 1551 String className, |
1557 Selector constructorSelector) { | 1552 Selector constructorSelector) { |
1558 if (lookedupConstructor == null | 1553 if (lookedupConstructor == null |
1559 || !lookedupConstructor.isGenerativeConstructor) { | 1554 || !lookedupConstructor.isGenerativeConstructor) { |
1560 String fullConstructorName = Elements.constructorNameForDiagnostics( | 1555 String fullConstructorName = Elements.constructorNameForDiagnostics( |
1561 className, | 1556 className, |
1562 constructorSelector.name); | 1557 constructorSelector.name); |
1563 MessageKind kind = isImplicitSuperCall | 1558 MessageKind kind = isImplicitSuperCall |
1564 ? MessageKind.CANNOT_RESOLVE_CONSTRUCTOR_FOR_IMPLICIT | 1559 ? MessageKind.CANNOT_RESOLVE_CONSTRUCTOR_FOR_IMPLICIT |
1565 : MessageKind.CANNOT_RESOLVE_CONSTRUCTOR; | 1560 : MessageKind.CANNOT_RESOLVE_CONSTRUCTOR; |
1566 visitor.compiler.reportError( | 1561 visitor.compiler.reportError( |
1567 diagnosticNode, kind, {'constructorName': fullConstructorName}); | 1562 diagnosticNode, kind, {'constructorName': fullConstructorName}); |
1568 } else { | 1563 } else { |
1569 lookedupConstructor.computeSignature(visitor.compiler); | 1564 lookedupConstructor.computeSignature(visitor.compiler); |
1570 if (!call.applies(lookedupConstructor, visitor.compiler.world)) { | 1565 if (!call.signatureApplies(lookedupConstructor)) { |
1571 MessageKind kind = isImplicitSuperCall | 1566 MessageKind kind = isImplicitSuperCall |
1572 ? MessageKind.NO_MATCHING_CONSTRUCTOR_FOR_IMPLICIT | 1567 ? MessageKind.NO_MATCHING_CONSTRUCTOR_FOR_IMPLICIT |
1573 : MessageKind.NO_MATCHING_CONSTRUCTOR; | 1568 : MessageKind.NO_MATCHING_CONSTRUCTOR; |
1574 visitor.compiler.reportError(diagnosticNode, kind); | 1569 visitor.compiler.reportError(diagnosticNode, kind); |
1575 } else if (caller.isConst | 1570 } else if (caller.isConst |
1576 && !lookedupConstructor.isConst) { | 1571 && !lookedupConstructor.isConst) { |
1577 visitor.compiler.reportError( | 1572 visitor.compiler.reportError( |
1578 diagnosticNode, MessageKind.CONST_CALLS_NON_CONST); | 1573 diagnosticNode, MessageKind.CONST_CALLS_NON_CONST); |
1579 } | 1574 } |
1580 } | 1575 } |
(...skipping 3496 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5077 } | 5072 } |
5078 | 5073 |
5079 /// The result for the resolution of the `assert` method. | 5074 /// The result for the resolution of the `assert` method. |
5080 class AssertResult implements ResolutionResult { | 5075 class AssertResult implements ResolutionResult { |
5081 const AssertResult(); | 5076 const AssertResult(); |
5082 | 5077 |
5083 Element get element => null; | 5078 Element get element => null; |
5084 | 5079 |
5085 String toString() => 'AssertResult()'; | 5080 String toString() => 'AssertResult()'; |
5086 } | 5081 } |
OLD | NEW |