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

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 'ast.dart'; 9 import 'ast.dart';
10 import 'constant.dart'; 10 import 'constant.dart';
(...skipping 14434 matching lines...) Expand 10 before | Expand all | Expand 10 after
14445 } 14445 }
14446 } 14446 }
14447 _setElement(typeName, _dynamicType.element); 14447 _setElement(typeName, _dynamicType.element);
14448 typeName.staticType = _dynamicType; 14448 typeName.staticType = _dynamicType;
14449 node.type = _dynamicType; 14449 node.type = _dynamicType;
14450 return null; 14450 return null;
14451 } 14451 }
14452 if (argumentList != null) { 14452 if (argumentList != null) {
14453 NodeList<TypeName> arguments = argumentList.arguments; 14453 NodeList<TypeName> arguments = argumentList.arguments;
14454 int argumentCount = arguments.length; 14454 int argumentCount = arguments.length;
14455 List<DartType> parameters = _getTypeArguments(type); 14455 List<DartType> parameters = _getTypeParameters(type);
14456 int parameterCount = parameters.length; 14456 int parameterCount = parameters.length;
14457 List<DartType> typeArguments = new List<DartType>(parameterCount); 14457 List<DartType> typeArguments = new List<DartType>(parameterCount);
14458 if (argumentCount == parameterCount) { 14458 if (argumentCount == parameterCount) {
14459 for (int i = 0; i < parameterCount; i++) { 14459 for (int i = 0; i < parameterCount; i++) {
14460 TypeName argumentTypeName = arguments[i]; 14460 TypeName argumentTypeName = arguments[i];
14461 DartType argumentType = _getType(argumentTypeName); 14461 DartType argumentType = _getType(argumentTypeName);
14462 if (argumentType == null) { 14462 if (argumentType == null) {
14463 argumentType = _dynamicType; 14463 argumentType = _dynamicType;
14464 } 14464 }
14465 typeArguments[i] = argumentType; 14465 typeArguments[i] = argumentType;
14466 } 14466 }
14467 } else { 14467 } else {
14468 reportErrorForNode(_getInvalidTypeParametersErrorCode(node), node, 14468 reportErrorForNode(_getInvalidTypeParametersErrorCode(node), node,
14469 [typeName.name, parameterCount, argumentCount]); 14469 [typeName.name, parameterCount, argumentCount]);
14470 for (int i = 0; i < parameterCount; i++) { 14470 for (int i = 0; i < parameterCount; i++) {
14471 typeArguments[i] = _dynamicType; 14471 typeArguments[i] = _dynamicType;
14472 } 14472 }
14473 } 14473 }
14474 if (type is InterfaceTypeImpl) { 14474 type = _instantiateType(type, typeArguments);
14475 InterfaceTypeImpl interfaceType = type as InterfaceTypeImpl;
14476 type = interfaceType.substitute4(typeArguments);
14477 } else if (type is FunctionTypeImpl) {
14478 FunctionTypeImpl functionType = type as FunctionTypeImpl;
14479 type = functionType.substitute3(typeArguments);
14480 } else {
14481 // TODO(brianwilkerson) Report this internal error.
14482 }
14483 } else { 14475 } else {
14484 // 14476 //
14485 // Check for the case where there are no type arguments given for a 14477 // Check for the case where there are no type arguments given for a
14486 // parameterized type. 14478 // parameterized type.
14487 // 14479 //
14488 List<DartType> parameters = _getTypeArguments(type); 14480 List<DartType> parameters = _getTypeParameters(type);
14489 int parameterCount = parameters.length; 14481 int parameterCount = parameters.length;
14490 if (parameterCount > 0) { 14482 if (parameterCount > 0) {
14491 DynamicTypeImpl dynamicType = DynamicTypeImpl.instance; 14483 DynamicTypeImpl dynamicType = DynamicTypeImpl.instance;
14492 List<DartType> arguments = new List<DartType>(parameterCount); 14484 List<DartType> arguments = new List<DartType>(parameterCount);
14493 for (int i = 0; i < parameterCount; i++) { 14485 for (int i = 0; i < parameterCount; i++) {
14494 arguments[i] = dynamicType; 14486 arguments[i] = dynamicType;
14495 } 14487 }
14496 type = type.substitute2(arguments, parameters); 14488 type = _instantiateType(type, arguments);
14497 } 14489 }
14498 } 14490 }
14499 typeName.staticType = type; 14491 typeName.staticType = type;
14500 node.type = type; 14492 node.type = type;
14501 return null; 14493 return null;
14502 } 14494 }
14503 14495
14504 @override 14496 @override
14505 Object visitTypeParameter(TypeParameter node) { 14497 Object visitTypeParameter(TypeParameter node) {
14506 super.visitTypeParameter(node); 14498 super.visitTypeParameter(node);
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
14671 } 14663 }
14672 return type; 14664 return type;
14673 } 14665 }
14674 14666
14675 /** 14667 /**
14676 * Return the type arguments associated with the given type. 14668 * Return the type arguments associated with the given type.
14677 * 14669 *
14678 * @param type the type whole type arguments are to be returned 14670 * @param type the type whole type arguments are to be returned
14679 * @return the type arguments associated with the given type 14671 * @return the type arguments associated with the given type
14680 */ 14672 */
14681 List<DartType> _getTypeArguments(DartType type) { 14673 List<DartType> _getTypeParameters(DartType type) {
14682 if (type is InterfaceType) { 14674 if (type is InterfaceType) {
14683 return type.typeArguments; 14675 return type.typeArguments;
14684 } else if (type is FunctionType) { 14676 } else if (type is FunctionType) {
14685 return type.typeArguments; 14677 return TypeParameterTypeImpl.getTypes(type.boundTypeParameters);
14686 } 14678 }
14687 return DartType.EMPTY_LIST; 14679 return DartType.EMPTY_LIST;
14688 } 14680 }
14689 14681
14690 /** 14682 /**
14691 * Returns the simple identifier of the given (may be qualified) type name. 14683 * Returns the simple identifier of the given (may be qualified) type name.
14692 * 14684 *
14693 * @param typeName the (may be qualified) qualified type name 14685 * @param typeName the (may be qualified) qualified type name
14694 * @return the simple identifier of the given (may be qualified) type name. 14686 * @return the simple identifier of the given (may be qualified) type name.
14695 */ 14687 */
(...skipping 18 matching lines...) Expand all
14714 if (element is ClassElement) { 14706 if (element is ClassElement) {
14715 if (type != null) { 14707 if (type != null) {
14716 return null; 14708 return null;
14717 } 14709 }
14718 type = element.type; 14710 type = element.type;
14719 } 14711 }
14720 } 14712 }
14721 return type; 14713 return type;
14722 } 14714 }
14723 14715
14716 DartType _instantiateType(DartType type, List<DartType> typeArguments) {
14717 if (type is InterfaceTypeImpl) {
14718 return type.substitute4(typeArguments);
14719 } else if (type is FunctionTypeImpl) {
14720 return type.instantiate(typeArguments);
14721 } else {
14722 // TODO(brianwilkerson) Report this internal error.
14723 return type;
14724 }
14725 }
14726
14724 /** 14727 /**
14725 * Checks if the given type name is used as the type in an as expression. 14728 * Checks if the given type name is used as the type in an as expression.
14726 * 14729 *
14727 * @param typeName the type name to analyzer 14730 * @param typeName the type name to analyzer
14728 * @return `true` if the given type name is used as the type in an as expressi on 14731 * @return `true` if the given type name is used as the type in an as expressi on
14729 */ 14732 */
14730 bool _isTypeNameInAsExpression(TypeName typeName) { 14733 bool _isTypeNameInAsExpression(TypeName typeName) {
14731 AstNode parent = typeName.parent; 14734 AstNode parent = typeName.parent;
14732 if (parent is AsExpression) { 14735 if (parent is AsExpression) {
14733 AsExpression asExpression = parent; 14736 AsExpression asExpression = parent;
(...skipping 828 matching lines...) Expand 10 before | Expand all | Expand 10 after
15562 nonFields.add(node); 15565 nonFields.add(node);
15563 return null; 15566 return null;
15564 } 15567 }
15565 15568
15566 @override 15569 @override
15567 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this); 15570 Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this);
15568 15571
15569 @override 15572 @override
15570 Object visitWithClause(WithClause node) => null; 15573 Object visitWithClause(WithClause node) => null;
15571 } 15574 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698