diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolverUtil.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolverUtil.java index 7ec6e9f6d35..70471309b6e 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolverUtil.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolverUtil.java @@ -21,7 +21,6 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.CallableDescriptor; import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; -import org.jetbrains.jet.lang.psi.ValueArgument; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.TemporaryBindingTrace; import org.jetbrains.jet.lang.resolve.calls.context.CallResolutionContext; @@ -29,7 +28,6 @@ import org.jetbrains.jet.lang.resolve.calls.inference.ConstraintSystem; import org.jetbrains.jet.lang.resolve.calls.inference.ConstraintsUtil; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCallImpl; -import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCallWithTrace; import org.jetbrains.jet.lang.resolve.calls.model.ResolvedValueArgument; import org.jetbrains.jet.lang.resolve.calls.tasks.ResolutionCandidate; import org.jetbrains.jet.lang.types.*; @@ -38,7 +36,6 @@ import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import java.util.Collections; import java.util.List; import java.util.Map; -import java.util.Set; public class CallResolverUtil { @@ -84,17 +81,15 @@ public class CallResolverUtil { } - public static boolean containsUnknownFunctionArgument(@NotNull JetType type) { + public static boolean hasUnknownFunctionParameter(@NotNull JetType type) { assert KotlinBuiltIns.getInstance().isFunctionOrExtensionFunctionType(type); List arguments = type.getArguments(); - int index = 0; - for (TypeProjection argument : arguments) { - if (index < arguments.size() - 1) { - if (ErrorUtils.containsErrorType(argument.getType())) { - return true; - } + // last argument is return type of function type + List functionParameters = arguments.subList(0, arguments.size() - 1); + for (TypeProjection functionParameter : functionParameters) { + if (TypeUtils.equalsOrContainsAsArgument(functionParameter.getType(), CANT_INFER, DONT_CARE)) { + return true; } - index++; } return false; } @@ -105,17 +100,11 @@ public class CallResolverUtil { return ErrorUtils.containsErrorType(returnTypeFromFunctionType); } - public static JetType replaceReturnTypeToUnknown(@NotNull JetType type) { + public static JetType replaceReturnTypeByUnknown(@NotNull JetType type) { assert KotlinBuiltIns.getInstance().isFunctionOrExtensionFunctionType(type); List arguments = type.getArguments(); List newArguments = Lists.newArrayList(); - int index = 0; - for (TypeProjection argument : arguments) { - if (index < arguments.size() - 1) { - newArguments.add(argument); - } - index++; - } + newArguments.addAll(arguments.subList(0, arguments.size() - 1)); newArguments.add(new TypeProjection(Variance.INVARIANT, DONT_CARE)); return new JetTypeImpl(type.getAnnotations(), type.getConstructor(), type.isNullable(), newArguments, type.getMemberScope()); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java index 3599dee496e..0061be051f2 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CandidateResolver.java @@ -318,7 +318,7 @@ public class CandidateResolver { JetType effectiveExpectedType = getEffectiveExpectedType(valueParameterDescriptor, valueArgument); JetType expectedType = constraintSystem.getCurrentSubstitutor().substitute(effectiveExpectedType, Variance.INVARIANT); if (expectedType == null || !KotlinBuiltIns.getInstance().isFunctionOrExtensionFunctionType(expectedType) - || CallResolverUtil.containsUnknownFunctionArgument(expectedType)) { + || CallResolverUtil.hasUnknownFunctionParameter(expectedType)) { return; } boolean hasExpectedReturnType = !CallResolverUtil.hasUnknownReturnType(expectedType); @@ -342,7 +342,7 @@ public class CandidateResolver { } BindingContextUtils.commitResolutionCacheData(traceToResolveFunctionLiteral, context.trace); } - JetType expectedTypeWithoutReturnType = hasExpectedReturnType ? CallResolverUtil.replaceReturnTypeToUnknown(expectedType) : expectedType; + JetType expectedTypeWithoutReturnType = hasExpectedReturnType ? CallResolverUtil.replaceReturnTypeByUnknown(expectedType) : expectedType; CallCandidateResolutionContext newContext = context.replaceExpectedType(expectedTypeWithoutReturnType); JetType type = argumentTypeResolver.getArgumentTypeInfo(argumentExpression, newContext, RESOLVE_FUNCTION_ARGUMENTS).getType(); constraintSystem.addSubtypeConstraint(