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 972 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 983 error(node, MessageKind.NO_INSTANCE_AVAILABLE, [node]); | 983 error(node, MessageKind.NO_INSTANCE_AVAILABLE, [node]); |
| 984 } | 984 } |
| 985 return result; | 985 return result; |
| 986 } | 986 } |
| 987 | 987 |
| 988 // Create, or reuse an already created, statement element for a statement. | 988 // Create, or reuse an already created, statement element for a statement. |
| 989 TargetElement getOrCreateTargetElement(Node statement) { | 989 TargetElement getOrCreateTargetElement(Node statement) { |
| 990 TargetElement element = mapping[statement]; | 990 TargetElement element = mapping[statement]; |
| 991 if (element === null) { | 991 if (element === null) { |
| 992 element = new TargetElement(statement, | 992 element = new TargetElement(statement, |
| 993 statementScope.nestingLevel, | 993 statementScope.nestingLevel, |
| 994 enclosingElement); | 994 enclosingElement); |
| 995 mapping[statement] = element; | 995 mapping[statement] = element; |
| 996 } | 996 } |
| 997 return element; | 997 return element; |
| 998 } | 998 } |
| 999 | 999 |
| 1000 inStaticContext(action()) { | 1000 inStaticContext(action()) { |
| 1001 bool wasInstanceContext = inInstanceContext; | 1001 bool wasInstanceContext = inInstanceContext; |
| 1002 inInstanceContext = false; | 1002 inInstanceContext = false; |
| 1003 var result = action(); | 1003 var result = action(); |
| 1004 inInstanceContext = wasInstanceContext; | 1004 inInstanceContext = wasInstanceContext; |
| 1005 return result; | 1005 return result; |
| 1006 } | 1006 } |
| 1007 | 1007 |
| 1008 visitInStaticContext(Node node) { | 1008 visitInStaticContext(Node node) { |
| 1009 inStaticContext(() => visit(node)); | 1009 inStaticContext(() => visit(node)); |
| 1010 } | 1010 } |
| 1011 | 1011 |
| 1012 ErroneousElement warnAndCreateErroneousElement(Node node, MessageKind kind) { | |
| 1013 ResolutionWarning warning = new ResolutionWarning(kind, [node]); | |
| 1014 compiler.reportWarning(node, warning); | |
| 1015 return new ErroneousElement(warning.message, enclosingElement); | |
| 1016 } | |
| 1017 | |
| 1012 Element visitIdentifier(Identifier node) { | 1018 Element visitIdentifier(Identifier node) { |
| 1013 if (node.isThis()) { | 1019 if (node.isThis()) { |
| 1014 if (!inInstanceContext) { | 1020 if (!inInstanceContext) { |
| 1015 error(node, MessageKind.NO_INSTANCE_AVAILABLE, [node]); | 1021 error(node, MessageKind.NO_INSTANCE_AVAILABLE, [node]); |
| 1016 } | 1022 } |
| 1017 return null; | 1023 return null; |
| 1018 } else if (node.isSuper()) { | 1024 } else if (node.isSuper()) { |
| 1019 if (!inInstanceContext) error(node, MessageKind.NO_SUPER_IN_STATIC); | 1025 if (!inInstanceContext) error(node, MessageKind.NO_SUPER_IN_STATIC); |
| 1020 if ((ElementCategory.SUPER & allowedCategory) == 0) { | 1026 if ((ElementCategory.SUPER & allowedCategory) == 0) { |
| 1021 error(node, MessageKind.INVALID_USE_OF_SUPER); | 1027 error(node, MessageKind.INVALID_USE_OF_SUPER); |
| 1022 } | 1028 } |
| 1023 return null; | 1029 return null; |
| 1024 } else { | 1030 } else { |
| 1025 Element element = lookup(node, node.source); | 1031 Element element = lookup(node, node.source); |
| 1026 if (element === null) { | 1032 if (element === null) { |
| 1027 if (!inInstanceContext) error(node, MessageKind.CANNOT_RESOLVE, [node]); | 1033 if (!inInstanceContext) { |
| 1034 element = | |
| 1035 warnAndCreateErroneousElement(node, MessageKind.CANNOT_RESOLVE); | |
| 1036 } | |
| 1028 } else { | 1037 } else { |
| 1029 if ((element.kind.category & allowedCategory) == 0) { | 1038 if ((element.kind.category & allowedCategory) == 0) { |
| 1030 // TODO(ahe): Improve error message. Need UX input. | 1039 // TODO(ahe): Improve error message. Need UX input. |
| 1031 error(node, MessageKind.GENERIC, ["is not an expression $element"]); | 1040 error(node, MessageKind.GENERIC, ["is not an expression $element"]); |
| 1032 } | 1041 } |
| 1033 } | 1042 } |
| 1034 return useElement(node, element); | 1043 return useElement(node, element); |
| 1035 } | 1044 } |
| 1036 } | 1045 } |
| 1037 | 1046 |
| (...skipping 291 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1329 } | 1338 } |
| 1330 } | 1339 } |
| 1331 } | 1340 } |
| 1332 | 1341 |
| 1333 visitSend(Send node) { | 1342 visitSend(Send node) { |
| 1334 Element target = resolveSend(node); | 1343 Element target = resolveSend(node); |
| 1335 if (!Element.isInvalid(target) | 1344 if (!Element.isInvalid(target) |
| 1336 && target.kind == ElementKind.ABSTRACT_FIELD) { | 1345 && target.kind == ElementKind.ABSTRACT_FIELD) { |
| 1337 AbstractFieldElement field = target; | 1346 AbstractFieldElement field = target; |
| 1338 target = field.getter; | 1347 target = field.getter; |
| 1339 if (Element.isInvalid(target) && !inInstanceContext) { | 1348 if (target == null && !inInstanceContext) { |
| 1340 // TODO(karlklose): make this a runtime error. | 1349 target = |
| 1341 error(node.selector, MessageKind.CANNOT_RESOLVE_GETTER); | 1350 warnAndCreateErroneousElement(node.selector, |
|
ngeoffray
2012/09/05 11:46:45
Move warnAndcreateErroneouselement one up, and put
karlklose
2012/09/05 14:53:42
This change is reverted.
| |
| 1351 MessageKind.CANNOT_RESOLVE_GETTER); | |
| 1342 } | 1352 } |
| 1343 } | 1353 } |
| 1344 | 1354 |
| 1345 bool resolvedArguments = false; | 1355 bool resolvedArguments = false; |
| 1346 if (node.isOperator) { | 1356 if (node.isOperator) { |
| 1347 String operatorString = node.selector.asOperator().source.stringValue; | 1357 String operatorString = node.selector.asOperator().source.stringValue; |
| 1348 if (operatorString === 'is' || operatorString === 'as') { | 1358 if (operatorString === 'is' || operatorString === 'as') { |
| 1349 assert(node.arguments.tail.isEmpty()); | 1359 assert(node.arguments.tail.isEmpty()); |
| 1350 resolveTypeTest(node.arguments.head); | 1360 resolveTypeTest(node.arguments.head); |
| 1351 resolvedArguments = true; | 1361 resolvedArguments = true; |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1395 registerSend(selector, target); | 1405 registerSend(selector, target); |
| 1396 return node.isPropertyAccess ? target : null; | 1406 return node.isPropertyAccess ? target : null; |
| 1397 } | 1407 } |
| 1398 | 1408 |
| 1399 visitSendSet(SendSet node) { | 1409 visitSendSet(SendSet node) { |
| 1400 Element target = resolveSend(node); | 1410 Element target = resolveSend(node); |
| 1401 Element setter = target; | 1411 Element setter = target; |
| 1402 Element getter = target; | 1412 Element getter = target; |
| 1403 String source = node.assignmentOperator.source.stringValue; | 1413 String source = node.assignmentOperator.source.stringValue; |
| 1404 bool isComplex = source !== '='; | 1414 bool isComplex = source !== '='; |
| 1405 if (target != null && target.kind == ElementKind.ABSTRACT_FIELD) { | 1415 if (!Element.isInvalid(target) |
| 1416 && target.kind == ElementKind.ABSTRACT_FIELD) { | |
| 1406 AbstractFieldElement field = target; | 1417 AbstractFieldElement field = target; |
| 1407 setter = field.setter; | 1418 setter = field.setter; |
| 1408 getter = field.getter; | 1419 getter = field.getter; |
| 1409 if (Element.isInvalid(setter) && !inInstanceContext) { | 1420 if (setter == null && !inInstanceContext) { |
| 1410 // TODO(karlklose): make this a runtime error. | 1421 setter = |
| 1411 error(node.selector, MessageKind.CANNOT_RESOLVE_SETTER); | 1422 warnAndCreateErroneousElement(node.selector, |
| 1423 MessageKind.CANNOT_RESOLVE_GETTER); | |
|
ngeoffray
2012/09/05 11:46:45
ditto
karlklose
2012/09/05 14:53:42
ditto.
| |
| 1412 } | 1424 } |
| 1413 if (isComplex && Element.isInvalid(getter) && !inInstanceContext) { | 1425 if (isComplex && getter == null && !inInstanceContext) { |
| 1414 // TODO(karlklose): make this a runtime error. | 1426 getter = |
| 1415 error(node.selector, MessageKind.CANNOT_RESOLVE_GETTER); | 1427 warnAndCreateErroneousElement(node.selector, |
| 1428 MessageKind.CANNOT_RESOLVE_GETTER); | |
| 1416 } | 1429 } |
| 1417 } | 1430 } |
| 1418 | 1431 |
| 1419 visit(node.argumentsNode); | 1432 visit(node.argumentsNode); |
| 1420 | 1433 |
| 1421 // TODO(ngeoffray): Check if the target can be assigned. | 1434 // TODO(ngeoffray): Check if the target can be assigned. |
| 1422 // TODO(ngeoffray): Warn if target is null and the send is | 1435 // TODO(ngeoffray): Warn if target is null and the send is |
| 1423 // unqualified. | 1436 // unqualified. |
| 1424 | 1437 |
| 1425 Selector selector = mapping.getSelector(node); | 1438 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); | 2679 TopScope(LibraryElement library) : super(null, library); |
| 2667 Element lookup(SourceString name) { | 2680 Element lookup(SourceString name) { |
| 2668 return library.find(name); | 2681 return library.find(name); |
| 2669 } | 2682 } |
| 2670 | 2683 |
| 2671 Element add(Element newElement) { | 2684 Element add(Element newElement) { |
| 2672 throw "Cannot add an element in the top scope"; | 2685 throw "Cannot add an element in the top scope"; |
| 2673 } | 2686 } |
| 2674 String toString() => '$element'; | 2687 String toString() => '$element'; |
| 2675 } | 2688 } |
| OLD | NEW |