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

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

Issue 10905062: Fix issue 4361 by checking in the resolver if the getter/setter exists. (Closed) Base URL: http://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
« no previous file with comments | « no previous file | lib/compiler/implementation/warnings.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 } 9 }
10 10
(...skipping 1311 matching lines...) Expand 10 before | Expand all | Expand 10 after
1322 } 1322 }
1323 } 1323 }
1324 } 1324 }
1325 1325
1326 visitSend(Send node) { 1326 visitSend(Send node) {
1327 Element target = resolveSend(node); 1327 Element target = resolveSend(node);
1328 if (!Element.isInvalid(target) 1328 if (!Element.isInvalid(target)
1329 && target.kind == ElementKind.ABSTRACT_FIELD) { 1329 && target.kind == ElementKind.ABSTRACT_FIELD) {
1330 AbstractFieldElement field = target; 1330 AbstractFieldElement field = target;
1331 target = field.getter; 1331 target = field.getter;
1332 if (Element.isInvalid(target) && !inInstanceContext) {
1333 // TODO(karlklose): make this a runtime error.
1334 error(node.selector, MessageKind.CANNOT_RESOLVE_GETTER);
1335 }
1332 } 1336 }
1333 1337
1334 bool resolvedArguments = false; 1338 bool resolvedArguments = false;
1335 if (node.isOperator) { 1339 if (node.isOperator) {
1336 String operatorString = node.selector.asOperator().source.stringValue; 1340 String operatorString = node.selector.asOperator().source.stringValue;
1337 if (operatorString === 'is' || operatorString === 'as') { 1341 if (operatorString === 'is' || operatorString === 'as') {
1338 assert(node.arguments.tail.isEmpty()); 1342 assert(node.arguments.tail.isEmpty());
1339 resolveTypeTest(node.arguments.head); 1343 resolveTypeTest(node.arguments.head);
1340 resolvedArguments = true; 1344 resolvedArguments = true;
1341 } else if (operatorString === '?') { 1345 } else if (operatorString === '?') {
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1383 // unqualified. 1387 // unqualified.
1384 useElement(node, target); 1388 useElement(node, target);
1385 registerSend(selector, target); 1389 registerSend(selector, target);
1386 return node.isPropertyAccess ? target : null; 1390 return node.isPropertyAccess ? target : null;
1387 } 1391 }
1388 1392
1389 visitSendSet(SendSet node) { 1393 visitSendSet(SendSet node) {
1390 Element target = resolveSend(node); 1394 Element target = resolveSend(node);
1391 Element setter = target; 1395 Element setter = target;
1392 Element getter = target; 1396 Element getter = target;
1397 String source = node.assignmentOperator.source.stringValue;
1398 bool isComplex = source !== '=';
1393 if (target != null && target.kind == ElementKind.ABSTRACT_FIELD) { 1399 if (target != null && target.kind == ElementKind.ABSTRACT_FIELD) {
1394 AbstractFieldElement field = target; 1400 AbstractFieldElement field = target;
1395 setter = field.setter; 1401 setter = field.setter;
1396 getter = field.getter; 1402 getter = field.getter;
1403 if (Element.isInvalid(setter) && !inInstanceContext) {
1404 // TODO(karlklose): make this a runtime error.
1405 error(node.selector, MessageKind.CANNOT_RESOLVE_SETTER);
1406 }
1407 if (isComplex && Element.isInvalid(getter) && !inInstanceContext) {
1408 // TODO(karlklose): make this a runtime error.
1409 error(node.selector, MessageKind.CANNOT_RESOLVE_GETTER);
1410 }
1397 } 1411 }
1398 1412
1399 visit(node.argumentsNode); 1413 visit(node.argumentsNode);
1400 1414
1401 // TODO(ngeoffray): Check if the target can be assigned. 1415 // TODO(ngeoffray): Check if the target can be assigned.
1402 // TODO(ngeoffray): Warn if target is null and the send is 1416 // TODO(ngeoffray): Warn if target is null and the send is
1403 // unqualified. 1417 // unqualified.
1404 1418
1405 Selector selector = mapping.getSelector(node); 1419 Selector selector = mapping.getSelector(node);
1406 String source = node.assignmentOperator.source.stringValue;
1407 bool isComplex = source !== '=';
1408 if (isComplex) { 1420 if (isComplex) {
1409 if (selector.isSetter()) { 1421 if (selector.isSetter()) {
1410 // TODO(kasperl): We're registering the getter selector for 1422 // TODO(kasperl): We're registering the getter selector for
1411 // compound assignments on the AST selector node. In the code 1423 // compound assignments on the AST selector node. In the code
1412 // generator, we then fetch it from there when generating the 1424 // generator, we then fetch it from there when generating the
1413 // getter for a SendSet node. 1425 // getter for a SendSet node.
1414 Selector getterSelector = new Selector.getterFrom(selector); 1426 Selector getterSelector = new Selector.getterFrom(selector);
1415 registerSend(getterSelector, getter); 1427 registerSend(getterSelector, getter);
1416 mapping.setSelector(node.selector, getterSelector); 1428 mapping.setSelector(node.selector, getterSelector);
1417 useElement(node.selector, getter); 1429 useElement(node.selector, getter);
(...skipping 1219 matching lines...) Expand 10 before | Expand all | Expand 10 after
2637 TopScope(LibraryElement library) : super(null, library); 2649 TopScope(LibraryElement library) : super(null, library);
2638 Element lookup(SourceString name) { 2650 Element lookup(SourceString name) {
2639 return library.find(name); 2651 return library.find(name);
2640 } 2652 }
2641 2653
2642 Element add(Element newElement) { 2654 Element add(Element newElement) {
2643 throw "Cannot add an element in the top scope"; 2655 throw "Cannot add an element in the top scope";
2644 } 2656 }
2645 String toString() => '$element'; 2657 String toString() => '$element';
2646 } 2658 }
OLDNEW
« no previous file with comments | « no previous file | lib/compiler/implementation/warnings.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698