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

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

Issue 1488383004: Fixes incorrect generic function type capture (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 5 years 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 engine.resolver; 5 library engine.resolver;
6 6
7 import 'dart:collection'; 7 import 'dart:collection';
8 8
9 import '../task/strong/info.dart' show InferredType, StaticInfo; 9 import '../task/strong/info.dart' show InferredType, StaticInfo;
10 import '../task/strong/rules.dart' show TypeRules; 10 import '../task/strong/rules.dart' show TypeRules;
(...skipping 14941 matching lines...) Expand 10 before | Expand all | Expand 10 after
14952 } 14952 }
14953 } 14953 }
14954 _setElement(typeName, _dynamicType.element); 14954 _setElement(typeName, _dynamicType.element);
14955 typeName.staticType = _dynamicType; 14955 typeName.staticType = _dynamicType;
14956 node.type = _dynamicType; 14956 node.type = _dynamicType;
14957 return null; 14957 return null;
14958 } 14958 }
14959 if (argumentList != null) { 14959 if (argumentList != null) {
14960 NodeList<TypeName> arguments = argumentList.arguments; 14960 NodeList<TypeName> arguments = argumentList.arguments;
14961 int argumentCount = arguments.length; 14961 int argumentCount = arguments.length;
14962 List<DartType> parameters = _getTypeArguments(type); 14962 List<DartType> parameters = _getTypeParameters(type);
14963 int parameterCount = parameters.length; 14963 int parameterCount = parameters.length;
14964 List<DartType> typeArguments = new List<DartType>(parameterCount); 14964 List<DartType> typeArguments = new List<DartType>(parameterCount);
14965 if (argumentCount == parameterCount) { 14965 if (argumentCount == parameterCount) {
14966 for (int i = 0; i < parameterCount; i++) { 14966 for (int i = 0; i < parameterCount; i++) {
14967 TypeName argumentTypeName = arguments[i]; 14967 TypeName argumentTypeName = arguments[i];
14968 DartType argumentType = _getType(argumentTypeName); 14968 DartType argumentType = _getType(argumentTypeName);
14969 if (argumentType == null) { 14969 if (argumentType == null) {
14970 argumentType = _dynamicType; 14970 argumentType = _dynamicType;
14971 } 14971 }
14972 typeArguments[i] = argumentType; 14972 typeArguments[i] = argumentType;
14973 } 14973 }
14974 } else { 14974 } else {
14975 reportErrorForNode(_getInvalidTypeParametersErrorCode(node), node, 14975 reportErrorForNode(_getInvalidTypeParametersErrorCode(node), node,
14976 [typeName.name, parameterCount, argumentCount]); 14976 [typeName.name, parameterCount, argumentCount]);
14977 for (int i = 0; i < parameterCount; i++) { 14977 for (int i = 0; i < parameterCount; i++) {
14978 typeArguments[i] = _dynamicType; 14978 typeArguments[i] = _dynamicType;
14979 } 14979 }
14980 } 14980 }
14981 if (type is InterfaceTypeImpl) { 14981 type = _instantiateType(type, typeArguments);
14982 InterfaceTypeImpl interfaceType = type as InterfaceTypeImpl;
14983 type = interfaceType.substitute4(typeArguments);
14984 } else if (type is FunctionTypeImpl) {
14985 FunctionTypeImpl functionType = type as FunctionTypeImpl;
14986 type = functionType.substitute3(typeArguments);
14987 } else {
14988 // TODO(brianwilkerson) Report this internal error.
14989 }
14990 } else { 14982 } else {
14991 // 14983 //
14992 // Check for the case where there are no type arguments given for a 14984 // Check for the case where there are no type arguments given for a
14993 // parameterized type. 14985 // parameterized type.
14994 // 14986 //
14995 List<DartType> parameters = _getTypeArguments(type); 14987 List<DartType> parameters = _getTypeParameters(type);
14996 int parameterCount = parameters.length; 14988 int parameterCount = parameters.length;
14997 if (parameterCount > 0) { 14989 if (parameterCount > 0) {
14998 DynamicTypeImpl dynamicType = DynamicTypeImpl.instance; 14990 DynamicTypeImpl dynamicType = DynamicTypeImpl.instance;
14999 List<DartType> arguments = new List<DartType>(parameterCount); 14991 List<DartType> arguments = new List<DartType>(parameterCount);
15000 for (int i = 0; i < parameterCount; i++) { 14992 for (int i = 0; i < parameterCount; i++) {
15001 arguments[i] = dynamicType; 14993 arguments[i] = dynamicType;
15002 } 14994 }
15003 type = type.substitute2(arguments, parameters); 14995 type = _instantiateType(type, arguments);
15004 } 14996 }
15005 } 14997 }
15006 typeName.staticType = type; 14998 typeName.staticType = type;
15007 node.type = type; 14999 node.type = type;
15008 return null; 15000 return null;
15009 } 15001 }
15010 15002
15011 @override 15003 @override
15012 Object visitTypeParameter(TypeParameter node) { 15004 Object visitTypeParameter(TypeParameter node) {
15013 super.visitTypeParameter(node); 15005 super.visitTypeParameter(node);
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
15178 } 15170 }
15179 return type; 15171 return type;
15180 } 15172 }
15181 15173
15182 /** 15174 /**
15183 * Return the type arguments associated with the given type. 15175 * Return the type arguments associated with the given type.
15184 * 15176 *
15185 * @param type the type whole type arguments are to be returned 15177 * @param type the type whole type arguments are to be returned
15186 * @return the type arguments associated with the given type 15178 * @return the type arguments associated with the given type
15187 */ 15179 */
15188 List<DartType> _getTypeArguments(DartType type) { 15180 List<DartType> _getTypeParameters(DartType type) {
15189 if (type is InterfaceType) { 15181 if (type is InterfaceType) {
15190 return type.typeArguments; 15182 return type.typeArguments;
15191 } else if (type is FunctionType) { 15183 } else if (type is FunctionType) {
15192 return type.typeArguments; 15184 return TypeParameterTypeImpl.getTypes(type.boundTypeParameters);
15193 } 15185 }
15194 return DartType.EMPTY_LIST; 15186 return DartType.EMPTY_LIST;
15195 } 15187 }
15196 15188
15197 /** 15189 /**
15198 * Returns the simple identifier of the given (may be qualified) type name. 15190 * Returns the simple identifier of the given (may be qualified) type name.
15199 * 15191 *
15200 * @param typeName the (may be qualified) qualified type name 15192 * @param typeName the (may be qualified) qualified type name
15201 * @return the simple identifier of the given (may be qualified) type name. 15193 * @return the simple identifier of the given (may be qualified) type name.
15202 */ 15194 */
(...skipping 18 matching lines...) Expand all
15221 if (element is ClassElement) { 15213 if (element is ClassElement) {
15222 if (type != null) { 15214 if (type != null) {
15223 return null; 15215 return null;
15224 } 15216 }
15225 type = element.type; 15217 type = element.type;
15226 } 15218 }
15227 } 15219 }
15228 return type; 15220 return type;
15229 } 15221 }
15230 15222
15223 DartType _instantiateType(DartType type, List<DartType> typeArguments) {
15224 if (type is InterfaceTypeImpl) {
15225 return type.substitute4(typeArguments);
15226 } else if (type is FunctionTypeImpl) {
15227 return type.instantiate(typeArguments);
15228 } else {
15229 // TODO(brianwilkerson) Report this internal error.
15230 return type;
15231 }
15232 }
15233
15231 /** 15234 /**
15232 * Checks if the given type name is used as the type in an as expression. 15235 * Checks if the given type name is used as the type in an as expression.
15233 * 15236 *
15234 * @param typeName the type name to analyzer 15237 * @param typeName the type name to analyzer
15235 * @return `true` if the given type name is used as the type in an as expressi on 15238 * @return `true` if the given type name is used as the type in an as expressi on
15236 */ 15239 */
15237 bool _isTypeNameInAsExpression(TypeName typeName) { 15240 bool _isTypeNameInAsExpression(TypeName typeName) {
15238 AstNode parent = typeName.parent; 15241 AstNode parent = typeName.parent;
15239 if (parent is AsExpression) { 15242 if (parent is AsExpression) {
15240 AsExpression asExpression = parent; 15243 AsExpression asExpression = parent;
(...skipping 828 matching lines...) Expand 10 before | Expand all | Expand 10 after
16069 nonFields.add(node); 16072 nonFields.add(node);
16070 return null; 16073 return null;
16071 } 16074 }
16072 16075
16073 @override 16076 @override
16074 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this); 16077 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this);
16075 16078
16076 @override 16079 @override
16077 Object visitWithClause(WithClause node) => null; 16080 Object visitWithClause(WithClause node) => null;
16078 } 16081 }
OLDNEW
« no previous file with comments | « pkg/analyzer/lib/src/generated/element.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