refactoring after code review
do not consider error type in parameters of function type as unknown
This commit is contained in:
@@ -21,7 +21,6 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
|
import org.jetbrains.jet.lang.descriptors.CallableDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
|
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
|
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.BindingContext;
|
||||||
import org.jetbrains.jet.lang.resolve.TemporaryBindingTrace;
|
import org.jetbrains.jet.lang.resolve.TemporaryBindingTrace;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.context.CallResolutionContext;
|
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.inference.ConstraintsUtil;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
|
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.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.model.ResolvedValueArgument;
|
||||||
import org.jetbrains.jet.lang.resolve.calls.tasks.ResolutionCandidate;
|
import org.jetbrains.jet.lang.resolve.calls.tasks.ResolutionCandidate;
|
||||||
import org.jetbrains.jet.lang.types.*;
|
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.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
public class CallResolverUtil {
|
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);
|
assert KotlinBuiltIns.getInstance().isFunctionOrExtensionFunctionType(type);
|
||||||
List<TypeProjection> arguments = type.getArguments();
|
List<TypeProjection> arguments = type.getArguments();
|
||||||
int index = 0;
|
// last argument is return type of function type
|
||||||
for (TypeProjection argument : arguments) {
|
List<TypeProjection> functionParameters = arguments.subList(0, arguments.size() - 1);
|
||||||
if (index < arguments.size() - 1) {
|
for (TypeProjection functionParameter : functionParameters) {
|
||||||
if (ErrorUtils.containsErrorType(argument.getType())) {
|
if (TypeUtils.equalsOrContainsAsArgument(functionParameter.getType(), CANT_INFER, DONT_CARE)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
index++;
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -105,17 +100,11 @@ public class CallResolverUtil {
|
|||||||
return ErrorUtils.containsErrorType(returnTypeFromFunctionType);
|
return ErrorUtils.containsErrorType(returnTypeFromFunctionType);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static JetType replaceReturnTypeToUnknown(@NotNull JetType type) {
|
public static JetType replaceReturnTypeByUnknown(@NotNull JetType type) {
|
||||||
assert KotlinBuiltIns.getInstance().isFunctionOrExtensionFunctionType(type);
|
assert KotlinBuiltIns.getInstance().isFunctionOrExtensionFunctionType(type);
|
||||||
List<TypeProjection> arguments = type.getArguments();
|
List<TypeProjection> arguments = type.getArguments();
|
||||||
List<TypeProjection> newArguments = Lists.newArrayList();
|
List<TypeProjection> newArguments = Lists.newArrayList();
|
||||||
int index = 0;
|
newArguments.addAll(arguments.subList(0, arguments.size() - 1));
|
||||||
for (TypeProjection argument : arguments) {
|
|
||||||
if (index < arguments.size() - 1) {
|
|
||||||
newArguments.add(argument);
|
|
||||||
}
|
|
||||||
index++;
|
|
||||||
}
|
|
||||||
newArguments.add(new TypeProjection(Variance.INVARIANT, DONT_CARE));
|
newArguments.add(new TypeProjection(Variance.INVARIANT, DONT_CARE));
|
||||||
return new JetTypeImpl(type.getAnnotations(), type.getConstructor(), type.isNullable(), newArguments, type.getMemberScope());
|
return new JetTypeImpl(type.getAnnotations(), type.getConstructor(), type.isNullable(), newArguments, type.getMemberScope());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -318,7 +318,7 @@ public class CandidateResolver {
|
|||||||
JetType effectiveExpectedType = getEffectiveExpectedType(valueParameterDescriptor, valueArgument);
|
JetType effectiveExpectedType = getEffectiveExpectedType(valueParameterDescriptor, valueArgument);
|
||||||
JetType expectedType = constraintSystem.getCurrentSubstitutor().substitute(effectiveExpectedType, Variance.INVARIANT);
|
JetType expectedType = constraintSystem.getCurrentSubstitutor().substitute(effectiveExpectedType, Variance.INVARIANT);
|
||||||
if (expectedType == null || !KotlinBuiltIns.getInstance().isFunctionOrExtensionFunctionType(expectedType)
|
if (expectedType == null || !KotlinBuiltIns.getInstance().isFunctionOrExtensionFunctionType(expectedType)
|
||||||
|| CallResolverUtil.containsUnknownFunctionArgument(expectedType)) {
|
|| CallResolverUtil.hasUnknownFunctionParameter(expectedType)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
boolean hasExpectedReturnType = !CallResolverUtil.hasUnknownReturnType(expectedType);
|
boolean hasExpectedReturnType = !CallResolverUtil.hasUnknownReturnType(expectedType);
|
||||||
@@ -342,7 +342,7 @@ public class CandidateResolver {
|
|||||||
}
|
}
|
||||||
BindingContextUtils.commitResolutionCacheData(traceToResolveFunctionLiteral, context.trace);
|
BindingContextUtils.commitResolutionCacheData(traceToResolveFunctionLiteral, context.trace);
|
||||||
}
|
}
|
||||||
JetType expectedTypeWithoutReturnType = hasExpectedReturnType ? CallResolverUtil.replaceReturnTypeToUnknown(expectedType) : expectedType;
|
JetType expectedTypeWithoutReturnType = hasExpectedReturnType ? CallResolverUtil.replaceReturnTypeByUnknown(expectedType) : expectedType;
|
||||||
CallCandidateResolutionContext<D> newContext = context.replaceExpectedType(expectedTypeWithoutReturnType);
|
CallCandidateResolutionContext<D> newContext = context.replaceExpectedType(expectedTypeWithoutReturnType);
|
||||||
JetType type = argumentTypeResolver.getArgumentTypeInfo(argumentExpression, newContext, RESOLVE_FUNCTION_ARGUMENTS).getType();
|
JetType type = argumentTypeResolver.getArgumentTypeInfo(argumentExpression, newContext, RESOLVE_FUNCTION_ARGUMENTS).getType();
|
||||||
constraintSystem.addSubtypeConstraint(
|
constraintSystem.addSubtypeConstraint(
|
||||||
|
|||||||
Reference in New Issue
Block a user