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 interface TreeElements { | 5 interface 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 1006 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1017 return null; | 1017 return null; |
| 1018 } else if (node.isSuper()) { | 1018 } else if (node.isSuper()) { |
| 1019 if (!inInstanceContext) error(node, MessageKind.NO_SUPER_IN_STATIC); | 1019 if (!inInstanceContext) error(node, MessageKind.NO_SUPER_IN_STATIC); |
| 1020 if ((ElementCategory.SUPER & allowedCategory) == 0) { | 1020 if ((ElementCategory.SUPER & allowedCategory) == 0) { |
| 1021 error(node, MessageKind.INVALID_USE_OF_SUPER); | 1021 error(node, MessageKind.INVALID_USE_OF_SUPER); |
| 1022 } | 1022 } |
| 1023 return null; | 1023 return null; |
| 1024 } else { | 1024 } else { |
| 1025 Element element = lookup(node, node.source); | 1025 Element element = lookup(node, node.source); |
| 1026 if (element === null) { | 1026 if (element === null) { |
| 1027 if (!inInstanceContext) error(node, MessageKind.CANNOT_RESOLVE, [node]); | 1027 if (!inInstanceContext) { |
| 1028 ResolutionWarning warning = | |
| 1029 new ResolutionWarning(MessageKind.CANNOT_RESOLVE, [node]); | |
| 1030 compiler.reportWarning(node, warning); | |
| 1031 element = new ErroneousElement(warning.message, enclosingElement); | |
| 1032 } | |
| 1028 } else { | 1033 } else { |
| 1029 if ((element.kind.category & allowedCategory) == 0) { | 1034 if ((element.kind.category & allowedCategory) == 0) { |
| 1030 // TODO(ahe): Improve error message. Need UX input. | 1035 // TODO(ahe): Improve error message. Need UX input. |
| 1031 error(node, MessageKind.GENERIC, ["is not an expression $element"]); | 1036 error(node, MessageKind.GENERIC, ["is not an expression $element"]); |
| 1032 } | 1037 } |
| 1033 } | 1038 } |
| 1034 return useElement(node, element); | 1039 return useElement(node, element); |
| 1035 } | 1040 } |
| 1036 } | 1041 } |
| 1037 | 1042 |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1329 } | 1334 } |
| 1330 } | 1335 } |
| 1331 } | 1336 } |
| 1332 | 1337 |
| 1333 visitSend(Send node) { | 1338 visitSend(Send node) { |
| 1334 Element target = resolveSend(node); | 1339 Element target = resolveSend(node); |
| 1335 if (!Element.isInvalid(target) | 1340 if (!Element.isInvalid(target) |
| 1336 && target.kind == ElementKind.ABSTRACT_FIELD) { | 1341 && target.kind == ElementKind.ABSTRACT_FIELD) { |
| 1337 AbstractFieldElement field = target; | 1342 AbstractFieldElement field = target; |
| 1338 target = field.getter; | 1343 target = field.getter; |
| 1339 if (Element.isInvalid(target) && !inInstanceContext) { | 1344 if (target == null && !inInstanceContext) { |
| 1340 // TODO(karlklose): make this a runtime error. | 1345 ResolutionWarning warning = |
| 1341 error(node.selector, MessageKind.CANNOT_RESOLVE_GETTER); | 1346 new ResolutionWarning(MessageKind.CANNOT_RESOLVE_GETTER, |
| 1347 [node.selector]); | |
| 1348 compiler.reportWarning(node.selector, warning); | |
| 1349 target = new ErroneousElement(warning.message, enclosingElement); | |
| 1342 } | 1350 } |
| 1343 } | 1351 } |
| 1344 | 1352 |
| 1345 bool resolvedArguments = false; | 1353 bool resolvedArguments = false; |
| 1346 if (node.isOperator) { | 1354 if (node.isOperator) { |
| 1347 String operatorString = node.selector.asOperator().source.stringValue; | 1355 String operatorString = node.selector.asOperator().source.stringValue; |
| 1348 if (operatorString === 'is' || operatorString === 'as') { | 1356 if (operatorString === 'is' || operatorString === 'as') { |
| 1349 assert(node.arguments.tail.isEmpty()); | 1357 assert(node.arguments.tail.isEmpty()); |
| 1350 resolveTypeTest(node.arguments.head); | 1358 resolveTypeTest(node.arguments.head); |
| 1351 resolvedArguments = true; | 1359 resolvedArguments = true; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1395 registerSend(selector, target); | 1403 registerSend(selector, target); |
| 1396 return node.isPropertyAccess ? target : null; | 1404 return node.isPropertyAccess ? target : null; |
| 1397 } | 1405 } |
| 1398 | 1406 |
| 1399 visitSendSet(SendSet node) { | 1407 visitSendSet(SendSet node) { |
| 1400 Element target = resolveSend(node); | 1408 Element target = resolveSend(node); |
| 1401 Element setter = target; | 1409 Element setter = target; |
| 1402 Element getter = target; | 1410 Element getter = target; |
| 1403 String source = node.assignmentOperator.source.stringValue; | 1411 String source = node.assignmentOperator.source.stringValue; |
| 1404 bool isComplex = source !== '='; | 1412 bool isComplex = source !== '='; |
| 1405 if (target != null && target.kind == ElementKind.ABSTRACT_FIELD) { | 1413 if (!Element.isInvalid(target) |
| 1414 && target.kind == ElementKind.ABSTRACT_FIELD) { | |
| 1406 AbstractFieldElement field = target; | 1415 AbstractFieldElement field = target; |
| 1407 setter = field.setter; | 1416 setter = field.setter; |
| 1408 getter = field.getter; | 1417 getter = field.getter; |
| 1409 if (Element.isInvalid(setter) && !inInstanceContext) { | 1418 if (setter == null && !inInstanceContext) { |
| 1410 // TODO(karlklose): make this a runtime error. | 1419 ResolutionWarning warning = |
|
kasperl
2012/09/05 09:29:45
This looks ripe for refactoring. Couldn't we share
karlklose
2012/09/05 11:10:47
Done.
| |
| 1411 error(node.selector, MessageKind.CANNOT_RESOLVE_SETTER); | 1420 new ResolutionWarning(MessageKind.CANNOT_RESOLVE_GETTER, |
| 1421 [node.selector]); | |
| 1422 compiler.reportWarning(node.selector, warning); | |
| 1423 setter = new ErroneousElement(warning.message, enclosingElement); | |
| 1412 } | 1424 } |
| 1413 if (isComplex && Element.isInvalid(getter) && !inInstanceContext) { | 1425 if (isComplex && getter == null && !inInstanceContext) { |
| 1414 // TODO(karlklose): make this a runtime error. | 1426 ResolutionWarning warning = |
| 1415 error(node.selector, MessageKind.CANNOT_RESOLVE_GETTER); | 1427 new ResolutionWarning(MessageKind.CANNOT_RESOLVE_GETTER, |
| 1428 [node.selector]); | |
| 1429 compiler.reportWarning(node.selector, warning); | |
| 1430 getter = new ErroneousElement(warning.message, enclosingElement); | |
| 1416 } | 1431 } |
| 1417 } | 1432 } |
| 1418 | 1433 |
| 1419 visit(node.argumentsNode); | 1434 visit(node.argumentsNode); |
| 1420 | 1435 |
| 1421 // TODO(ngeoffray): Check if the target can be assigned. | 1436 // TODO(ngeoffray): Check if the target can be assigned. |
| 1422 // TODO(ngeoffray): Warn if target is null and the send is | 1437 // TODO(ngeoffray): Warn if target is null and the send is |
| 1423 // unqualified. | 1438 // unqualified. |
| 1424 | 1439 |
| 1425 Selector selector = mapping.getSelector(node); | 1440 Selector selector = mapping.getSelector(node); |
| (...skipping 1240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2666 TopScope(LibraryElement library) : super(null, library); | 2681 TopScope(LibraryElement library) : super(null, library); |
| 2667 Element lookup(SourceString name) { | 2682 Element lookup(SourceString name) { |
| 2668 return library.find(name); | 2683 return library.find(name); |
| 2669 } | 2684 } |
| 2670 | 2685 |
| 2671 Element add(Element newElement) { | 2686 Element add(Element newElement) { |
| 2672 throw "Cannot add an element in the top scope"; | 2687 throw "Cannot add an element in the top scope"; |
| 2673 } | 2688 } |
| 2674 String toString() => '$element'; | 2689 String toString() => '$element'; |
| 2675 } | 2690 } |
| OLD | NEW |