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

Unified Diff: pkg/analyzer/lib/src/generated/static_type_analyzer.dart

Issue 1720433002: fixes #25477, downward inference of generic methods (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Created 4 years, 10 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 side-by-side diff with in-line comments
Download patch
Index: pkg/analyzer/lib/src/generated/static_type_analyzer.dart
diff --git a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
index cc8e2f06e5ca9c4f409d14c684c20f332974cef1..c487796cbbda23609768132559c765cebfdeeb75 100644
--- a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
+++ b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
@@ -510,7 +510,7 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
@override
Object visitFunctionExpressionInvocation(FunctionExpressionInvocation node) {
if (_strongMode) {
- _inferFunctionInvocationGeneric(node);
+ _inferGenericInvoke(node);
}
DartType staticType = _computeInvokeReturnType(node.staticInvokeType);
_recordStaticType(node, staticType);
@@ -742,7 +742,7 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
SimpleIdentifier methodNameNode = node.methodName;
Element staticMethodElement = methodNameNode.staticElement;
if (_strongMode) {
- _inferMethodInvocationGeneric(node);
+ _inferGenericInvoke(node);
}
// Record types of the variable invoked as a function.
if (staticMethodElement is VariableElement) {
@@ -1815,26 +1815,6 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
}
/**
- * Similar to [_inferMethodInvocationGeneric] but for function expression
- * invocations.
- */
- // TODO(jmesserly): if we had a common AST interface between these two nodes,
- // we could remove this duplicated code.
- bool _inferFunctionInvocationGeneric(FunctionExpressionInvocation node) {
- DartType instantiatedType = node.staticInvokeType;
- DartType originalType = node.function.staticType;
- if (instantiatedType is FunctionType && originalType is FunctionType) {
- FunctionType inferred = _inferGenericInvoke(instantiatedType,
- originalType, node.typeArguments, node.argumentList);
- if (inferred != null) {
- node.staticInvokeType = inferred;
- return true;
- }
- }
- return false;
- }
-
- /**
* Given an uninstantiated generic type, try to infer the instantiated generic
* type from the surrounding context.
*/
@@ -1849,41 +1829,42 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
return type;
}
- FunctionType _inferGenericInvoke(FunctionType invokeType, FunctionType fnType,
- TypeArgumentList typeArguments, ArgumentList argumentList) {
+ bool _inferGenericInvoke(InvocationExpression node) {
TypeSystem ts = _typeSystem;
- if (typeArguments == null && ts is StrongTypeSystemImpl) {
- if (fnType.typeFormals.isNotEmpty &&
- ts.instantiateToBounds(fnType) == invokeType) {
- // Get the parameters that correspond to the uninstantiated generic.
- List<ParameterElement> rawParameters =
- ResolverVisitor.resolveArgumentsToParameters(
- argumentList, fnType.parameters, null);
-
- List<DartType> paramTypes = <DartType>[];
- List<DartType> argTypes = <DartType>[];
- for (int i = 0, length = rawParameters.length; i < length; i++) {
- ParameterElement parameter = rawParameters[i];
- if (parameter != null) {
- paramTypes.add(parameter.type);
- argTypes.add(argumentList.arguments[i].staticType);
- }
+ DartType fnType = node.function.staticType;
+ if (node.typeArguments == null &&
+ fnType is FunctionType &&
+ fnType.typeFormals.isNotEmpty &&
+ ts is StrongTypeSystemImpl) {
+ ArgumentList argumentList = node.argumentList;
+ // Get the parameters that correspond to the uninstantiated generic.
+ List<ParameterElement> rawParameters = ResolverVisitor
+ .resolveArgumentsToParameters(argumentList, fnType.parameters, null);
+
+ List<DartType> paramTypes = <DartType>[];
+ List<DartType> argTypes = <DartType>[];
+ for (int i = 0, length = rawParameters.length; i < length; i++) {
+ ParameterElement parameter = rawParameters[i];
+ if (parameter != null) {
+ paramTypes.add(parameter.type);
+ argTypes.add(argumentList.arguments[i].staticType);
}
+ }
- FunctionType inferred = ts.inferCallFromArguments(
- _typeProvider, fnType, paramTypes, argTypes);
+ FunctionType inferred = ts.inferGenericFunctionCall(_typeProvider, fnType,
+ paramTypes, argTypes, InferenceContext.getType(node));
- if (inferred != fnType) {
- // Fix up the parameter elements based on inferred method.
- List<ParameterElement> inferredParameters =
- ResolverVisitor.resolveArgumentsToParameters(
- argumentList, inferred.parameters, null);
- argumentList.correspondingStaticParameters = inferredParameters;
- return inferred;
- }
+ if (inferred != node.staticInvokeType) {
+ // Fix up the parameter elements based on inferred method.
+ List<ParameterElement> inferredParameters =
+ ResolverVisitor.resolveArgumentsToParameters(
+ argumentList, inferred.parameters, null);
+ argumentList.correspondingStaticParameters = inferredParameters;
+ node.staticInvokeType = inferred;
+ return true;
}
}
- return null;
+ return false;
}
/**
@@ -1906,27 +1887,6 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
}
/**
- * Given a generic method invocation [node], attempt to infer the method's
- * type variables, using the actual types of the arguments.
- */
- bool _inferMethodInvocationGeneric(MethodInvocation node) {
- DartType instantiatedType = node.staticInvokeType;
- DartType originalType = node.methodName.staticType;
- // TODO(jmesserly): support generic `call` methods.
- // Perhaps we should always record a FunctionType in staticInvokeType
- // and the methodName's staticType.
- if (instantiatedType is FunctionType && originalType is FunctionType) {
- FunctionType inferred = _inferGenericInvoke(instantiatedType,
- originalType, node.typeArguments, node.argumentList);
- if (inferred != null) {
- node.staticInvokeType = inferred;
- return true;
- }
- }
- return false;
- }
-
- /**
* Given a method invocation [node], attempt to infer a better
* type for the result if it is an inline JS invocation
*/

Powered by Google App Engine
This is Rietveld 408576698