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 analyzer.src.generated.error_verifier; | 5 library analyzer.src.generated.error_verifier; |
6 | 6 |
7 import 'dart:collection'; | 7 import 'dart:collection'; |
8 import "dart:math" as math; | 8 import "dart:math" as math; |
9 | 9 |
10 import 'package:analyzer/dart/ast/ast.dart'; | 10 import 'package:analyzer/dart/ast/ast.dart'; |
| 11 import 'package:analyzer/dart/ast/resolution_accessors.dart'; |
11 import 'package:analyzer/dart/ast/token.dart'; | 12 import 'package:analyzer/dart/ast/token.dart'; |
12 import 'package:analyzer/dart/ast/visitor.dart'; | 13 import 'package:analyzer/dart/ast/visitor.dart'; |
13 import 'package:analyzer/dart/element/element.dart'; | 14 import 'package:analyzer/dart/element/element.dart'; |
14 import 'package:analyzer/dart/element/type.dart'; | 15 import 'package:analyzer/dart/element/type.dart'; |
15 import 'package:analyzer/dart/element/visitor.dart'; | 16 import 'package:analyzer/dart/element/visitor.dart'; |
16 import 'package:analyzer/error/error.dart'; | 17 import 'package:analyzer/error/error.dart'; |
17 import 'package:analyzer/error/listener.dart'; | 18 import 'package:analyzer/error/listener.dart'; |
18 import 'package:analyzer/src/dart/element/element.dart'; | 19 import 'package:analyzer/src/dart/element/element.dart'; |
19 import 'package:analyzer/src/dart/element/member.dart'; | 20 import 'package:analyzer/src/dart/element/member.dart'; |
20 import 'package:analyzer/src/dart/element/type.dart'; | 21 import 'package:analyzer/src/dart/element/type.dart'; |
(...skipping 829 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
850 Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) { | 851 Object visitFunctionTypedFormalParameter(FunctionTypedFormalParameter node) { |
851 bool old = _isInFunctionTypedFormalParameter; | 852 bool old = _isInFunctionTypedFormalParameter; |
852 _isInFunctionTypedFormalParameter = true; | 853 _isInFunctionTypedFormalParameter = true; |
853 try { | 854 try { |
854 _checkForTypeAnnotationDeferredClass(node.returnType); | 855 _checkForTypeAnnotationDeferredClass(node.returnType); |
855 | 856 |
856 // TODO(jmesserly): ideally we'd use _checkForImplicitDynamicReturn, and | 857 // TODO(jmesserly): ideally we'd use _checkForImplicitDynamicReturn, and |
857 // we can get the function element via `node?.element?.type?.element` but | 858 // we can get the function element via `node?.element?.type?.element` but |
858 // it doesn't have hasImplicitReturnType set correctly. | 859 // it doesn't have hasImplicitReturnType set correctly. |
859 if (!_options.implicitDynamic && node.returnType == null) { | 860 if (!_options.implicitDynamic && node.returnType == null) { |
860 DartType parameterType = node.element.type; | 861 DartType parameterType = elementForFormalParameter(node).type; |
861 if (parameterType is FunctionType && | 862 if (parameterType is FunctionType && |
862 parameterType.returnType.isDynamic) { | 863 parameterType.returnType.isDynamic) { |
863 _errorReporter.reportErrorForNode( | 864 _errorReporter.reportErrorForNode( |
864 StrongModeCode.IMPLICIT_DYNAMIC_RETURN, node, [node.identifier]); | 865 StrongModeCode.IMPLICIT_DYNAMIC_RETURN, node, [node.identifier]); |
865 } | 866 } |
866 } | 867 } |
867 return super.visitFunctionTypedFormalParameter(node); | 868 return super.visitFunctionTypedFormalParameter(node); |
868 } finally { | 869 } finally { |
869 _isInFunctionTypedFormalParameter = old; | 870 _isInFunctionTypedFormalParameter = old; |
870 } | 871 } |
(...skipping 1360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2231 : StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR); | 2232 : StaticWarningCode.REDIRECT_TO_MISSING_CONSTRUCTOR); |
2232 _errorReporter.reportErrorForNode(errorCode, redirectedConstructor, | 2233 _errorReporter.reportErrorForNode(errorCode, redirectedConstructor, |
2233 [constructorStrName, redirectedType.displayName]); | 2234 [constructorStrName, redirectedType.displayName]); |
2234 } | 2235 } |
2235 return; | 2236 return; |
2236 } | 2237 } |
2237 FunctionType redirectedType = redirectedElement.type; | 2238 FunctionType redirectedType = redirectedElement.type; |
2238 DartType redirectedReturnType = redirectedType.returnType; | 2239 DartType redirectedReturnType = redirectedType.returnType; |
2239 | 2240 |
2240 // Report specific problem when return type is incompatible | 2241 // Report specific problem when return type is incompatible |
2241 FunctionType constructorType = declaration.element.type; | 2242 FunctionType constructorType = |
| 2243 elementForConstructorDeclaration(declaration).type; |
2242 DartType constructorReturnType = constructorType.returnType; | 2244 DartType constructorReturnType = constructorType.returnType; |
2243 if (!_typeSystem.isAssignableTo( | 2245 if (!_typeSystem.isAssignableTo( |
2244 redirectedReturnType, constructorReturnType)) { | 2246 redirectedReturnType, constructorReturnType)) { |
2245 _errorReporter.reportErrorForNode( | 2247 _errorReporter.reportErrorForNode( |
2246 StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE, | 2248 StaticWarningCode.REDIRECT_TO_INVALID_RETURN_TYPE, |
2247 redirectedConstructor, | 2249 redirectedConstructor, |
2248 [redirectedReturnType, constructorReturnType]); | 2250 [redirectedReturnType, constructorReturnType]); |
2249 return; | 2251 return; |
2250 } else if (!_typeSystem.isSubtypeOf(redirectedType, constructorType)) { | 2252 } else if (!_typeSystem.isSubtypeOf(redirectedType, constructorType)) { |
2251 // Check parameters. | 2253 // Check parameters. |
(...skipping 634 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2886 bool isMethod = !isGetter && !isSetter && !isOperator; | 2888 bool isMethod = !isGetter && !isSetter && !isOperator; |
2887 // Do lookups in the enclosing class (and the inherited member) if the | 2889 // Do lookups in the enclosing class (and the inherited member) if the |
2888 // member is a method or a setter for | 2890 // member is a method or a setter for |
2889 // StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER warning. | 2891 // StaticWarningCode.CONFLICTING_INSTANCE_METHOD_SETTER warning. |
2890 if (isMethod) { | 2892 if (isMethod) { |
2891 String setterName = "${name.name}="; | 2893 String setterName = "${name.name}="; |
2892 Element enclosingElementOfSetter = null; | 2894 Element enclosingElementOfSetter = null; |
2893 ClassMember conflictingSetter = memberHashMap[setterName]; | 2895 ClassMember conflictingSetter = memberHashMap[setterName]; |
2894 if (conflictingSetter != null) { | 2896 if (conflictingSetter != null) { |
2895 enclosingElementOfSetter = | 2897 enclosingElementOfSetter = |
2896 conflictingSetter.element.enclosingElement; | 2898 elementForDeclaration(conflictingSetter).enclosingElement; |
2897 } else { | 2899 } else { |
2898 ExecutableElement elementFromInheritance = _inheritanceManager | 2900 ExecutableElement elementFromInheritance = _inheritanceManager |
2899 .lookupInheritance(_enclosingClass, setterName); | 2901 .lookupInheritance(_enclosingClass, setterName); |
2900 if (elementFromInheritance != null) { | 2902 if (elementFromInheritance != null) { |
2901 enclosingElementOfSetter = | 2903 enclosingElementOfSetter = |
2902 elementFromInheritance.enclosingElement; | 2904 elementFromInheritance.enclosingElement; |
2903 } | 2905 } |
2904 } | 2906 } |
2905 if (enclosingElementOfSetter != null) { | 2907 if (enclosingElementOfSetter != null) { |
2906 _errorReporter.reportErrorForNode( | 2908 _errorReporter.reportErrorForNode( |
(...skipping 1819 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4726 _errorReporter.reportErrorForOffset( | 4728 _errorReporter.reportErrorForOffset( |
4727 StaticWarningCode.MISSING_ENUM_CONSTANT_IN_SWITCH, | 4729 StaticWarningCode.MISSING_ENUM_CONSTANT_IN_SWITCH, |
4728 offset, | 4730 offset, |
4729 end - offset, | 4731 end - offset, |
4730 [constantNames[i]]); | 4732 [constantNames[i]]); |
4731 } | 4733 } |
4732 } | 4734 } |
4733 } | 4735 } |
4734 | 4736 |
4735 void _checkForMissingJSLibAnnotation(Annotation node) { | 4737 void _checkForMissingJSLibAnnotation(Annotation node) { |
4736 if (node.elementAnnotation?.isJS ?? false) { | 4738 if (elementAnnotationForAnnotation(node)?.isJS ?? false) { |
4737 if (_currentLibrary.isJS != true) { | 4739 if (_currentLibrary.isJS != true) { |
4738 _errorReporter.reportErrorForNode( | 4740 _errorReporter.reportErrorForNode( |
4739 HintCode.MISSING_JS_LIB_ANNOTATION, node); | 4741 HintCode.MISSING_JS_LIB_ANNOTATION, node); |
4740 } | 4742 } |
4741 } | 4743 } |
4742 } | 4744 } |
4743 | 4745 |
4744 /** | 4746 /** |
4745 * Verify that the given function [body] does not contain return statements | 4747 * Verify that the given function [body] does not contain return statements |
4746 * that both have and do not have return values. | 4748 * that both have and do not have return values. |
(...skipping 2144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6891 _checkForMissingRequiredParam( | 6893 _checkForMissingRequiredParam( |
6892 node.staticInvokeType, node.argumentList, node); | 6894 node.staticInvokeType, node.argumentList, node); |
6893 return super.visitFunctionExpressionInvocation(node); | 6895 return super.visitFunctionExpressionInvocation(node); |
6894 } | 6896 } |
6895 | 6897 |
6896 @override | 6898 @override |
6897 Object visitInstanceCreationExpression(InstanceCreationExpression node) { | 6899 Object visitInstanceCreationExpression(InstanceCreationExpression node) { |
6898 DartType type = node.constructorName.type.type; | 6900 DartType type = node.constructorName.type.type; |
6899 if (type is InterfaceType) { | 6901 if (type is InterfaceType) { |
6900 _checkForMissingRequiredParam( | 6902 _checkForMissingRequiredParam( |
6901 node.staticElement?.type, node.argumentList, node.constructorName); | 6903 staticElementForConstructorReference(node)?.type, |
| 6904 node.argumentList, |
| 6905 node.constructorName); |
6902 } | 6906 } |
6903 return super.visitInstanceCreationExpression(node); | 6907 return super.visitInstanceCreationExpression(node); |
6904 } | 6908 } |
6905 | 6909 |
6906 @override | 6910 @override |
6907 Object visitMethodInvocation(MethodInvocation node) { | 6911 Object visitMethodInvocation(MethodInvocation node) { |
6908 _checkForMissingRequiredParam( | 6912 _checkForMissingRequiredParam( |
6909 node.staticInvokeType, node.argumentList, node.methodName); | 6913 node.staticInvokeType, node.argumentList, node.methodName); |
6910 return super.visitMethodInvocation(node); | 6914 return super.visitMethodInvocation(node); |
6911 } | 6915 } |
6912 | 6916 |
6913 @override | 6917 @override |
6914 Object visitRedirectingConstructorInvocation( | 6918 Object visitRedirectingConstructorInvocation( |
6915 RedirectingConstructorInvocation node) { | 6919 RedirectingConstructorInvocation node) { |
6916 DartType type = node.staticElement?.type; | 6920 DartType type = staticElementForConstructorReference(node)?.type; |
6917 if (type != null) { | 6921 if (type != null) { |
6918 _checkForMissingRequiredParam(type, node.argumentList, node); | 6922 _checkForMissingRequiredParam(type, node.argumentList, node); |
6919 } | 6923 } |
6920 return super.visitRedirectingConstructorInvocation(node); | 6924 return super.visitRedirectingConstructorInvocation(node); |
6921 } | 6925 } |
6922 | 6926 |
6923 @override | 6927 @override |
6924 Object visitSuperConstructorInvocation(SuperConstructorInvocation node) { | 6928 Object visitSuperConstructorInvocation(SuperConstructorInvocation node) { |
6925 DartType type = node.staticElement?.type; | 6929 DartType type = staticElementForConstructorReference(node)?.type; |
6926 if (type != null) { | 6930 if (type != null) { |
6927 _checkForMissingRequiredParam(type, node.argumentList, node); | 6931 _checkForMissingRequiredParam(type, node.argumentList, node); |
6928 } | 6932 } |
6929 return super.visitSuperConstructorInvocation(node); | 6933 return super.visitSuperConstructorInvocation(node); |
6930 } | 6934 } |
6931 | 6935 |
6932 void _checkForMissingRequiredParam( | 6936 void _checkForMissingRequiredParam( |
6933 DartType type, ArgumentList argumentList, AstNode node) { | 6937 DartType type, ArgumentList argumentList, AstNode node) { |
6934 if (type is FunctionType) { | 6938 if (type is FunctionType) { |
6935 for (ParameterElement parameter in type.parameters) { | 6939 for (ParameterElement parameter in type.parameters) { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6972 class _InvocationCollector extends RecursiveAstVisitor { | 6976 class _InvocationCollector extends RecursiveAstVisitor { |
6973 final List<String> superCalls = <String>[]; | 6977 final List<String> superCalls = <String>[]; |
6974 | 6978 |
6975 @override | 6979 @override |
6976 visitMethodInvocation(MethodInvocation node) { | 6980 visitMethodInvocation(MethodInvocation node) { |
6977 if (node.target is SuperExpression) { | 6981 if (node.target is SuperExpression) { |
6978 superCalls.add(node.methodName.name); | 6982 superCalls.add(node.methodName.name); |
6979 } | 6983 } |
6980 } | 6984 } |
6981 } | 6985 } |
OLD | NEW |