| 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 abstract class TreeElements { | 5 abstract class TreeElements { |
| 6 Element operator[](Node node); | 6 Element operator[](Node node); |
| 7 Selector getSelector(Send send); | 7 Selector getSelector(Send send); |
| 8 DartType getType(TypeAnnotation annotation); | 8 DartType getType(TypeAnnotation annotation); |
| 9 bool isParameterChecked(Element element); | 9 bool isParameterChecked(Element element); |
| 10 } | 10 } |
| (...skipping 1036 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1047 return null; | 1047 return null; |
| 1048 } else if (node.isSuper()) { | 1048 } else if (node.isSuper()) { |
| 1049 if (!inInstanceContext) error(node, MessageKind.NO_SUPER_IN_STATIC); | 1049 if (!inInstanceContext) error(node, MessageKind.NO_SUPER_IN_STATIC); |
| 1050 if ((ElementCategory.SUPER & allowedCategory) == 0) { | 1050 if ((ElementCategory.SUPER & allowedCategory) == 0) { |
| 1051 error(node, MessageKind.INVALID_USE_OF_SUPER); | 1051 error(node, MessageKind.INVALID_USE_OF_SUPER); |
| 1052 } | 1052 } |
| 1053 return null; | 1053 return null; |
| 1054 } else { | 1054 } else { |
| 1055 Element element = lookup(node, node.source); | 1055 Element element = lookup(node, node.source); |
| 1056 if (element === null) { | 1056 if (element === null) { |
| 1057 if (!inInstanceContext) error(node, MessageKind.CANNOT_RESOLVE, [node]); | 1057 if (!inInstanceContext) { |
| 1058 element = warnAndCreateErroneousElement(node, node.source, |
| 1059 MessageKind.CANNOT_RESOLVE, |
| 1060 [node]); |
| 1061 } |
| 1058 } else { | 1062 } else { |
| 1059 if ((element.kind.category & allowedCategory) == 0) { | 1063 if ((element.kind.category & allowedCategory) == 0) { |
| 1060 // TODO(ahe): Improve error message. Need UX input. | 1064 // TODO(ahe): Improve error message. Need UX input. |
| 1061 error(node, MessageKind.GENERIC, ["is not an expression $element"]); | 1065 error(node, MessageKind.GENERIC, ["is not an expression $element"]); |
| 1062 } | 1066 } |
| 1063 } | 1067 } |
| 1064 return useElement(node, element); | 1068 return useElement(node, element); |
| 1065 } | 1069 } |
| 1066 } | 1070 } |
| 1067 | 1071 |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1294 } | 1298 } |
| 1295 target = currentClass.lookupSuperMember(name); | 1299 target = currentClass.lookupSuperMember(name); |
| 1296 // [target] may be null which means invoking noSuchMethod on | 1300 // [target] may be null which means invoking noSuchMethod on |
| 1297 // super. | 1301 // super. |
| 1298 } else if (Elements.isUnresolved(resolvedReceiver)) { | 1302 } else if (Elements.isUnresolved(resolvedReceiver)) { |
| 1299 return null; | 1303 return null; |
| 1300 } else if (resolvedReceiver.kind === ElementKind.CLASS) { | 1304 } else if (resolvedReceiver.kind === ElementKind.CLASS) { |
| 1301 ClassElement receiverClass = resolvedReceiver; | 1305 ClassElement receiverClass = resolvedReceiver; |
| 1302 target = receiverClass.ensureResolved(compiler).lookupLocalMember(name); | 1306 target = receiverClass.ensureResolved(compiler).lookupLocalMember(name); |
| 1303 if (target === null) { | 1307 if (target === null) { |
| 1308 // TODO(karlklose): this should be reported by the caller of |
| 1309 // [resolveSend] to select better warning messages for getters and |
| 1310 // setters. |
| 1304 return warnAndCreateErroneousElement(node, name, | 1311 return warnAndCreateErroneousElement(node, name, |
| 1305 MessageKind.METHOD_NOT_FOUND, | 1312 MessageKind.METHOD_NOT_FOUND, |
| 1306 [receiverClass.name, name]); | 1313 [receiverClass.name, name]); |
| 1307 } else if (target.isInstanceMember()) { | 1314 } else if (target.isInstanceMember()) { |
| 1308 error(node, MessageKind.MEMBER_NOT_STATIC, [receiverClass.name, name]); | 1315 error(node, MessageKind.MEMBER_NOT_STATIC, [receiverClass.name, name]); |
| 1309 } | 1316 } |
| 1310 } else if (resolvedReceiver.kind === ElementKind.PREFIX) { | 1317 } else if (resolvedReceiver.kind === ElementKind.PREFIX) { |
| 1311 PrefixElement prefix = resolvedReceiver; | 1318 PrefixElement prefix = resolvedReceiver; |
| 1312 target = prefix.lookupLocalMember(name); | 1319 target = prefix.lookupLocalMember(name); |
| 1313 if (target == null) { | 1320 if (target == null) { |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1397 } | 1404 } |
| 1398 } | 1405 } |
| 1399 } | 1406 } |
| 1400 | 1407 |
| 1401 visitSend(Send node) { | 1408 visitSend(Send node) { |
| 1402 Element target = resolveSend(node); | 1409 Element target = resolveSend(node); |
| 1403 if (!Elements.isUnresolved(target) | 1410 if (!Elements.isUnresolved(target) |
| 1404 && target.kind == ElementKind.ABSTRACT_FIELD) { | 1411 && target.kind == ElementKind.ABSTRACT_FIELD) { |
| 1405 AbstractFieldElement field = target; | 1412 AbstractFieldElement field = target; |
| 1406 target = field.getter; | 1413 target = field.getter; |
| 1407 if (Elements.isUnresolved(target) && !inInstanceContext) { | 1414 if (target == null && !inInstanceContext) { |
| 1408 error(node.selector, MessageKind.CANNOT_RESOLVE_GETTER); | 1415 target = |
| 1416 warnAndCreateErroneousElement(node.selector, field.name, |
| 1417 MessageKind.CANNOT_RESOLVE_GETTER, |
| 1418 [node.selector]); |
| 1409 } | 1419 } |
| 1410 } | 1420 } |
| 1411 | 1421 |
| 1412 bool resolvedArguments = false; | 1422 bool resolvedArguments = false; |
| 1413 if (node.isOperator) { | 1423 if (node.isOperator) { |
| 1414 String operatorString = node.selector.asOperator().source.stringValue; | 1424 String operatorString = node.selector.asOperator().source.stringValue; |
| 1415 if (operatorString === 'is' || operatorString === 'as') { | 1425 if (operatorString === 'is' || operatorString === 'as') { |
| 1416 assert(node.arguments.tail.isEmpty()); | 1426 assert(node.arguments.tail.isEmpty()); |
| 1417 DartType type = resolveTypeTest(node.arguments.head); | 1427 DartType type = resolveTypeTest(node.arguments.head); |
| 1418 if (type != null) { | 1428 if (type != null) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1461 Element setter = target; | 1471 Element setter = target; |
| 1462 Element getter = target; | 1472 Element getter = target; |
| 1463 String source = node.assignmentOperator.source.stringValue; | 1473 String source = node.assignmentOperator.source.stringValue; |
| 1464 bool isComplex = source !== '='; | 1474 bool isComplex = source !== '='; |
| 1465 if (!Elements.isUnresolved(target) | 1475 if (!Elements.isUnresolved(target) |
| 1466 && target.kind == ElementKind.ABSTRACT_FIELD) { | 1476 && target.kind == ElementKind.ABSTRACT_FIELD) { |
| 1467 AbstractFieldElement field = target; | 1477 AbstractFieldElement field = target; |
| 1468 setter = field.setter; | 1478 setter = field.setter; |
| 1469 getter = field.getter; | 1479 getter = field.getter; |
| 1470 if (setter == null && !inInstanceContext) { | 1480 if (setter == null && !inInstanceContext) { |
| 1471 error(node.selector, MessageKind.CANNOT_RESOLVE_SETTER); | 1481 setter = |
| 1482 warnAndCreateErroneousElement(node.selector, field.name, |
| 1483 MessageKind.CANNOT_RESOLVE_SETTER, |
| 1484 [node.selector]); |
| 1472 } | 1485 } |
| 1473 if (isComplex && getter == null && !inInstanceContext) { | 1486 if (isComplex && getter == null && !inInstanceContext) { |
| 1474 error(node.selector, MessageKind.CANNOT_RESOLVE_GETTER); | 1487 getter = |
| 1488 warnAndCreateErroneousElement(node.selector, field.name, |
| 1489 MessageKind.CANNOT_RESOLVE_GETTER, |
| 1490 [node.selector]); |
| 1475 } | 1491 } |
| 1476 } | 1492 } |
| 1477 | 1493 |
| 1478 visit(node.argumentsNode); | 1494 visit(node.argumentsNode); |
| 1479 | 1495 |
| 1480 // TODO(ngeoffray): Check if the target can be assigned. | 1496 // TODO(ngeoffray): Check if the target can be assigned. |
| 1481 // TODO(ngeoffray): Warn if target is null and the send is | 1497 // TODO(ngeoffray): Warn if target is null and the send is |
| 1482 // unqualified. | 1498 // unqualified. |
| 1483 | 1499 |
| 1484 Selector selector = mapping.getSelector(node); | 1500 Selector selector = mapping.getSelector(node); |
| (...skipping 1286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2771 | 2787 |
| 2772 Element localLookup(SourceString name) => library.find(name); | 2788 Element localLookup(SourceString name) => library.find(name); |
| 2773 Element lookup(SourceString name) => localLookup(name); | 2789 Element lookup(SourceString name) => localLookup(name); |
| 2774 Element lexicalLookup(SourceString name) => localLookup(name); | 2790 Element lexicalLookup(SourceString name) => localLookup(name); |
| 2775 | 2791 |
| 2776 Element add(Element newElement) { | 2792 Element add(Element newElement) { |
| 2777 throw "Cannot add an element in the top scope"; | 2793 throw "Cannot add an element in the top scope"; |
| 2778 } | 2794 } |
| 2779 String toString() => '$element'; | 2795 String toString() => '$element'; |
| 2780 } | 2796 } |
| OLD | NEW |