refactoring after code review

do not consider error type in parameters of function type as unknown
This commit is contained in:
Svetlana Isakova
2013-02-07 20:20:42 +04:00
parent cc94c45195
commit d149218e1d
2 changed files with 10 additions and 21 deletions
@@ -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(