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 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 to select | |
|
ngeoffray
2012/09/13 09:18:30
the caller of [resolveSend] ...
karlklose
2012/09/13 12:00:43
Done.
| |
| 1301 // better warning messages for getters and setters. | |
| 1296 return warnAndCreateErroneousElement(node, name, | 1302 return warnAndCreateErroneousElement(node, name, |
| 1297 MessageKind.METHOD_NOT_FOUND, | 1303 MessageKind.METHOD_NOT_FOUND, |
| 1298 [receiverClass.name, name]); | 1304 [receiverClass.name, name]); |
| 1299 } else if (target.isInstanceMember()) { | 1305 } else if (target.isInstanceMember()) { |
| 1300 error(node, MessageKind.MEMBER_NOT_STATIC, [receiverClass.name, name]); | 1306 error(node, MessageKind.MEMBER_NOT_STATIC, [receiverClass.name, name]); |
| 1301 } | 1307 } |
| 1302 } else if (resolvedReceiver.kind === ElementKind.PREFIX) { | 1308 } else if (resolvedReceiver.kind === ElementKind.PREFIX) { |
| 1303 PrefixElement prefix = resolvedReceiver; | 1309 PrefixElement prefix = resolvedReceiver; |
| 1304 target = prefix.lookupLocalMember(name); | 1310 target = prefix.lookupLocalMember(name); |
| 1305 if (target == null) { | 1311 if (target == null) { |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1389 } | 1395 } |
| 1390 } | 1396 } |
| 1391 } | 1397 } |
| 1392 | 1398 |
| 1393 visitSend(Send node) { | 1399 visitSend(Send node) { |
| 1394 Element target = resolveSend(node); | 1400 Element target = resolveSend(node); |
| 1395 if (!Elements.isUnresolved(target) | 1401 if (!Elements.isUnresolved(target) |
| 1396 && target.kind == ElementKind.ABSTRACT_FIELD) { | 1402 && target.kind == ElementKind.ABSTRACT_FIELD) { |
| 1397 AbstractFieldElement field = target; | 1403 AbstractFieldElement field = target; |
| 1398 target = field.getter; | 1404 target = field.getter; |
| 1399 if (Elements.isUnresolved(target) && !inInstanceContext) { | 1405 if (target == null && !inInstanceContext) { |
| 1400 error(node.selector, MessageKind.CANNOT_RESOLVE_GETTER); | 1406 target = |
| 1407 warnAndCreateErroneousElement(node.selector, field.name, | |
| 1408 MessageKind.CANNOT_RESOLVE_GETTER, | |
| 1409 [node.selector]); | |
| 1401 } | 1410 } |
| 1402 } | 1411 } |
| 1403 | 1412 |
| 1404 bool resolvedArguments = false; | 1413 bool resolvedArguments = false; |
| 1405 if (node.isOperator) { | 1414 if (node.isOperator) { |
| 1406 String operatorString = node.selector.asOperator().source.stringValue; | 1415 String operatorString = node.selector.asOperator().source.stringValue; |
| 1407 if (operatorString === 'is' || operatorString === 'as') { | 1416 if (operatorString === 'is' || operatorString === 'as') { |
| 1408 assert(node.arguments.tail.isEmpty()); | 1417 assert(node.arguments.tail.isEmpty()); |
| 1409 DartType type = resolveTypeTest(node.arguments.head); | 1418 DartType type = resolveTypeTest(node.arguments.head); |
| 1410 if (type != null) { | 1419 if (type != null) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1453 Element setter = target; | 1462 Element setter = target; |
| 1454 Element getter = target; | 1463 Element getter = target; |
| 1455 String source = node.assignmentOperator.source.stringValue; | 1464 String source = node.assignmentOperator.source.stringValue; |
| 1456 bool isComplex = source !== '='; | 1465 bool isComplex = source !== '='; |
| 1457 if (!Elements.isUnresolved(target) | 1466 if (!Elements.isUnresolved(target) |
| 1458 && target.kind == ElementKind.ABSTRACT_FIELD) { | 1467 && target.kind == ElementKind.ABSTRACT_FIELD) { |
| 1459 AbstractFieldElement field = target; | 1468 AbstractFieldElement field = target; |
| 1460 setter = field.setter; | 1469 setter = field.setter; |
| 1461 getter = field.getter; | 1470 getter = field.getter; |
| 1462 if (setter == null && !inInstanceContext) { | 1471 if (setter == null && !inInstanceContext) { |
| 1463 error(node.selector, MessageKind.CANNOT_RESOLVE_SETTER); | 1472 setter = |
| 1473 warnAndCreateErroneousElement(node.selector, field.name, | |
| 1474 MessageKind.CANNOT_RESOLVE_SETTER, | |
| 1475 [node.selector]); | |
| 1464 } | 1476 } |
| 1465 if (isComplex && getter == null && !inInstanceContext) { | 1477 if (isComplex && getter == null && !inInstanceContext) { |
| 1466 error(node.selector, MessageKind.CANNOT_RESOLVE_GETTER); | 1478 getter = |
| 1479 warnAndCreateErroneousElement(node.selector, field.name, | |
| 1480 MessageKind.CANNOT_RESOLVE_GETTER, | |
| 1481 [node.selector]); | |
| 1467 } | 1482 } |
| 1468 } | 1483 } |
| 1469 | 1484 |
| 1470 visit(node.argumentsNode); | 1485 visit(node.argumentsNode); |
| 1471 | 1486 |
| 1472 // TODO(ngeoffray): Check if the target can be assigned. | 1487 // TODO(ngeoffray): Check if the target can be assigned. |
| 1473 // TODO(ngeoffray): Warn if target is null and the send is | 1488 // TODO(ngeoffray): Warn if target is null and the send is |
| 1474 // unqualified. | 1489 // unqualified. |
| 1475 | 1490 |
| 1476 Selector selector = mapping.getSelector(node); | 1491 Selector selector = mapping.getSelector(node); |
| (...skipping 1286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2763 | 2778 |
| 2764 Element localLookup(SourceString name) => library.find(name); | 2779 Element localLookup(SourceString name) => library.find(name); |
| 2765 Element lookup(SourceString name) => localLookup(name); | 2780 Element lookup(SourceString name) => localLookup(name); |
| 2766 Element lexicalLookup(SourceString name) => localLookup(name); | 2781 Element lexicalLookup(SourceString name) => localLookup(name); |
| 2767 | 2782 |
| 2768 Element add(Element newElement) { | 2783 Element add(Element newElement) { |
| 2769 throw "Cannot add an element in the top scope"; | 2784 throw "Cannot add an element in the top scope"; |
| 2770 } | 2785 } |
| 2771 String toString() => '$element'; | 2786 String toString() => '$element'; |
| 2772 } | 2787 } |
| OLD | NEW |