| 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 } | 9 } |
| 10 | 10 |
| (...skipping 1311 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |