| 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 part of resolution; | 5 part of resolution; |
| 6 | 6 |
| 7 abstract class TreeElements { | 7 abstract class TreeElements { |
| 8 AnalyzableElement get analyzedElement; | 8 AnalyzableElement get analyzedElement; |
| 9 Iterable<Node> get superUses; | 9 Iterable<Node> get superUses; |
| 10 | 10 |
| (...skipping 2850 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2861 // Potentially a 'dynamic' type literal. | 2861 // Potentially a 'dynamic' type literal. |
| 2862 type = registry.getType(node.selector); | 2862 type = registry.getType(node.selector); |
| 2863 } | 2863 } |
| 2864 if (type == null) { | 2864 if (type == null) { |
| 2865 type = target.computeType(compiler); | 2865 type = target.computeType(compiler); |
| 2866 } | 2866 } |
| 2867 registry.registerTypeLiteral(node, type); | 2867 registry.registerTypeLiteral(node, type); |
| 2868 | 2868 |
| 2869 // Don't try to make constants of calls to type literals. | 2869 // Don't try to make constants of calls to type literals. |
| 2870 if (!node.isCall) { | 2870 if (!node.isCall) { |
| 2871 analyzeConstantDeferred(node); | 2871 analyzeConstantDeferred(node, enforceConst: false); |
| 2872 } else { | 2872 } else { |
| 2873 // The node itself is not a constant but we register the selector (the | 2873 // The node itself is not a constant but we register the selector (the |
| 2874 // identifier that refers to the class/typedef) as a constant. | 2874 // identifier that refers to the class/typedef) as a constant. |
| 2875 if (node.receiver != null) { | 2875 if (node.receiver != null) { |
| 2876 // This is a hack for the case of prefix.Type, we need to store | 2876 // This is a hack for the case of prefix.Type, we need to store |
| 2877 // the element on the selector, so [analyzeConstant] can build | 2877 // the element on the selector, so [analyzeConstant] can build |
| 2878 // the type literal from the selector. | 2878 // the type literal from the selector. |
| 2879 registry.useElement(node.selector, target); | 2879 registry.useElement(node.selector, target); |
| 2880 } | 2880 } |
| 2881 analyzeConstantDeferred(node.selector); | 2881 analyzeConstantDeferred(node.selector, enforceConst: false); |
| 2882 } | 2882 } |
| 2883 } | 2883 } |
| 2884 if (isPotentiallyMutableTarget(target)) { | 2884 if (isPotentiallyMutableTarget(target)) { |
| 2885 if (enclosingElement != target.enclosingElement) { | 2885 if (enclosingElement != target.enclosingElement) { |
| 2886 for (Node scope in promotionScope) { | 2886 for (Node scope in promotionScope) { |
| 2887 registry.setAccessedByClosureIn(scope, target, node); | 2887 registry.setAccessedByClosureIn(scope, target, node); |
| 2888 } | 2888 } |
| 2889 } | 2889 } |
| 2890 } | 2890 } |
| 2891 } | 2891 } |
| (...skipping 542 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3434 if (cls == compiler.stringClass) continue; | 3434 if (cls == compiler.stringClass) continue; |
| 3435 Element equals = cls.lookupMember('=='); | 3435 Element equals = cls.lookupMember('=='); |
| 3436 if (equals.enclosingClass != compiler.objectClass) { | 3436 if (equals.enclosingClass != compiler.objectClass) { |
| 3437 compiler.reportError(spannable, | 3437 compiler.reportError(spannable, |
| 3438 MessageKind.CONST_MAP_KEY_OVERRIDES_EQUALS, | 3438 MessageKind.CONST_MAP_KEY_OVERRIDES_EQUALS, |
| 3439 {'type': keyType}); | 3439 {'type': keyType}); |
| 3440 } | 3440 } |
| 3441 } | 3441 } |
| 3442 } | 3442 } |
| 3443 | 3443 |
| 3444 void analyzeConstant(Node node) { | 3444 void analyzeConstant(Node node, {enforceConst: true}) { |
| 3445 ConstantExpression constant = | 3445 ConstantExpression constant = |
| 3446 compiler.resolver.constantCompiler.compileNode( | 3446 compiler.resolver.constantCompiler.compileNode( |
| 3447 node, registry.mapping); | 3447 node, registry.mapping, enforceConst: enforceConst); |
| 3448 | 3448 |
| 3449 if (constant == null) { | 3449 if (constant == null) { |
| 3450 assert(invariant(node, compiler.compilationFailed)); | 3450 assert(invariant(node, compiler.compilationFailed)); |
| 3451 return; | 3451 return; |
| 3452 } | 3452 } |
| 3453 | 3453 |
| 3454 ConstantValue value = constant.value; | 3454 ConstantValue value = constant.value; |
| 3455 if (value.isMap) { | 3455 if (value.isMap) { |
| 3456 checkConstMapKeysDontOverrideEquals(node, value); | 3456 checkConstMapKeysDontOverrideEquals(node, value); |
| 3457 } | 3457 } |
| (...skipping 11 matching lines...) Expand all Loading... |
| 3469 compiler.reportError(node, | 3469 compiler.reportError(node, |
| 3470 MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT); | 3470 MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT); |
| 3471 } | 3471 } |
| 3472 } else { | 3472 } else { |
| 3473 compiler.reportError(node, | 3473 compiler.reportError(node, |
| 3474 MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT); | 3474 MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT); |
| 3475 } | 3475 } |
| 3476 } | 3476 } |
| 3477 } | 3477 } |
| 3478 | 3478 |
| 3479 void analyzeConstantDeferred(Node node) { | 3479 void analyzeConstantDeferred(Node node, {bool enforceConst: true}) { |
| 3480 addDeferredAction(enclosingElement, () { | 3480 addDeferredAction(enclosingElement, () { |
| 3481 analyzeConstant(node); | 3481 analyzeConstant(node, enforceConst: enforceConst); |
| 3482 }); | 3482 }); |
| 3483 } | 3483 } |
| 3484 | 3484 |
| 3485 bool validateSymbol(Node node, String name, {bool reportError: true}) { | 3485 bool validateSymbol(Node node, String name, {bool reportError: true}) { |
| 3486 if (name.isEmpty) return true; | 3486 if (name.isEmpty) return true; |
| 3487 if (name.startsWith('_')) { | 3487 if (name.startsWith('_')) { |
| 3488 if (reportError) { | 3488 if (reportError) { |
| 3489 compiler.reportError(node, MessageKind.PRIVATE_IDENTIFIER, | 3489 compiler.reportError(node, MessageKind.PRIVATE_IDENTIFIER, |
| 3490 {'value': name}); | 3490 {'value': name}); |
| 3491 } | 3491 } |
| (...skipping 1656 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5148 } | 5148 } |
| 5149 | 5149 |
| 5150 /// The result for the resolution of the `assert` method. | 5150 /// The result for the resolution of the `assert` method. |
| 5151 class AssertResult implements ResolutionResult { | 5151 class AssertResult implements ResolutionResult { |
| 5152 const AssertResult(); | 5152 const AssertResult(); |
| 5153 | 5153 |
| 5154 Element get element => null; | 5154 Element get element => null; |
| 5155 | 5155 |
| 5156 String toString() => 'AssertResult()'; | 5156 String toString() => 'AssertResult()'; |
| 5157 } | 5157 } |
| OLD | NEW |