Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(30)

Side by Side Diff: pkg/analyzer/lib/src/generated/error_verifier.dart

Issue 1780783002: Don't report redundant type errors in strong mode. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Stop type propagation in test. Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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';
(...skipping 828 matching lines...) Expand 10 before | Expand all | Expand 10 after
839 TypeArgumentList typeArguments = node.typeArguments; 839 TypeArgumentList typeArguments = node.typeArguments;
840 if (typeArguments != null) { 840 if (typeArguments != null) {
841 if (node.constKeyword != null) { 841 if (node.constKeyword != null) {
842 NodeList<TypeName> arguments = typeArguments.arguments; 842 NodeList<TypeName> arguments = typeArguments.arguments;
843 if (arguments.length != 0) { 843 if (arguments.length != 0) {
844 _checkForInvalidTypeArgumentInConstTypedLiteral(arguments, 844 _checkForInvalidTypeArgumentInConstTypedLiteral(arguments,
845 CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST); 845 CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_LIST);
846 } 846 }
847 } 847 }
848 _checkForExpectedOneListTypeArgument(node, typeArguments); 848 _checkForExpectedOneListTypeArgument(node, typeArguments);
849 _checkForListElementTypeNotAssignable(node, typeArguments);
850 } 849 }
850
851 _checkForListElementTypeNotAssignable(node);
851 return super.visitListLiteral(node); 852 return super.visitListLiteral(node);
852 } 853 }
853 854
854 @override 855 @override
855 Object visitMapLiteral(MapLiteral node) { 856 Object visitMapLiteral(MapLiteral node) {
856 TypeArgumentList typeArguments = node.typeArguments; 857 TypeArgumentList typeArguments = node.typeArguments;
857 if (typeArguments != null) { 858 if (typeArguments != null) {
858 NodeList<TypeName> arguments = typeArguments.arguments; 859 NodeList<TypeName> arguments = typeArguments.arguments;
859 if (arguments.length != 0) { 860 if (arguments.length != 0) {
860 if (node.constKeyword != null) { 861 if (node.constKeyword != null) {
861 _checkForInvalidTypeArgumentInConstTypedLiteral(arguments, 862 _checkForInvalidTypeArgumentInConstTypedLiteral(arguments,
862 CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP); 863 CompileTimeErrorCode.INVALID_TYPE_ARGUMENT_IN_CONST_MAP);
863 } 864 }
864 } 865 }
865 _checkExpectedTwoMapTypeArguments(typeArguments); 866 _checkExpectedTwoMapTypeArguments(typeArguments);
866 _checkForMapTypeNotAssignable(node, typeArguments);
867 } 867 }
868
869 _checkForMapTypeNotAssignable(node);
868 _checkForNonConstMapAsExpressionStatement(node); 870 _checkForNonConstMapAsExpressionStatement(node);
869 return super.visitMapLiteral(node); 871 return super.visitMapLiteral(node);
870 } 872 }
871 873
872 @override 874 @override
873 Object visitMethodDeclaration(MethodDeclaration node) { 875 Object visitMethodDeclaration(MethodDeclaration node) {
874 ExecutableElement previousFunction = _enclosingFunction; 876 ExecutableElement previousFunction = _enclosingFunction;
875 try { 877 try {
876 _isInStaticMethod = node.isStatic; 878 _isInStaticMethod = node.isStatic;
877 _enclosingFunction = node.element; 879 _enclosingFunction = node.element;
(...skipping 3153 matching lines...) Expand 10 before | Expand all | Expand 10 after
4031 for (TypeName typeName in arguments) { 4033 for (TypeName typeName in arguments) {
4032 if (typeName.type is TypeParameterType) { 4034 if (typeName.type is TypeParameterType) {
4033 _errorReporter.reportErrorForNode(errorCode, typeName, [typeName.name]); 4035 _errorReporter.reportErrorForNode(errorCode, typeName, [typeName.name]);
4034 foundError = true; 4036 foundError = true;
4035 } 4037 }
4036 } 4038 }
4037 return foundError; 4039 return foundError;
4038 } 4040 }
4039 4041
4040 /** 4042 /**
4041 * Verify that the elements given list [literal] are subtypes of the specified 4043 * Verify that the elements given list [literal] are subtypes of the list's
4042 * element type. The [typeArguments] are the type arguments. 4044 * static type.
4043 * 4045 *
4044 * See [CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE], and 4046 * See [CompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE], and
4045 * [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE]. 4047 * [StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE].
4046 */ 4048 */
4047 bool _checkForListElementTypeNotAssignable( 4049 void _checkForListElementTypeNotAssignable(ListLiteral literal) {
4048 ListLiteral literal, TypeArgumentList typeArguments) { 4050 // Determine the list's element type. We base this on the static type and
4049 NodeList<TypeName> typeNames = typeArguments.arguments; 4051 // not the literal's type arguments because in strong mode, the type
4050 if (typeNames.length < 1) { 4052 // arguments may be inferred.
4051 return false; 4053 DartType listType = literal.staticType;
4052 } 4054 assert(listType is InterfaceTypeImpl);
4053 DartType listElementType = typeNames[0].type; 4055
4056 List<DartType> typeArguments =
4057 (listType as InterfaceTypeImpl).typeArguments;
4058 assert(typeArguments.length == 1);
4059
4060 DartType listElementType = typeArguments[0];
4061
4054 // Check every list element. 4062 // Check every list element.
4055 bool hasProblems = false;
4056 for (Expression element in literal.elements) { 4063 for (Expression element in literal.elements) {
4057 if (literal.constKeyword != null) { 4064 if (literal.constKeyword != null) {
4058 // TODO(paulberry): this error should be based on the actual type of the 4065 // TODO(paulberry): this error should be based on the actual type of the
4059 // list element, not the static type. See dartbug.com/21119. 4066 // list element, not the static type. See dartbug.com/21119.
4060 if (_checkForArgumentTypeNotAssignableWithExpectedTypes( 4067 _checkForArgumentTypeNotAssignableWithExpectedTypes(
4061 element, 4068 element,
4062 listElementType, 4069 listElementType,
4063 CheckedModeCompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE)) { 4070 CheckedModeCompileTimeErrorCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE);
4064 hasProblems = true;
4065 }
4066 } 4071 }
4067 if (_checkForArgumentTypeNotAssignableWithExpectedTypes( 4072 _checkForArgumentTypeNotAssignableWithExpectedTypes(element,
4068 element, 4073 listElementType, StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE);
4069 listElementType,
4070 StaticWarningCode.LIST_ELEMENT_TYPE_NOT_ASSIGNABLE)) {
4071 hasProblems = true;
4072 }
4073 } 4074 }
4074 return hasProblems;
4075 } 4075 }
4076 4076
4077 /** 4077 /**
4078 * Verify that the key/value of entries of the given map [literal] are 4078 * Verify that the key/value of entries of the given map [literal] are
4079 * subtypes of the key/value types specified in the type arguments. The 4079 * subtypes of the map's static type.
4080 * [typeArguments] are the type arguments.
4081 * 4080 *
4082 * See [CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE], 4081 * See [CompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE],
4083 * [CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE], 4082 * [CompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE],
4084 * [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE], and 4083 * [StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE], and
4085 * [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE]. 4084 * [StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE].
4086 */ 4085 */
4087 bool _checkForMapTypeNotAssignable( 4086 void _checkForMapTypeNotAssignable(MapLiteral literal) {
4088 MapLiteral literal, TypeArgumentList typeArguments) { 4087 // Determine the map's key and value types. We base this on the static type
4089 // Prepare maps key/value types. 4088 // and not the literal's type arguments because in strong mode, the type
4090 NodeList<TypeName> typeNames = typeArguments.arguments; 4089 // arguments may be inferred.
4091 if (typeNames.length < 2) { 4090 DartType mapType = literal.staticType;
4092 return false; 4091 assert(mapType is InterfaceTypeImpl);
4093 } 4092
4094 DartType keyType = typeNames[0].type; 4093 List<DartType> typeArguments =
4095 DartType valueType = typeNames[1].type; 4094 (mapType as InterfaceTypeImpl).typeArguments;
4096 // Check every map entry. 4095 assert(typeArguments.length == 2);
4097 bool hasProblems = false; 4096 DartType keyType = typeArguments[0];
4097 DartType valueType = typeArguments[1];
4098
4098 NodeList<MapLiteralEntry> entries = literal.entries; 4099 NodeList<MapLiteralEntry> entries = literal.entries;
4099 for (MapLiteralEntry entry in entries) { 4100 for (MapLiteralEntry entry in entries) {
4100 Expression key = entry.key; 4101 Expression key = entry.key;
4101 Expression value = entry.value; 4102 Expression value = entry.value;
4102 if (literal.constKeyword != null) { 4103 if (literal.constKeyword != null) {
4103 // TODO(paulberry): this error should be based on the actual type of the 4104 // TODO(paulberry): this error should be based on the actual type of the
4104 // list element, not the static type. See dartbug.com/21119. 4105 // list element, not the static type. See dartbug.com/21119.
4105 if (_checkForArgumentTypeNotAssignableWithExpectedTypes(key, keyType, 4106 _checkForArgumentTypeNotAssignableWithExpectedTypes(key, keyType,
4106 CheckedModeCompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE)) { 4107 CheckedModeCompileTimeErrorCode.MAP_KEY_TYPE_NOT_ASSIGNABLE);
4107 hasProblems = true; 4108 _checkForArgumentTypeNotAssignableWithExpectedTypes(
4108 }
4109 if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
4110 value, 4109 value,
4111 valueType, 4110 valueType,
4112 CheckedModeCompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE)) { 4111 CheckedModeCompileTimeErrorCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE);
4113 hasProblems = true;
4114 }
4115 } 4112 }
4116 if (_checkForArgumentTypeNotAssignableWithExpectedTypes( 4113 _checkForArgumentTypeNotAssignableWithExpectedTypes(
4117 key, keyType, StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE)) { 4114 key, keyType, StaticWarningCode.MAP_KEY_TYPE_NOT_ASSIGNABLE);
4118 hasProblems = true; 4115 _checkForArgumentTypeNotAssignableWithExpectedTypes(
4119 } 4116 value, valueType, StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE);
4120 if (_checkForArgumentTypeNotAssignableWithExpectedTypes(
4121 value, valueType, StaticWarningCode.MAP_VALUE_TYPE_NOT_ASSIGNABLE)) {
4122 hasProblems = true;
4123 }
4124 } 4117 }
4125 return hasProblems;
4126 } 4118 }
4127 4119
4128 /** 4120 /**
4129 * Verify that the [_enclosingClass] does not define members with the same nam e 4121 * Verify that the [_enclosingClass] does not define members with the same nam e
4130 * as the enclosing class. 4122 * as the enclosing class.
4131 * 4123 *
4132 * See [CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME]. 4124 * See [CompileTimeErrorCode.MEMBER_WITH_CLASS_NAME].
4133 */ 4125 */
4134 bool _checkForMemberWithClassName() { 4126 bool _checkForMemberWithClassName() {
4135 if (_enclosingClass == null) { 4127 if (_enclosingClass == null) {
(...skipping 1551 matching lines...) Expand 10 before | Expand all | Expand 10 after
5687 SimpleIdentifier variable = node.identifier != null 5679 SimpleIdentifier variable = node.identifier != null
5688 ? node.identifier 5680 ? node.identifier
5689 : node.loopVariable.identifier; 5681 : node.loopVariable.identifier;
5690 DartType variableType = getStaticType(variable); 5682 DartType variableType = getStaticType(variable);
5691 5683
5692 DartType loopType = node.awaitKeyword != null 5684 DartType loopType = node.awaitKeyword != null
5693 ? _typeProvider.streamType 5685 ? _typeProvider.streamType
5694 : _typeProvider.iterableType; 5686 : _typeProvider.iterableType;
5695 5687
5696 // Use an explicit string instead of [loopType] to remove the "<E>". 5688 // Use an explicit string instead of [loopType] to remove the "<E>".
5697 String loopTypeName = node.awaitKeyword != null 5689 String loopTypeName = node.awaitKeyword != null ? "Stream" : "Iterable";
5698 ? "Stream"
5699 : "Iterable";
5700 5690
5701 // The object being iterated has to implement Iterable<T> for some T that 5691 // The object being iterated has to implement Iterable<T> for some T that
5702 // is assignable to the variable's type. 5692 // is assignable to the variable's type.
5703 // TODO(rnystrom): Move this into mostSpecificTypeArgument()? 5693 // TODO(rnystrom): Move this into mostSpecificTypeArgument()?
5704 iterableType = iterableType.resolveToBound(_typeProvider.objectType); 5694 iterableType = iterableType.resolveToBound(_typeProvider.objectType);
5705 DartType bestIterableType = _typeSystem.mostSpecificTypeArgument( 5695 DartType bestIterableType =
5706 iterableType, loopType); 5696 _typeSystem.mostSpecificTypeArgument(iterableType, loopType);
5707 if (bestIterableType == null) { 5697 if (bestIterableType == null) {
5708 _errorReporter.reportTypeErrorForNode( 5698 _errorReporter.reportTypeErrorForNode(
5709 StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE, 5699 StaticTypeWarningCode.FOR_IN_OF_INVALID_TYPE,
5710 node, 5700 node.iterable,
5711 [iterableType, loopTypeName]); 5701 [iterableType, loopTypeName]);
5712 } else if (!_typeSystem.isAssignableTo(bestIterableType, variableType)) { 5702 } else if (!_typeSystem.isAssignableTo(bestIterableType, variableType)) {
5713 _errorReporter.reportTypeErrorForNode( 5703 _errorReporter.reportTypeErrorForNode(
5714 StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE, 5704 StaticTypeWarningCode.FOR_IN_OF_INVALID_ELEMENT_TYPE,
5715 node, 5705 node.iterable,
5716 [iterableType, loopTypeName, variableType]); 5706 [iterableType, loopTypeName, variableType]);
5717 } 5707 }
5718 } 5708 }
5719 5709
5720 /** 5710 /**
5721 * Check for a type mis-match between the yielded type and the declared 5711 * Check for a type mis-match between the yielded type and the declared
5722 * return type of a generator function. 5712 * return type of a generator function.
5723 * 5713 *
5724 * This method should only be called in generator functions. 5714 * This method should only be called in generator functions.
5725 */ 5715 */
(...skipping 598 matching lines...) Expand 10 before | Expand all | Expand 10 after
6324 class _InvocationCollector extends RecursiveAstVisitor { 6314 class _InvocationCollector extends RecursiveAstVisitor {
6325 final List<String> superCalls = <String>[]; 6315 final List<String> superCalls = <String>[];
6326 6316
6327 @override 6317 @override
6328 visitMethodInvocation(MethodInvocation node) { 6318 visitMethodInvocation(MethodInvocation node) {
6329 if (node.target is SuperExpression) { 6319 if (node.target is SuperExpression) {
6330 superCalls.add(node.methodName.name); 6320 superCalls.add(node.methodName.name);
6331 } 6321 }
6332 } 6322 }
6333 } 6323 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/source/error_processor.dart ('k') | pkg/analyzer/lib/src/generated/type_system.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698