| 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 766 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 777 Expression operand = node.operand; | 777 Expression operand = node.operand; |
| 778 String methodName = _getPostfixOperator(node); | 778 String methodName = _getPostfixOperator(node); |
| 779 DartType staticType = _getStaticType(operand); | 779 DartType staticType = _getStaticType(operand); |
| 780 MethodElement staticMethod = _lookUpMethod(operand, staticType, methodName); | 780 MethodElement staticMethod = _lookUpMethod(operand, staticType, methodName); |
| 781 node.staticElement = staticMethod; | 781 node.staticElement = staticMethod; |
| 782 DartType propagatedType = _getPropagatedType(operand); | 782 DartType propagatedType = _getPropagatedType(operand); |
| 783 MethodElement propagatedMethod = | 783 MethodElement propagatedMethod = |
| 784 _lookUpMethod(operand, propagatedType, methodName); | 784 _lookUpMethod(operand, propagatedType, methodName); |
| 785 node.propagatedElement = propagatedMethod; | 785 node.propagatedElement = propagatedMethod; |
| 786 if (_shouldReportMissingMember(staticType, staticMethod)) { | 786 if (_shouldReportMissingMember(staticType, staticMethod)) { |
| 787 _recordUndefinedToken( | 787 if (operand is SuperExpression) { |
| 788 staticType.element, | 788 _recordUndefinedToken( |
| 789 StaticTypeWarningCode.UNDEFINED_OPERATOR, | 789 staticType.element, |
| 790 node.operator, | 790 StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR, |
| 791 [methodName, staticType.displayName]); | 791 node.operator, |
| 792 [methodName, staticType.displayName]); |
| 793 } else { |
| 794 _recordUndefinedToken( |
| 795 staticType.element, |
| 796 StaticTypeWarningCode.UNDEFINED_OPERATOR, |
| 797 node.operator, |
| 798 [methodName, staticType.displayName]); |
| 799 } |
| 792 } else if (_enableHints && | 800 } else if (_enableHints && |
| 793 _shouldReportMissingMember(propagatedType, propagatedMethod) && | 801 _shouldReportMissingMember(propagatedType, propagatedMethod) && |
| 794 !_memberFoundInSubclass(propagatedType.element, methodName, true, false)
) { | 802 !_memberFoundInSubclass(propagatedType.element, methodName, true, false))
{ |
| 795 _recordUndefinedToken( | 803 _recordUndefinedToken( |
| 796 propagatedType.element, | 804 propagatedType.element, |
| 797 HintCode.UNDEFINED_OPERATOR, | 805 HintCode.UNDEFINED_OPERATOR, |
| 798 node.operator, | 806 node.operator, |
| 799 [methodName, propagatedType.displayName]); | 807 [methodName, propagatedType.displayName]); |
| 800 } | 808 } |
| 801 return null; | 809 return null; |
| 802 } | 810 } |
| 803 | 811 |
| 804 @override | 812 @override |
| (...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 890 String methodName = _getPrefixOperator(node); | 898 String methodName = _getPrefixOperator(node); |
| 891 DartType staticType = _getStaticType(operand); | 899 DartType staticType = _getStaticType(operand); |
| 892 MethodElement staticMethod = | 900 MethodElement staticMethod = |
| 893 _lookUpMethod(operand, staticType, methodName); | 901 _lookUpMethod(operand, staticType, methodName); |
| 894 node.staticElement = staticMethod; | 902 node.staticElement = staticMethod; |
| 895 DartType propagatedType = _getPropagatedType(operand); | 903 DartType propagatedType = _getPropagatedType(operand); |
| 896 MethodElement propagatedMethod = | 904 MethodElement propagatedMethod = |
| 897 _lookUpMethod(operand, propagatedType, methodName); | 905 _lookUpMethod(operand, propagatedType, methodName); |
| 898 node.propagatedElement = propagatedMethod; | 906 node.propagatedElement = propagatedMethod; |
| 899 if (_shouldReportMissingMember(staticType, staticMethod)) { | 907 if (_shouldReportMissingMember(staticType, staticMethod)) { |
| 900 _recordUndefinedToken( | 908 if (operand is SuperExpression) { |
| 901 staticType.element, | 909 _recordUndefinedToken( |
| 902 StaticTypeWarningCode.UNDEFINED_OPERATOR, | 910 staticType.element, |
| 903 operator, | 911 StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR, |
| 904 [methodName, staticType.displayName]); | 912 operator, |
| 913 [methodName, staticType.displayName]); |
| 914 } else { |
| 915 _recordUndefinedToken( |
| 916 staticType.element, |
| 917 StaticTypeWarningCode.UNDEFINED_OPERATOR, |
| 918 operator, |
| 919 [methodName, staticType.displayName]); |
| 920 } |
| 905 } else if (_enableHints && | 921 } else if (_enableHints && |
| 906 _shouldReportMissingMember(propagatedType, propagatedMethod) && | 922 _shouldReportMissingMember(propagatedType, propagatedMethod) && |
| 907 !_memberFoundInSubclass(propagatedType.element, methodName, true, fals
e)) { | 923 !_memberFoundInSubclass(propagatedType.element, methodName, true, fals
e)) { |
| 908 _recordUndefinedToken( | 924 _recordUndefinedToken( |
| 909 propagatedType.element, | 925 propagatedType.element, |
| 910 HintCode.UNDEFINED_OPERATOR, | 926 HintCode.UNDEFINED_OPERATOR, |
| 911 operator, | 927 operator, |
| 912 [methodName, propagatedType.displayName]); | 928 [methodName, propagatedType.displayName]); |
| 913 } | 929 } |
| 914 } | 930 } |
| (...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1248 _shouldReportMissingMember(staticType, staticMethod); | 1264 _shouldReportMissingMember(staticType, staticMethod); |
| 1249 bool shouldReportMissingMember_propagated = | 1265 bool shouldReportMissingMember_propagated = |
| 1250 !shouldReportMissingMember_static && | 1266 !shouldReportMissingMember_static && |
| 1251 _enableHints && | 1267 _enableHints && |
| 1252 _shouldReportMissingMember(propagatedType, propagatedMethod) && | 1268 _shouldReportMissingMember(propagatedType, propagatedMethod) && |
| 1253 !_memberFoundInSubclass(propagatedType.element, methodName, true, false)
; | 1269 !_memberFoundInSubclass(propagatedType.element, methodName, true, false)
; |
| 1254 if (shouldReportMissingMember_static || | 1270 if (shouldReportMissingMember_static || |
| 1255 shouldReportMissingMember_propagated) { | 1271 shouldReportMissingMember_propagated) { |
| 1256 sc.Token leftBracket = node.leftBracket; | 1272 sc.Token leftBracket = node.leftBracket; |
| 1257 sc.Token rightBracket = node.rightBracket; | 1273 sc.Token rightBracket = node.rightBracket; |
| 1258 ErrorCode errorCode = (shouldReportMissingMember_static ? | 1274 ErrorCode errorCode; |
| 1259 StaticTypeWarningCode.UNDEFINED_OPERATOR : | 1275 if (shouldReportMissingMember_static) { |
| 1260 HintCode.UNDEFINED_OPERATOR); | 1276 if (target is SuperExpression) { |
| 1277 errorCode = StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR; |
| 1278 } else { |
| 1279 errorCode = StaticTypeWarningCode.UNDEFINED_OPERATOR; |
| 1280 } |
| 1281 } else { |
| 1282 errorCode = HintCode.UNDEFINED_OPERATOR; |
| 1283 } |
| 1284 DartType type = shouldReportMissingMember_static ? staticType : propagated
Type; |
| 1261 if (leftBracket == null || rightBracket == null) { | 1285 if (leftBracket == null || rightBracket == null) { |
| 1262 _recordUndefinedNode( | 1286 _recordUndefinedNode( |
| 1263 shouldReportMissingMember_static ? staticType.element : propagatedTy
pe.element, | 1287 type.element, |
| 1264 errorCode, | 1288 errorCode, |
| 1265 node, | 1289 node, |
| 1266 [ | 1290 [methodName, type.displayName]); |
| 1267 methodName, | |
| 1268 shouldReportMissingMember_static ? | |
| 1269 staticType.displayName : | |
| 1270 propagatedType.displayName]); | |
| 1271 } else { | 1291 } else { |
| 1272 int offset = leftBracket.offset; | 1292 int offset = leftBracket.offset; |
| 1273 int length = rightBracket.offset - offset + 1; | 1293 int length = rightBracket.offset - offset + 1; |
| 1274 _recordUndefinedOffset( | 1294 _recordUndefinedOffset( |
| 1275 shouldReportMissingMember_static ? staticType.element : propagatedTy
pe.element, | 1295 type.element, |
| 1276 errorCode, | 1296 errorCode, |
| 1277 offset, | 1297 offset, |
| 1278 length, | 1298 length, |
| 1279 [ | 1299 [methodName, type.displayName]); |
| 1280 methodName, | |
| 1281 shouldReportMissingMember_static ? | |
| 1282 staticType.displayName : | |
| 1283 propagatedType.displayName]); | |
| 1284 } | 1300 } |
| 1285 return true; | 1301 return true; |
| 1286 } | 1302 } |
| 1287 return false; | 1303 return false; |
| 1288 } | 1304 } |
| 1289 | 1305 |
| 1290 /** | 1306 /** |
| 1291 * Given a list of arguments and the element that will be invoked using those
argument, compute | 1307 * Given a list of arguments and the element that will be invoked using those
argument, compute |
| 1292 * the list of parameters that correspond to the list of arguments. Return the
parameters that | 1308 * the list of parameters that correspond to the list of arguments. Return the
parameters that |
| 1293 * correspond to the arguments, or `null` if no correspondence could be comput
ed. | 1309 * correspond to the arguments, or `null` if no correspondence could be comput
ed. |
| (...skipping 1107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2401 if (leftOperand != null) { | 2417 if (leftOperand != null) { |
| 2402 DartType staticType = _getStaticType(leftOperand); | 2418 DartType staticType = _getStaticType(leftOperand); |
| 2403 MethodElement staticMethod = | 2419 MethodElement staticMethod = |
| 2404 _lookUpMethod(leftOperand, staticType, methodName); | 2420 _lookUpMethod(leftOperand, staticType, methodName); |
| 2405 node.staticElement = staticMethod; | 2421 node.staticElement = staticMethod; |
| 2406 DartType propagatedType = _getPropagatedType(leftOperand); | 2422 DartType propagatedType = _getPropagatedType(leftOperand); |
| 2407 MethodElement propagatedMethod = | 2423 MethodElement propagatedMethod = |
| 2408 _lookUpMethod(leftOperand, propagatedType, methodName); | 2424 _lookUpMethod(leftOperand, propagatedType, methodName); |
| 2409 node.propagatedElement = propagatedMethod; | 2425 node.propagatedElement = propagatedMethod; |
| 2410 if (_shouldReportMissingMember(staticType, staticMethod)) { | 2426 if (_shouldReportMissingMember(staticType, staticMethod)) { |
| 2411 _recordUndefinedToken( | 2427 if (leftOperand is SuperExpression) { |
| 2412 staticType.element, | 2428 _recordUndefinedToken( |
| 2413 StaticTypeWarningCode.UNDEFINED_OPERATOR, | 2429 staticType.element, |
| 2414 node.operator, | 2430 StaticTypeWarningCode.UNDEFINED_SUPER_OPERATOR, |
| 2415 [methodName, staticType.displayName]); | 2431 node.operator, |
| 2432 [methodName, staticType.displayName]); |
| 2433 } else { |
| 2434 _recordUndefinedToken( |
| 2435 staticType.element, |
| 2436 StaticTypeWarningCode.UNDEFINED_OPERATOR, |
| 2437 node.operator, |
| 2438 [methodName, staticType.displayName]); |
| 2439 } |
| 2416 } else if (_enableHints && | 2440 } else if (_enableHints && |
| 2417 _shouldReportMissingMember(propagatedType, propagatedMethod) && | 2441 _shouldReportMissingMember(propagatedType, propagatedMethod) && |
| 2418 !_memberFoundInSubclass(propagatedType.element, methodName, true, fals
e)) { | 2442 !_memberFoundInSubclass(propagatedType.element, methodName, true, fals
e)) { |
| 2419 _recordUndefinedToken( | 2443 _recordUndefinedToken( |
| 2420 propagatedType.element, | 2444 propagatedType.element, |
| 2421 HintCode.UNDEFINED_OPERATOR, | 2445 HintCode.UNDEFINED_OPERATOR, |
| 2422 node.operator, | 2446 node.operator, |
| 2423 [methodName, propagatedType.displayName]); | 2447 [methodName, propagatedType.displayName]); |
| 2424 } | 2448 } |
| 2425 } | 2449 } |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2639 _shouldReportMissingMember(propagatedType, propagatedElement) && | 2663 _shouldReportMissingMember(propagatedType, propagatedElement) && |
| 2640 !_memberFoundInSubclass(propagatedType.element, propertyName.name, false
, true); | 2664 !_memberFoundInSubclass(propagatedType.element, propertyName.name, false
, true); |
| 2641 // TODO(collinsn): add support for errors on union types by extending | 2665 // TODO(collinsn): add support for errors on union types by extending |
| 2642 // [lookupGetter] and [lookupSetter] in analogy with the earlier | 2666 // [lookupGetter] and [lookupSetter] in analogy with the earlier |
| 2643 // [lookupMethod] extensions. | 2667 // [lookupMethod] extensions. |
| 2644 if (propagatedType is UnionType) { | 2668 if (propagatedType is UnionType) { |
| 2645 shouldReportMissingMember_propagated = false; | 2669 shouldReportMissingMember_propagated = false; |
| 2646 } | 2670 } |
| 2647 if (shouldReportMissingMember_static || | 2671 if (shouldReportMissingMember_static || |
| 2648 shouldReportMissingMember_propagated) { | 2672 shouldReportMissingMember_propagated) { |
| 2649 Element staticOrPropagatedEnclosingElt = | 2673 DartType staticOrPropagatedType = |
| 2650 shouldReportMissingMember_static ? staticType.element : propagatedType
.element; | 2674 shouldReportMissingMember_static ? staticType : propagatedType; |
| 2675 Element staticOrPropagatedEnclosingElt = staticOrPropagatedType.element; |
| 2651 bool isStaticProperty = _isStatic(staticOrPropagatedEnclosingElt); | 2676 bool isStaticProperty = _isStatic(staticOrPropagatedEnclosingElt); |
| 2652 String displayName = staticOrPropagatedEnclosingElt != null ? | 2677 DartType displayType = staticOrPropagatedType != null ? |
| 2653 staticOrPropagatedEnclosingElt.displayName : | 2678 staticOrPropagatedType : |
| 2654 propagatedType != null ? propagatedType.displayName : staticType.displ
ayName; | 2679 propagatedType != null ? propagatedType : staticType; |
| 2655 // Special getter cases. | 2680 // Special getter cases. |
| 2656 if (propertyName.inGetterContext()) { | 2681 if (propertyName.inGetterContext()) { |
| 2657 if (!isStaticProperty && | 2682 if (!isStaticProperty && |
| 2658 staticOrPropagatedEnclosingElt is ClassElement) { | 2683 staticOrPropagatedEnclosingElt is ClassElement) { |
| 2659 ClassElement classElement = staticOrPropagatedEnclosingElt; | 2684 ClassElement classElement = staticOrPropagatedEnclosingElt; |
| 2660 InterfaceType targetType = classElement.type; | 2685 InterfaceType targetType = classElement.type; |
| 2661 if (targetType != null && | 2686 if (targetType != null && |
| 2662 targetType.isDartCoreFunction && | 2687 targetType.isDartCoreFunction && |
| 2663 propertyName.name == FunctionElement.CALL_METHOD_NAME) { | 2688 propertyName.name == FunctionElement.CALL_METHOD_NAME) { |
| 2664 // TODO(brianwilkerson) Can we ever resolve the function being | 2689 // TODO(brianwilkerson) Can we ever resolve the function being |
| 2665 // invoked? | 2690 // invoked? |
| 2666 // resolveArgumentsToParameters(node.getArgumentList(), invokedFuncti
on); | 2691 // resolveArgumentsToParameters(node.getArgumentList(), invokedFuncti
on); |
| 2667 return; | 2692 return; |
| 2668 } else if (classElement.isEnum && propertyName.name == "_name") { | 2693 } else if (classElement.isEnum && propertyName.name == "_name") { |
| 2669 _resolver.reportErrorForNode( | 2694 _resolver.reportErrorForNode( |
| 2670 CompileTimeErrorCode.ACCESS_PRIVATE_ENUM_FIELD, | 2695 CompileTimeErrorCode.ACCESS_PRIVATE_ENUM_FIELD, |
| 2671 propertyName, | 2696 propertyName, |
| 2672 [propertyName.name]); | 2697 [propertyName.name]); |
| 2673 return; | 2698 return; |
| 2674 } | 2699 } |
| 2675 } | 2700 } |
| 2676 } | 2701 } |
| 2677 Element declaringElement = | 2702 Element declaringElement = |
| 2678 staticType.isVoid ? null : staticOrPropagatedEnclosingElt; | 2703 staticType.isVoid ? null : staticOrPropagatedEnclosingElt; |
| 2679 if (propertyName.inSetterContext()) { | 2704 if (propertyName.inSetterContext()) { |
| 2680 ErrorCode staticErrorCode = (isStaticProperty && !staticType.isVoid ? | 2705 ErrorCode errorCode; |
| 2681 StaticWarningCode.UNDEFINED_SETTER : | 2706 if (shouldReportMissingMember_static) { |
| 2682 StaticTypeWarningCode.UNDEFINED_SETTER); | 2707 if (target is SuperExpression) { |
| 2683 ErrorCode errorCode = | 2708 if (isStaticProperty && !staticType.isVoid) { |
| 2684 shouldReportMissingMember_static ? staticErrorCode : HintCode.UNDEFI
NED_SETTER; | 2709 errorCode = StaticWarningCode.UNDEFINED_SUPER_SETTER; |
| 2710 } else { |
| 2711 errorCode = StaticTypeWarningCode.UNDEFINED_SUPER_SETTER; |
| 2712 } |
| 2713 } else { |
| 2714 if (isStaticProperty && !staticType.isVoid) { |
| 2715 errorCode = StaticWarningCode.UNDEFINED_SETTER; |
| 2716 } else { |
| 2717 errorCode = StaticTypeWarningCode.UNDEFINED_SETTER; |
| 2718 } |
| 2719 } |
| 2720 } else { |
| 2721 errorCode = HintCode.UNDEFINED_SETTER; |
| 2722 } |
| 2685 _recordUndefinedNode( | 2723 _recordUndefinedNode( |
| 2686 declaringElement, | 2724 declaringElement, |
| 2687 errorCode, | 2725 errorCode, |
| 2688 propertyName, | 2726 propertyName, |
| 2689 [propertyName.name, displayName]); | 2727 [propertyName.name, displayType.displayName]); |
| 2690 } else if (propertyName.inGetterContext()) { | 2728 } else if (propertyName.inGetterContext()) { |
| 2691 ErrorCode staticErrorCode = (isStaticProperty && !staticType.isVoid ? | 2729 ErrorCode errorCode; |
| 2692 StaticWarningCode.UNDEFINED_GETTER : | 2730 if (shouldReportMissingMember_static) { |
| 2693 StaticTypeWarningCode.UNDEFINED_GETTER); | 2731 if (target is SuperExpression) { |
| 2694 ErrorCode errorCode = | 2732 if (isStaticProperty && !staticType.isVoid) { |
| 2695 shouldReportMissingMember_static ? staticErrorCode : HintCode.UNDEFI
NED_GETTER; | 2733 errorCode = StaticWarningCode.UNDEFINED_SUPER_GETTER; |
| 2734 } else { |
| 2735 errorCode = StaticTypeWarningCode.UNDEFINED_SUPER_GETTER; |
| 2736 } |
| 2737 } else { |
| 2738 if (isStaticProperty && !staticType.isVoid) { |
| 2739 errorCode = StaticWarningCode.UNDEFINED_GETTER; |
| 2740 } else { |
| 2741 errorCode = StaticTypeWarningCode.UNDEFINED_GETTER; |
| 2742 } |
| 2743 } |
| 2744 } else { |
| 2745 errorCode = HintCode.UNDEFINED_GETTER; |
| 2746 } |
| 2696 _recordUndefinedNode( | 2747 _recordUndefinedNode( |
| 2697 declaringElement, | 2748 declaringElement, |
| 2698 errorCode, | 2749 errorCode, |
| 2699 propertyName, | 2750 propertyName, |
| 2700 [propertyName.name, displayName]); | 2751 [propertyName.name, displayType.displayName]); |
| 2701 } else { | 2752 } else { |
| 2702 _recordUndefinedNode( | 2753 _recordUndefinedNode( |
| 2703 declaringElement, | 2754 declaringElement, |
| 2704 StaticWarningCode.UNDEFINED_IDENTIFIER, | 2755 StaticWarningCode.UNDEFINED_IDENTIFIER, |
| 2705 propertyName, | 2756 propertyName, |
| 2706 [propertyName.name]); | 2757 [propertyName.name]); |
| 2707 } | 2758 } |
| 2708 } | 2759 } |
| 2709 } | 2760 } |
| 2710 | 2761 |
| (...skipping 352 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3063 @override | 3114 @override |
| 3064 Element get staticElement => null; | 3115 Element get staticElement => null; |
| 3065 | 3116 |
| 3066 @override | 3117 @override |
| 3067 accept(AstVisitor visitor) => null; | 3118 accept(AstVisitor visitor) => null; |
| 3068 | 3119 |
| 3069 @override | 3120 @override |
| 3070 void visitChildren(AstVisitor visitor) { | 3121 void visitChildren(AstVisitor visitor) { |
| 3071 } | 3122 } |
| 3072 } | 3123 } |
| OLD | NEW |