OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, 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 engine.resolver.element_resolver; | 5 library engine.resolver.element_resolver; |
6 | 6 |
7 import 'dart:collection'; | 7 import 'dart:collection'; |
8 | 8 |
9 import 'ast.dart'; | 9 import 'ast.dart'; |
10 import 'element.dart'; | 10 import 'element.dart'; |
(...skipping 661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
672 } | 672 } |
673 } | 673 } |
674 } | 674 } |
675 } | 675 } |
676 generatedWithTypePropagation = true; | 676 generatedWithTypePropagation = true; |
677 } | 677 } |
678 if (errorCode == null) { | 678 if (errorCode == null) { |
679 return null; | 679 return null; |
680 } | 680 } |
681 if (identical( | 681 if (identical( |
682 errorCode, StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION)) { | 682 errorCode, StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION) || |
683 _resolver.reportErrorForNode( | 683 identical(errorCode, |
684 StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION, methodName, | 684 CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT) || |
685 [methodName.name]); | 685 identical(errorCode, StaticTypeWarningCode.UNDEFINED_FUNCTION)) { |
686 } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_FUNCTION)) { | 686 _resolver.reportErrorForNode(errorCode, methodName, [methodName.name]); |
687 _resolver.reportErrorForNode(StaticTypeWarningCode.UNDEFINED_FUNCTION, | |
688 methodName, [methodName.name]); | |
689 } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_METHOD)) { | 687 } else if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_METHOD)) { |
690 String targetTypeName; | 688 String targetTypeName; |
691 if (target == null) { | 689 if (target == null) { |
692 ClassElement enclosingClass = _resolver.enclosingClass; | 690 ClassElement enclosingClass = _resolver.enclosingClass; |
693 targetTypeName = enclosingClass.displayName; | 691 targetTypeName = enclosingClass.displayName; |
694 ErrorCode proxyErrorCode = (generatedWithTypePropagation | 692 ErrorCode proxyErrorCode = (generatedWithTypePropagation |
695 ? HintCode.UNDEFINED_METHOD | 693 ? HintCode.UNDEFINED_METHOD |
696 : StaticTypeWarningCode.UNDEFINED_METHOD); | 694 : StaticTypeWarningCode.UNDEFINED_METHOD); |
697 _recordUndefinedNode(_resolver.enclosingClass, proxyErrorCode, | 695 _recordUndefinedNode(_resolver.enclosingClass, proxyErrorCode, |
698 methodName, [methodName.name, targetTypeName]); | 696 methodName, [methodName.name, targetTypeName]); |
(...skipping 410 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1109 * Given that we have found code to invoke the given [element], return the | 1107 * Given that we have found code to invoke the given [element], return the |
1110 * error code that should be reported, or `null` if no error should be | 1108 * error code that should be reported, or `null` if no error should be |
1111 * reported. The [target] is the target of the invocation, or `null` if there | 1109 * reported. The [target] is the target of the invocation, or `null` if there |
1112 * was no target. The flag [useStaticContext] should be `true` if the | 1110 * was no target. The flag [useStaticContext] should be `true` if the |
1113 * invocation is in a static constant (does not have access to instance state. | 1111 * invocation is in a static constant (does not have access to instance state. |
1114 */ | 1112 */ |
1115 ErrorCode _checkForInvocationError( | 1113 ErrorCode _checkForInvocationError( |
1116 Expression target, bool useStaticContext, Element element) { | 1114 Expression target, bool useStaticContext, Element element) { |
1117 // Prefix is not declared, instead "prefix.id" are declared. | 1115 // Prefix is not declared, instead "prefix.id" are declared. |
1118 if (element is PrefixElement) { | 1116 if (element is PrefixElement) { |
1119 element = null; | 1117 return CompileTimeErrorCode.PREFIX_IDENTIFIER_NOT_FOLLOWED_BY_DOT; |
1120 } | 1118 } |
1121 if (element is PropertyAccessorElement) { | 1119 if (element is PropertyAccessorElement) { |
1122 // | 1120 // |
1123 // This is really a function expression invocation. | 1121 // This is really a function expression invocation. |
1124 // | 1122 // |
1125 // TODO(brianwilkerson) Consider the possibility of re-writing the AST. | 1123 // TODO(brianwilkerson) Consider the possibility of re-writing the AST. |
1126 FunctionType getterType = element.type; | 1124 FunctionType getterType = element.type; |
1127 if (getterType != null) { | 1125 if (getterType != null) { |
1128 DartType returnType = getterType.returnType; | 1126 DartType returnType = getterType.returnType; |
1129 if (!_isExecutableType(returnType)) { | 1127 if (!_isExecutableType(returnType)) { |
(...skipping 1185 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2315 * will be invoked. If the returned element is a getter, the getter will be | 2313 * will be invoked. If the returned element is a getter, the getter will be |
2316 * invoked without arguments and the result of that invocation will then be | 2314 * invoked without arguments and the result of that invocation will then be |
2317 * invoked with the arguments. The [methodName] is the name of the method | 2315 * invoked with the arguments. The [methodName] is the name of the method |
2318 * being invoked ('m'). | 2316 * being invoked ('m'). |
2319 */ | 2317 */ |
2320 Element _resolveInvokedElement(SimpleIdentifier methodName) { | 2318 Element _resolveInvokedElement(SimpleIdentifier methodName) { |
2321 // | 2319 // |
2322 // Look first in the lexical scope. | 2320 // Look first in the lexical scope. |
2323 // | 2321 // |
2324 Element element = _resolver.nameScope.lookup(methodName, _definingLibrary); | 2322 Element element = _resolver.nameScope.lookup(methodName, _definingLibrary); |
2325 if (element == null || element is PrefixElement) { | 2323 if (element == null) { |
2326 // | 2324 // |
2327 // If it isn't defined in the lexical scope, and the invocation is within | 2325 // If it isn't defined in the lexical scope, and the invocation is within |
2328 // a class, then look in the inheritance scope. | 2326 // a class, then look in the inheritance scope. |
2329 // | 2327 // |
2330 ClassElement enclosingClass = _resolver.enclosingClass; | 2328 ClassElement enclosingClass = _resolver.enclosingClass; |
2331 if (enclosingClass != null) { | 2329 if (enclosingClass != null) { |
2332 InterfaceType enclosingType = enclosingClass.type; | 2330 InterfaceType enclosingType = enclosingClass.type; |
2333 element = _lookUpMethod(null, enclosingType, methodName.name); | 2331 element = _lookUpMethod(null, enclosingType, methodName.name); |
2334 if (element == null) { | 2332 if (element == null) { |
2335 // | 2333 // |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2570 if (setter != null) { | 2568 if (setter != null) { |
2571 element = setter; | 2569 element = setter; |
2572 } | 2570 } |
2573 } | 2571 } |
2574 } else if (element == null && | 2572 } else if (element == null && |
2575 (identifier.inSetterContext() || | 2573 (identifier.inSetterContext() || |
2576 identifier.parent is CommentReference)) { | 2574 identifier.parent is CommentReference)) { |
2577 element = _resolver.nameScope.lookup( | 2575 element = _resolver.nameScope.lookup( |
2578 new SyntheticIdentifier("${identifier.name}=", identifier), | 2576 new SyntheticIdentifier("${identifier.name}=", identifier), |
2579 _definingLibrary); | 2577 _definingLibrary); |
2580 } else if (element is PrefixElement && !identifier.inGetterContext()) { | |
2581 element = _resolver.nameScope.lookup( | |
2582 new SyntheticIdentifier("${identifier.name}=", identifier), | |
2583 _definingLibrary); | |
2584 } | 2578 } |
2585 ClassElement enclosingClass = _resolver.enclosingClass; | 2579 ClassElement enclosingClass = _resolver.enclosingClass; |
2586 if (element == null && enclosingClass != null) { | 2580 if (element == null && enclosingClass != null) { |
2587 InterfaceType enclosingType = enclosingClass.type; | 2581 InterfaceType enclosingType = enclosingClass.type; |
2588 if (element == null && | 2582 if (element == null && |
2589 (identifier.inSetterContext() || | 2583 (identifier.inSetterContext() || |
2590 identifier.parent is CommentReference)) { | 2584 identifier.parent is CommentReference)) { |
2591 element = _lookUpSetter(null, enclosingType, identifier.name); | 2585 element = _lookUpSetter(null, enclosingType, identifier.name); |
2592 } | 2586 } |
2593 if (element == null && identifier.inGetterContext()) { | 2587 if (element == null && identifier.inGetterContext()) { |
(...skipping 215 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2809 | 2803 |
2810 @override | 2804 @override |
2811 Element get staticElement => null; | 2805 Element get staticElement => null; |
2812 | 2806 |
2813 @override | 2807 @override |
2814 accept(AstVisitor visitor) => null; | 2808 accept(AstVisitor visitor) => null; |
2815 | 2809 |
2816 @override | 2810 @override |
2817 void visitChildren(AstVisitor visitor) {} | 2811 void visitChildren(AstVisitor visitor) {} |
2818 } | 2812 } |
OLD | NEW |