Chromium Code Reviews| 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 Element operator[](Node node); | 8 Element operator[](Node node); |
| 9 Selector getSelector(Send send); | 9 Selector getSelector(Send send); |
| 10 DartType getType(Node node); | 10 DartType getType(Node node); |
| (...skipping 1158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1169 Element enclosingElement; | 1169 Element enclosingElement; |
| 1170 final TypeResolver typeResolver; | 1170 final TypeResolver typeResolver; |
| 1171 bool inInstanceContext; | 1171 bool inInstanceContext; |
| 1172 bool inCheckContext; | 1172 bool inCheckContext; |
| 1173 bool inCatchBlock; | 1173 bool inCatchBlock; |
| 1174 Scope scope; | 1174 Scope scope; |
| 1175 ClassElement currentClass; | 1175 ClassElement currentClass; |
| 1176 ExpressionStatement currentExpressionStatement; | 1176 ExpressionStatement currentExpressionStatement; |
| 1177 bool typeRequired = false; | 1177 bool typeRequired = false; |
| 1178 StatementScope statementScope; | 1178 StatementScope statementScope; |
| 1179 int allowedCategory = ElementCategory.VARIABLE | ElementCategory.FUNCTION; | 1179 int allowedCategory = ElementCategory.VARIABLE | ElementCategory.FUNCTION |
| 1180 | ElementCategory.IMPLIES_TYPE; | |
| 1180 | 1181 |
| 1181 ResolverVisitor(Compiler compiler, Element element, this.mapping) | 1182 ResolverVisitor(Compiler compiler, Element element, this.mapping) |
| 1182 : this.enclosingElement = element, | 1183 : this.enclosingElement = element, |
| 1183 // When the element is a field, we are actually resolving its | 1184 // When the element is a field, we are actually resolving its |
| 1184 // initial value, which should not have access to instance | 1185 // initial value, which should not have access to instance |
| 1185 // fields. | 1186 // fields. |
| 1186 inInstanceContext = (element.isInstanceMember() && !element.isField()) | 1187 inInstanceContext = (element.isInstanceMember() && !element.isField()) |
| 1187 || element.isGenerativeConstructor(), | 1188 || element.isGenerativeConstructor(), |
| 1188 this.currentClass = element.isMember() ? element.getEnclosingClass() | 1189 this.currentClass = element.isMember() ? element.getEnclosingClass() |
| 1189 : null, | 1190 : null, |
| (...skipping 309 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1499 error(node.selector, | 1500 error(node.selector, |
| 1500 MessageKind.WRONG_NUMBER_OF_ARGUMENTS_FOR_ASSERT, | 1501 MessageKind.WRONG_NUMBER_OF_ARGUMENTS_FOR_ASSERT, |
| 1501 [selector.argumentCount]); | 1502 [selector.argumentCount]); |
| 1502 } else if (selector.namedArgumentCount != 0) { | 1503 } else if (selector.namedArgumentCount != 0) { |
| 1503 error(node.selector, | 1504 error(node.selector, |
| 1504 MessageKind.ASSERT_IS_GIVEN_NAMED_ARGUMENTS, | 1505 MessageKind.ASSERT_IS_GIVEN_NAMED_ARGUMENTS, |
| 1505 [selector.namedArgumentCount]); | 1506 [selector.namedArgumentCount]); |
| 1506 } | 1507 } |
| 1507 return compiler.assertMethod; | 1508 return compiler.assertMethod; |
| 1508 } | 1509 } |
| 1509 return node.selector.accept(this); | 1510 |
| 1511 Element result = node.selector.accept(this); | |
| 1512 if (result != null) { | |
| 1513 if (result.kind == ElementKind.CLASS) { | |
| 1514 ClassElement classElement = result; | |
| 1515 classElement.ensureResolved(compiler); | |
| 1516 } | |
| 1517 } | |
| 1518 return result; | |
| 1510 } | 1519 } |
| 1511 | 1520 |
| 1512 var oldCategory = allowedCategory; | 1521 var oldCategory = allowedCategory; |
| 1513 allowedCategory |= | 1522 allowedCategory |= ElementCategory.PREFIX | ElementCategory.SUPER; |
| 1514 ElementCategory.CLASS | ElementCategory.PREFIX | ElementCategory.SUPER; | |
| 1515 Element resolvedReceiver = visit(node.receiver); | 1523 Element resolvedReceiver = visit(node.receiver); |
| 1516 allowedCategory = oldCategory; | 1524 allowedCategory = oldCategory; |
| 1517 | 1525 |
| 1526 if (resolvedReceiver != null | |
| 1527 && resolvedReceiver.kind == ElementKind.CLASS) { | |
| 1528 ClassElement classElement = resolvedReceiver; | |
| 1529 classElement.ensureResolved(compiler); | |
| 1530 if (node.isOperator) { | |
| 1531 // In operator expressions like 'Class + 1', the operator call goes the | |
| 1532 // instance of [Type] that is the result of the expression 'Class'. | |
|
ngeoffray
2012/10/31 10:33:03
The comment is not helping me understand what's ha
karlklose
2012/10/31 13:01:18
Rephrased. Is it better to understand now?
| |
| 1533 resolvedReceiver = null; | |
| 1534 } | |
| 1535 } | |
| 1536 | |
| 1518 Element target; | 1537 Element target; |
| 1519 SourceString name = node.selector.asIdentifier().source; | 1538 SourceString name = node.selector.asIdentifier().source; |
| 1520 if (identical(name.stringValue, 'this')) { | 1539 if (identical(name.stringValue, 'this')) { |
| 1521 error(node.selector, MessageKind.GENERIC, ["expected an identifier"]); | 1540 error(node.selector, MessageKind.GENERIC, ["expected an identifier"]); |
| 1522 } else if (node.isSuperCall) { | 1541 } else if (node.isSuperCall) { |
| 1523 if (node.isOperator) { | 1542 if (node.isOperator) { |
| 1524 if (isUserDefinableOperator(name.stringValue)) { | 1543 if (isUserDefinableOperator(name.stringValue)) { |
| 1525 name = selector.name; | 1544 name = selector.name; |
| 1526 } else { | 1545 } else { |
| 1527 error(node.selector, MessageKind.ILLEGAL_SUPER_SEND, [name]); | 1546 error(node.selector, MessageKind.ILLEGAL_SUPER_SEND, [name]); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1563 } | 1582 } |
| 1564 } else if (identical(resolvedReceiver.kind, ElementKind.PREFIX)) { | 1583 } else if (identical(resolvedReceiver.kind, ElementKind.PREFIX)) { |
| 1565 PrefixElement prefix = resolvedReceiver; | 1584 PrefixElement prefix = resolvedReceiver; |
| 1566 target = prefix.lookupLocalMember(name); | 1585 target = prefix.lookupLocalMember(name); |
| 1567 if (target == null) { | 1586 if (target == null) { |
| 1568 return warnAndCreateErroneousElement( | 1587 return warnAndCreateErroneousElement( |
| 1569 node, name, MessageKind.NO_SUCH_LIBRARY_MEMBER, | 1588 node, name, MessageKind.NO_SUCH_LIBRARY_MEMBER, |
| 1570 [prefix.name, name]); | 1589 [prefix.name, name]); |
| 1571 } | 1590 } |
| 1572 } | 1591 } |
| 1592 if (target != null && target.kind == ElementKind.CLASS) { | |
|
ngeoffray
2012/10/31 10:33:03
Should that check be in the prefix check?
karlklose
2012/10/31 13:01:18
Where exactly do you mean this should be?
ngeoffray
2012/10/31 14:32:43
line 1590
karlklose
2012/10/31 16:32:17
Yes, makes sense.
| |
| 1593 ClassElement classElement = target; | |
| 1594 classElement.ensureResolved(compiler); | |
| 1595 } | |
| 1573 return target; | 1596 return target; |
| 1574 } | 1597 } |
| 1575 | 1598 |
| 1576 DartType resolveTypeTest(Node argument) { | 1599 DartType resolveTypeTest(Node argument) { |
| 1577 TypeAnnotation node = argument.asTypeAnnotation(); | 1600 TypeAnnotation node = argument.asTypeAnnotation(); |
| 1578 if (node == null) { | 1601 if (node == null) { |
| 1579 // node is of the form !Type. | 1602 // node is of the form !Type. |
| 1580 node = argument.asSend().receiver.asTypeAnnotation(); | 1603 node = argument.asSend().receiver.asTypeAnnotation(); |
| 1581 if (node == null) compiler.cancel("malformed send"); | 1604 if (node == null) compiler.cancel("malformed send"); |
| 1582 } | 1605 } |
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1700 | 1723 |
| 1701 if (node.isCall) { | 1724 if (node.isCall) { |
| 1702 if (Elements.isUnresolved(target) || | 1725 if (Elements.isUnresolved(target) || |
| 1703 target.isGetter() || | 1726 target.isGetter() || |
| 1704 Elements.isClosureSend(node, target)) { | 1727 Elements.isClosureSend(node, target)) { |
| 1705 // If we don't know what we're calling or if we are calling a getter, | 1728 // If we don't know what we're calling or if we are calling a getter, |
| 1706 // we need to register that fact that we may be calling a closure | 1729 // we need to register that fact that we may be calling a closure |
| 1707 // with the same arguments. | 1730 // with the same arguments. |
| 1708 Selector call = new Selector.callClosureFrom(selector); | 1731 Selector call = new Selector.callClosureFrom(selector); |
| 1709 world.registerDynamicInvocation(call.name, call); | 1732 world.registerDynamicInvocation(call.name, call); |
| 1710 } else if (!selector.applies(target, compiler)) { | 1733 } else if (target is FunctionElement |
|
ngeoffray
2012/10/31 10:33:03
target.isFunction() ? Or have selector.applies do
karlklose
2012/10/31 13:01:18
I added a case for targets that imply a type.
| |
| 1734 && !selector.applies(target, compiler)) { | |
| 1711 warnArgumentMismatch(node, target); | 1735 warnArgumentMismatch(node, target); |
| 1712 } | 1736 } |
| 1713 } | 1737 } |
| 1714 | 1738 |
| 1715 // TODO(ngeoffray): Warn if target is null and the send is | 1739 // TODO(ngeoffray): Warn if target is null and the send is |
| 1716 // unqualified. | 1740 // unqualified. |
| 1717 useElement(node, target); | 1741 useElement(node, target); |
| 1718 registerSend(selector, target); | 1742 registerSend(selector, target); |
| 1719 return node.isPropertyAccess ? target : null; | 1743 return node.isPropertyAccess ? target : null; |
| 1720 } | 1744 } |
| (...skipping 1269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2990 error(node, MessageKind.CANNOT_INSTANTIATE_TYPEDEF, [name]); | 3014 error(node, MessageKind.CANNOT_INSTANTIATE_TYPEDEF, [name]); |
| 2991 } else if (identical(e.kind, ElementKind.TYPE_VARIABLE)) { | 3015 } else if (identical(e.kind, ElementKind.TYPE_VARIABLE)) { |
| 2992 error(node, MessageKind.CANNOT_INSTANTIATE_TYPE_VARIABLE, [name]); | 3016 error(node, MessageKind.CANNOT_INSTANTIATE_TYPE_VARIABLE, [name]); |
| 2993 } else if (!identical(e.kind, ElementKind.CLASS) | 3017 } else if (!identical(e.kind, ElementKind.CLASS) |
| 2994 && !identical(e.kind, ElementKind.PREFIX)) { | 3018 && !identical(e.kind, ElementKind.PREFIX)) { |
| 2995 error(node, MessageKind.NOT_A_TYPE, [name]); | 3019 error(node, MessageKind.NOT_A_TYPE, [name]); |
| 2996 } | 3020 } |
| 2997 return e; | 3021 return e; |
| 2998 } | 3022 } |
| 2999 } | 3023 } |
| OLD | NEW |