| 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 1028 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1039 return null; | 1039 return null; |
| 1040 } else if (node.isSuper()) { | 1040 } else if (node.isSuper()) { |
| 1041 if (!inInstanceContext) error(node, MessageKind.NO_SUPER_IN_STATIC); | 1041 if (!inInstanceContext) error(node, MessageKind.NO_SUPER_IN_STATIC); |
| 1042 if ((ElementCategory.SUPER & allowedCategory) == 0) { | 1042 if ((ElementCategory.SUPER & allowedCategory) == 0) { |
| 1043 error(node, MessageKind.INVALID_USE_OF_SUPER); | 1043 error(node, MessageKind.INVALID_USE_OF_SUPER); |
| 1044 } | 1044 } |
| 1045 return null; | 1045 return null; |
| 1046 } else { | 1046 } else { |
| 1047 Element element = lookup(node, node.source); | 1047 Element element = lookup(node, node.source); |
| 1048 if (element === null) { | 1048 if (element === null) { |
| 1049 if (!inInstanceContext) error(node, MessageKind.CANNOT_RESOLVE, [node]); | 1049 if (!inInstanceContext) { |
| 1050 element = warnAndCreateErroneousElement(node, node.source, |
| 1051 MessageKind.CANNOT_RESOLVE, |
| 1052 [node]); |
| 1053 } |
| 1050 } else { | 1054 } else { |
| 1051 if ((element.kind.category & allowedCategory) == 0) { | 1055 if ((element.kind.category & allowedCategory) == 0) { |
| 1052 // TODO(ahe): Improve error message. Need UX input. | 1056 // TODO(ahe): Improve error message. Need UX input. |
| 1053 error(node, MessageKind.GENERIC, ["is not an expression $element"]); | 1057 error(node, MessageKind.GENERIC, ["is not an expression $element"]); |
| 1054 } | 1058 } |
| 1055 } | 1059 } |
| 1056 return useElement(node, element); | 1060 return useElement(node, element); |
| 1057 } | 1061 } |
| 1058 } | 1062 } |
| 1059 | 1063 |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1286 } | 1290 } |
| 1287 target = currentClass.lookupSuperMember(name); | 1291 target = currentClass.lookupSuperMember(name); |
| 1288 // [target] may be null which means invoking noSuchMethod on | 1292 // [target] may be null which means invoking noSuchMethod on |
| 1289 // super. | 1293 // super. |
| 1290 } else if (Elements.isUnresolved(resolvedReceiver)) { | 1294 } else if (Elements.isUnresolved(resolvedReceiver)) { |
| 1291 return null; | 1295 return null; |
| 1292 } else if (resolvedReceiver.kind === ElementKind.CLASS) { | 1296 } else if (resolvedReceiver.kind === ElementKind.CLASS) { |
| 1293 ClassElement receiverClass = resolvedReceiver; | 1297 ClassElement receiverClass = resolvedReceiver; |
| 1294 target = receiverClass.ensureResolved(compiler).lookupLocalMember(name); | 1298 target = receiverClass.ensureResolved(compiler).lookupLocalMember(name); |
| 1295 if (target === null) { | 1299 if (target === null) { |
| 1300 // TODO(karlklose): this should be reported by the caller of |
| 1301 // [resolveSend] to select better warning messages for getters and |
| 1302 // setters. |
| 1296 return warnAndCreateErroneousElement(node, name, | 1303 return warnAndCreateErroneousElement(node, name, |
| 1297 MessageKind.METHOD_NOT_FOUND, | 1304 MessageKind.METHOD_NOT_FOUND, |
| 1298 [receiverClass.name, name]); | 1305 [receiverClass.name, name]); |
| 1299 } else if (target.isInstanceMember()) { | 1306 } else if (target.isInstanceMember()) { |
| 1300 error(node, MessageKind.MEMBER_NOT_STATIC, [receiverClass.name, name]); | 1307 error(node, MessageKind.MEMBER_NOT_STATIC, [receiverClass.name, name]); |
| 1301 } | 1308 } |
| 1302 } else if (resolvedReceiver.kind === ElementKind.PREFIX) { | 1309 } else if (resolvedReceiver.kind === ElementKind.PREFIX) { |
| 1303 PrefixElement prefix = resolvedReceiver; | 1310 PrefixElement prefix = resolvedReceiver; |
| 1304 target = prefix.lookupLocalMember(name); | 1311 target = prefix.lookupLocalMember(name); |
| 1305 if (target == null) { | 1312 if (target == null) { |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1389 } | 1396 } |
| 1390 } | 1397 } |
| 1391 } | 1398 } |
| 1392 | 1399 |
| 1393 visitSend(Send node) { | 1400 visitSend(Send node) { |
| 1394 Element target = resolveSend(node); | 1401 Element target = resolveSend(node); |
| 1395 if (!Elements.isUnresolved(target) | 1402 if (!Elements.isUnresolved(target) |
| 1396 && target.kind == ElementKind.ABSTRACT_FIELD) { | 1403 && target.kind == ElementKind.ABSTRACT_FIELD) { |
| 1397 AbstractFieldElement field = target; | 1404 AbstractFieldElement field = target; |
| 1398 target = field.getter; | 1405 target = field.getter; |
| 1399 if (Elements.isUnresolved(target) && !inInstanceContext) { | 1406 if (target == null && !inInstanceContext) { |
| 1400 error(node.selector, MessageKind.CANNOT_RESOLVE_GETTER); | 1407 target = |
| 1408 warnAndCreateErroneousElement(node.selector, field.name, |
| 1409 MessageKind.CANNOT_RESOLVE_GETTER, |
| 1410 [node.selector]); |
| 1401 } | 1411 } |
| 1402 } | 1412 } |
| 1403 | 1413 |
| 1404 bool resolvedArguments = false; | 1414 bool resolvedArguments = false; |
| 1405 if (node.isOperator) { | 1415 if (node.isOperator) { |
| 1406 String operatorString = node.selector.asOperator().source.stringValue; | 1416 String operatorString = node.selector.asOperator().source.stringValue; |
| 1407 if (operatorString === 'is' || operatorString === 'as') { | 1417 if (operatorString === 'is' || operatorString === 'as') { |
| 1408 assert(node.arguments.tail.isEmpty()); | 1418 assert(node.arguments.tail.isEmpty()); |
| 1409 DartType type = resolveTypeTest(node.arguments.head); | 1419 DartType type = resolveTypeTest(node.arguments.head); |
| 1410 if (type != null) { | 1420 if (type != null) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1453 Element setter = target; | 1463 Element setter = target; |
| 1454 Element getter = target; | 1464 Element getter = target; |
| 1455 String source = node.assignmentOperator.source.stringValue; | 1465 String source = node.assignmentOperator.source.stringValue; |
| 1456 bool isComplex = source !== '='; | 1466 bool isComplex = source !== '='; |
| 1457 if (!Elements.isUnresolved(target) | 1467 if (!Elements.isUnresolved(target) |
| 1458 && target.kind == ElementKind.ABSTRACT_FIELD) { | 1468 && target.kind == ElementKind.ABSTRACT_FIELD) { |
| 1459 AbstractFieldElement field = target; | 1469 AbstractFieldElement field = target; |
| 1460 setter = field.setter; | 1470 setter = field.setter; |
| 1461 getter = field.getter; | 1471 getter = field.getter; |
| 1462 if (setter == null && !inInstanceContext) { | 1472 if (setter == null && !inInstanceContext) { |
| 1463 error(node.selector, MessageKind.CANNOT_RESOLVE_SETTER); | 1473 setter = |
| 1474 warnAndCreateErroneousElement(node.selector, field.name, |
| 1475 MessageKind.CANNOT_RESOLVE_SETTER, |
| 1476 [node.selector]); |
| 1464 } | 1477 } |
| 1465 if (isComplex && getter == null && !inInstanceContext) { | 1478 if (isComplex && getter == null && !inInstanceContext) { |
| 1466 error(node.selector, MessageKind.CANNOT_RESOLVE_GETTER); | 1479 getter = |
| 1480 warnAndCreateErroneousElement(node.selector, field.name, |
| 1481 MessageKind.CANNOT_RESOLVE_GETTER, |
| 1482 [node.selector]); |
| 1467 } | 1483 } |
| 1468 } | 1484 } |
| 1469 | 1485 |
| 1470 visit(node.argumentsNode); | 1486 visit(node.argumentsNode); |
| 1471 | 1487 |
| 1472 // TODO(ngeoffray): Check if the target can be assigned. | 1488 // TODO(ngeoffray): Check if the target can be assigned. |
| 1473 // TODO(ngeoffray): Warn if target is null and the send is | 1489 // TODO(ngeoffray): Warn if target is null and the send is |
| 1474 // unqualified. | 1490 // unqualified. |
| 1475 | 1491 |
| 1476 Selector selector = mapping.getSelector(node); | 1492 Selector selector = mapping.getSelector(node); |
| (...skipping 1284 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2761 | 2777 |
| 2762 Element localLookup(SourceString name) => library.find(name); | 2778 Element localLookup(SourceString name) => library.find(name); |
| 2763 Element lookup(SourceString name) => localLookup(name); | 2779 Element lookup(SourceString name) => localLookup(name); |
| 2764 Element lexicalLookup(SourceString name) => localLookup(name); | 2780 Element lexicalLookup(SourceString name) => localLookup(name); |
| 2765 | 2781 |
| 2766 Element add(Element newElement) { | 2782 Element add(Element newElement) { |
| 2767 throw "Cannot add an element in the top scope"; | 2783 throw "Cannot add an element in the top scope"; |
| 2768 } | 2784 } |
| 2769 String toString() => '$element'; | 2785 String toString() => '$element'; |
| 2770 } | 2786 } |
| OLD | NEW |