Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(375)

Side by Side Diff: lib/compiler/implementation/resolver.dart

Issue 10920089: Generate a warning and a runtime error for calls to nonexistent static calls, getters and setters. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Remove case for variable == null in handling of ForIn. Created 8 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698