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

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: 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 1006 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698