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 library dart2js.resolution.members; | 5 library dart2js.resolution.members; |
6 | 6 |
7 import '../common/names.dart' show | 7 import '../common/names.dart' show |
8 Selectors; | 8 Selectors; |
9 import '../compiler.dart' show | 9 import '../compiler.dart' show |
10 Compiler; | 10 Compiler; |
(...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 compiler.resolver.constantCompiler.compileConstant(parameter); | 492 compiler.resolver.constantCompiler.compileConstant(parameter); |
493 }); | 493 }); |
494 }); | 494 }); |
495 if (inCheckContext) { | 495 if (inCheckContext) { |
496 functionParameters.forEachParameter((ParameterElement element) { | 496 functionParameters.forEachParameter((ParameterElement element) { |
497 registry.registerIsCheck(element.type); | 497 registry.registerIsCheck(element.type); |
498 }); | 498 }); |
499 } | 499 } |
500 } | 500 } |
501 | 501 |
| 502 ResolutionResult visitAssert(Assert node) { |
| 503 registry.registerAssert(node.hasMessage); |
| 504 visit(node.condition); |
| 505 visit(node.message); |
| 506 return const NoneResult(); |
| 507 } |
| 508 |
502 ResolutionResult visitCascade(Cascade node) { | 509 ResolutionResult visitCascade(Cascade node) { |
503 visit(node.expression); | 510 visit(node.expression); |
504 return const NoneResult(); | 511 return const NoneResult(); |
505 } | 512 } |
506 | 513 |
507 ResolutionResult visitCascadeReceiver(CascadeReceiver node) { | 514 ResolutionResult visitCascadeReceiver(CascadeReceiver node) { |
508 visit(node.expression); | 515 visit(node.expression); |
509 return const NoneResult(); | 516 return const NoneResult(); |
510 } | 517 } |
511 | 518 |
(...skipping 1007 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1519 Selector selector = callStructure.callSelector; | 1526 Selector selector = callStructure.callSelector; |
1520 // TODO(23998): Remove this when all information goes through the | 1527 // TODO(23998): Remove this when all information goes through the |
1521 // [SendStructure]. | 1528 // [SendStructure]. |
1522 registry.setSelector(node, selector); | 1529 registry.setSelector(node, selector); |
1523 registry.registerDynamicInvocation(new UniverseSelector(selector, null)); | 1530 registry.registerDynamicInvocation(new UniverseSelector(selector, null)); |
1524 registry.registerSendStructure(node, | 1531 registry.registerSendStructure(node, |
1525 new InvokeStructure(const DynamicAccess.expression(), selector)); | 1532 new InvokeStructure(const DynamicAccess.expression(), selector)); |
1526 return const NoneResult(); | 1533 return const NoneResult(); |
1527 } | 1534 } |
1528 | 1535 |
1529 /// Handle a, possibly invalid, assertion, like `assert(cond)` or `assert()`. | |
1530 ResolutionResult handleAssert(Send node) { | |
1531 assert(invariant(node, node.isCall, | |
1532 message: "Unexpected assert: $node")); | |
1533 // If this send is of the form "assert(expr);", then | |
1534 // this is an assertion. | |
1535 | |
1536 CallStructure callStructure = | |
1537 resolveArguments(node.argumentsNode).callStructure; | |
1538 SendStructure sendStructure = const AssertStructure(); | |
1539 if (callStructure.argumentCount != 1) { | |
1540 compiler.reportError( | |
1541 node.selector, | |
1542 MessageKind.WRONG_NUMBER_OF_ARGUMENTS_FOR_ASSERT, | |
1543 {'argumentCount': callStructure.argumentCount}); | |
1544 sendStructure = const InvalidAssertStructure(); | |
1545 } else if (callStructure.namedArgumentCount != 0) { | |
1546 compiler.reportError( | |
1547 node.selector, | |
1548 MessageKind.ASSERT_IS_GIVEN_NAMED_ARGUMENTS, | |
1549 {'argumentCount': callStructure.namedArgumentCount}); | |
1550 sendStructure = const InvalidAssertStructure(); | |
1551 } | |
1552 registry.registerAssert(node); | |
1553 registry.registerSendStructure(node, sendStructure); | |
1554 return const AssertResult(); | |
1555 } | |
1556 | |
1557 /// Handle access of a property of [name] on `this`, like `this.name` and | 1536 /// Handle access of a property of [name] on `this`, like `this.name` and |
1558 /// `this.name()`, or `name` and `name()` in instance context. | 1537 /// `this.name()`, or `name` and `name()` in instance context. |
1559 ResolutionResult handleThisPropertyAccess(Send node, Name name) { | 1538 ResolutionResult handleThisPropertyAccess(Send node, Name name) { |
1560 AccessSemantics semantics = new DynamicAccess.thisProperty(name); | 1539 AccessSemantics semantics = new DynamicAccess.thisProperty(name); |
1561 return handleDynamicAccessSemantics(node, name, semantics); | 1540 return handleDynamicAccessSemantics(node, name, semantics); |
1562 } | 1541 } |
1563 | 1542 |
1564 /// Handle update of a property of [name] on `this`, like `this.name = b` and | 1543 /// Handle update of a property of [name] on `this`, like `this.name = b` and |
1565 /// `this.name++`, or `name = b` and `name++` in instance context. | 1544 /// `this.name++`, or `name = b` and `name++` in instance context. |
1566 ResolutionResult handleThisPropertyUpdate( | 1545 ResolutionResult handleThisPropertyUpdate( |
(...skipping 1453 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3020 | 2999 |
3021 /// Handle an unqualified [Send], that is where the `node.receiver` is null, | 3000 /// Handle an unqualified [Send], that is where the `node.receiver` is null, |
3022 /// like `a`, `a()`, `this()`, `assert()`, and `(){}()`. | 3001 /// like `a`, `a()`, `this()`, `assert()`, and `(){}()`. |
3023 ResolutionResult handleUnqualifiedSend(Send node) { | 3002 ResolutionResult handleUnqualifiedSend(Send node) { |
3024 Identifier selector = node.selector.asIdentifier(); | 3003 Identifier selector = node.selector.asIdentifier(); |
3025 if (selector == null) { | 3004 if (selector == null) { |
3026 // `(){}()` and `(foo)()`. | 3005 // `(){}()` and `(foo)()`. |
3027 return handleExpressionInvoke(node); | 3006 return handleExpressionInvoke(node); |
3028 } | 3007 } |
3029 String text = selector.source; | 3008 String text = selector.source; |
3030 if (text == 'assert') { | 3009 if (text == 'this') { |
3031 // `assert()`. | |
3032 return handleAssert(node); | |
3033 } else if (text == 'this') { | |
3034 // `this()`. | 3010 // `this()`. |
3035 return handleThisAccess(node); | 3011 return handleThisAccess(node); |
3036 } | 3012 } |
3037 // `name` or `name()` | 3013 // `name` or `name()` |
3038 Name name = new Name(text, enclosingElement.library); | 3014 Name name = new Name(text, enclosingElement.library); |
3039 Element element = lookupInScope(compiler, node, scope, text); | 3015 Element element = lookupInScope(compiler, node, scope, text); |
3040 if (element == null) { | 3016 if (element == null) { |
3041 if (text == 'dynamic') { | 3017 if (text == 'dynamic') { |
3042 // `dynamic` or `dynamic()` where 'dynamic' is not declared in the | 3018 // `dynamic` or `dynamic()` where 'dynamic' is not declared in the |
3043 // current scope. | 3019 // current scope. |
(...skipping 1604 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4648 } | 4624 } |
4649 return const NoneResult(); | 4625 return const NoneResult(); |
4650 } | 4626 } |
4651 } | 4627 } |
4652 | 4628 |
4653 /// Looks up [name] in [scope] and unwraps the result. | 4629 /// Looks up [name] in [scope] and unwraps the result. |
4654 Element lookupInScope(Compiler compiler, Node node, | 4630 Element lookupInScope(Compiler compiler, Node node, |
4655 Scope scope, String name) { | 4631 Scope scope, String name) { |
4656 return Elements.unwrap(scope.lookup(name), compiler, node); | 4632 return Elements.unwrap(scope.lookup(name), compiler, node); |
4657 } | 4633 } |
OLD | NEW |