| 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 a746a1e1767ffe4ef256ec778bdb642f5d836ce3..a11e6e068ec86526fd27e3f6fa49ee3ccf7dc9f9 100644
|
| --- a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
|
| +++ b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
|
| @@ -1823,31 +1823,48 @@ class StaticTypeAnalyzer extends SimpleAstVisitor<Object> {
|
| Element element = node.methodName.staticElement;
|
| DartType fnType = node.methodName.staticType;
|
| TypeSystem ts = _typeSystem;
|
| - // TODO(jmesserly): once we allow explicitly passed typeArguments, we need
|
| - // to only do this if node.typeArguments == null.
|
| - if (element is ExecutableElement &&
|
| + if (node.typeArguments == null &&
|
| + element is ExecutableElement &&
|
| fnType is FunctionTypeImpl &&
|
| ts is StrongTypeSystemImpl) {
|
| - // We may have too many (or too few) arguments. Only use arguments
|
| - // which have been matched up with a static parameter.
|
| - Iterable<Expression> arguments = node.argumentList.arguments
|
| - .where((e) => e.staticParameterElement != null);
|
| - List<DartType> argTypes = arguments.map((e) => e.staticType).toList();
|
| - List<DartType> paramTypes =
|
| - arguments.map((e) => e.staticParameterElement.type).toList();
|
| + FunctionTypeImpl genericFunction = fnType.originalFunction;
|
| + if (genericFunction.boundTypeParameters.isEmpty) {
|
| + return false;
|
| + }
|
| + for (DartType typeArg in fnType.instantiatedTypeArguments) {
|
| + if (!typeArg.isDynamic) {
|
| + return false;
|
| + }
|
| + }
|
| +
|
| + List<ParameterElement> genericParameters = genericFunction.parameters;
|
| + List<DartType> argTypes = new List<DartType>();
|
| + List<DartType> paramTypes = new List<DartType>();
|
| + for (Expression arg in node.argumentList.arguments) {
|
| + // We may have too many (or too few) arguments. Only use arguments
|
| + // which have been matched up with a static parameter.
|
| + ParameterElement p = arg.staticParameterElement;
|
| + if (p != null) {
|
| + int i = element.parameters.indexOf(p);
|
| + argTypes.add(arg.staticType);
|
| + paramTypes.add(genericParameters[i].type);
|
| + }
|
| + }
|
|
|
| FunctionType inferred = ts.inferCallFromArguments(
|
| - _typeProvider, fnType, paramTypes, argTypes);
|
| + _typeProvider, genericFunction, paramTypes, argTypes);
|
| if (inferred != fnType) {
|
| - // TODO(jmesserly): inference should be happening earlier, which would
|
| - // allow these parameters to be correct from the get-go.
|
| -
|
| + // TODO(jmesserly): we need to fix up the parameter elements based on
|
| + // inferred method.
|
| List<ParameterElement> inferredParameters = inferred.parameters;
|
| List<ParameterElement> correspondingParams =
|
| new List<ParameterElement>();
|
| - for (Expression arg in arguments) {
|
| - int i = element.parameters.indexOf(arg.staticParameterElement);
|
| - correspondingParams.add(inferredParameters[i]);
|
| + for (Expression arg in node.argumentList.arguments) {
|
| + ParameterElement p = arg.staticParameterElement;
|
| + if (p != null) {
|
| + int i = element.parameters.indexOf(p);
|
| + correspondingParams.add(inferredParameters[i]);
|
| + }
|
| }
|
| node.argumentList.correspondingStaticParameters = correspondingParams;
|
| _recordStaticType(node.methodName, inferred);
|
|
|