| 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 633 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 644 bool generatedWithTypePropagation = false; | 644 bool generatedWithTypePropagation = false; |
| 645 if (_enableHints && errorCode == null && staticElement == null) { | 645 if (_enableHints && errorCode == null && staticElement == null) { |
| 646 // The method lookup may have failed because there were multiple | 646 // The method lookup may have failed because there were multiple |
| 647 // incompatible choices. In this case we don't want to generate a hint. | 647 // incompatible choices. In this case we don't want to generate a hint. |
| 648 errorCode = _checkForInvocationError(target, false, propagatedElement); | 648 errorCode = _checkForInvocationError(target, false, propagatedElement); |
| 649 if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_METHOD)) { | 649 if (identical(errorCode, StaticTypeWarningCode.UNDEFINED_METHOD)) { |
| 650 ClassElement classElementContext = null; | 650 ClassElement classElementContext = null; |
| 651 if (target == null) { | 651 if (target == null) { |
| 652 classElementContext = _resolver.enclosingClass; | 652 classElementContext = _resolver.enclosingClass; |
| 653 } else { | 653 } else { |
| 654 DartType type = target.bestType; | 654 DartType type = _getBestType(target); |
| 655 if (type != null) { | 655 if (type != null) { |
| 656 if (type.element is ClassElement) { | 656 if (type.element is ClassElement) { |
| 657 classElementContext = type.element as ClassElement; | 657 classElementContext = type.element as ClassElement; |
| 658 } | 658 } |
| 659 } | 659 } |
| 660 } | 660 } |
| 661 if (classElementContext != null) { | 661 if (classElementContext != null) { |
| 662 _subtypeManager.ensureLibraryVisited(_definingLibrary); | 662 _subtypeManager.ensureLibraryVisited(_definingLibrary); |
| 663 HashSet<ClassElement> subtypeElements = | 663 HashSet<ClassElement> subtypeElements = |
| 664 _subtypeManager.computeAllSubtypes(classElementContext); | 664 _subtypeManager.computeAllSubtypes(classElementContext); |
| (...skipping 518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1183 return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION; | 1183 return StaticTypeWarningCode.INVOCATION_OF_NON_FUNCTION; |
| 1184 } | 1184 } |
| 1185 } else { | 1185 } else { |
| 1186 DartType targetType; | 1186 DartType targetType; |
| 1187 if (useStaticContext) { | 1187 if (useStaticContext) { |
| 1188 targetType = _getStaticType(target); | 1188 targetType = _getStaticType(target); |
| 1189 } else { | 1189 } else { |
| 1190 // Compute and use the propagated type, if it is null, then it may | 1190 // Compute and use the propagated type, if it is null, then it may |
| 1191 // be the case that static type is some type, in which the static | 1191 // be the case that static type is some type, in which the static |
| 1192 // type should be used. | 1192 // type should be used. |
| 1193 targetType = target.bestType; | 1193 targetType = _getBestType(target); |
| 1194 } | 1194 } |
| 1195 if (targetType == null) { | 1195 if (targetType == null) { |
| 1196 return StaticTypeWarningCode.UNDEFINED_FUNCTION; | 1196 return StaticTypeWarningCode.UNDEFINED_FUNCTION; |
| 1197 } else if (!targetType.isDynamic && !targetType.isBottom) { | 1197 } else if (!targetType.isDynamic && !targetType.isBottom) { |
| 1198 // Proxy-conditional warning, based on state of | 1198 // Proxy-conditional warning, based on state of |
| 1199 // targetType.getElement() | 1199 // targetType.getElement() |
| 1200 return StaticTypeWarningCode.UNDEFINED_METHOD; | 1200 return StaticTypeWarningCode.UNDEFINED_METHOD; |
| 1201 } | 1201 } |
| 1202 } | 1202 } |
| 1203 } | 1203 } |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1385 } else if (operatorType == sc.TokenType.MINUS_MINUS) { | 1385 } else if (operatorType == sc.TokenType.MINUS_MINUS) { |
| 1386 return sc.TokenType.MINUS.lexeme; | 1386 return sc.TokenType.MINUS.lexeme; |
| 1387 } else if (operatorType == sc.TokenType.MINUS) { | 1387 } else if (operatorType == sc.TokenType.MINUS) { |
| 1388 return "unary-"; | 1388 return "unary-"; |
| 1389 } else { | 1389 } else { |
| 1390 return operator.lexeme; | 1390 return operator.lexeme; |
| 1391 } | 1391 } |
| 1392 } | 1392 } |
| 1393 | 1393 |
| 1394 /** | 1394 /** |
| 1395 * Return the best type of the given [expression] that is to be used for |
| 1396 * type analysis. |
| 1397 */ |
| 1398 DartType _getBestType(Expression expression) { |
| 1399 DartType bestType = _resolveTypeParameter(expression.bestType); |
| 1400 if (bestType is FunctionType) { |
| 1401 // |
| 1402 // All function types are subtypes of 'Function', which is itself a |
| 1403 // subclass of 'Object'. |
| 1404 // |
| 1405 bestType = _resolver.typeProvider.functionType; |
| 1406 } |
| 1407 return bestType; |
| 1408 } |
| 1409 |
| 1410 /** |
| 1395 * Return the propagated type of the given [expression] that is to be used for | 1411 * Return the propagated type of the given [expression] that is to be used for |
| 1396 * type analysis. | 1412 * type analysis. |
| 1397 */ | 1413 */ |
| 1398 DartType _getPropagatedType(Expression expression) { | 1414 DartType _getPropagatedType(Expression expression) { |
| 1399 DartType propagatedType = _resolveTypeParameter(expression.propagatedType); | 1415 DartType propagatedType = _resolveTypeParameter(expression.propagatedType); |
| 1400 if (propagatedType is FunctionType) { | 1416 if (propagatedType is FunctionType) { |
| 1401 // | 1417 // |
| 1402 // All function types are subtypes of 'Function', which is itself a | 1418 // All function types are subtypes of 'Function', which is itself a |
| 1403 // subclass of 'Object'. | 1419 // subclass of 'Object'. |
| 1404 // | 1420 // |
| (...skipping 1371 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2776 | 2792 |
| 2777 @override | 2793 @override |
| 2778 Element get staticElement => null; | 2794 Element get staticElement => null; |
| 2779 | 2795 |
| 2780 @override | 2796 @override |
| 2781 accept(AstVisitor visitor) => null; | 2797 accept(AstVisitor visitor) => null; |
| 2782 | 2798 |
| 2783 @override | 2799 @override |
| 2784 void visitChildren(AstVisitor visitor) {} | 2800 void visitChildren(AstVisitor visitor) {} |
| 2785 } | 2801 } |
| OLD | NEW |