Make candidate resolver force-resolve type arguments on argument count mismatch

This commit is contained in:
Andrey Breslav
2014-11-07 23:43:05 +02:00
parent 4892369cf4
commit 19afb2fcb8
3 changed files with 10 additions and 5 deletions
@@ -39,6 +39,7 @@ import org.jetbrains.jet.lang.resolve.calls.smartcasts.SmartCastUtils;
import org.jetbrains.jet.lang.resolve.calls.tasks.ResolutionTask;
import org.jetbrains.jet.lang.resolve.calls.tasks.TaskPrioritizer;
import org.jetbrains.jet.lang.resolve.calls.util.FakeCallableDescriptorForObject;
import org.jetbrains.jet.lang.resolve.lazy.ForceResolveUtil;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ExpressionReceiver;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue;
import org.jetbrains.jet.lang.types.*;
@@ -122,8 +123,12 @@ public class CandidateResolver {
if (projection.getProjectionKind() != JetProjectionKind.NONE) {
context.trace.report(PROJECTION_ON_NON_CLASS_TYPE_ARGUMENT.on(projection));
}
typeArguments.add(argumentTypeResolver.resolveTypeRefWithDefault(
projection.getTypeReference(), context.scope, context.trace, ErrorUtils.createErrorType("Star projection in a call")));
JetType type = argumentTypeResolver.resolveTypeRefWithDefault(
projection.getTypeReference(), context.scope, context.trace,
ErrorUtils.createErrorType("Star projection in a call")
);
ForceResolveUtil.forceResolveAllContents(type);
typeArguments.add(type);
}
int expectedTypeArgumentCount = candidate.getTypeParameters().size();
for (int index = jetTypeArguments.size(); index < expectedTypeArgumentCount; index++) {
@@ -644,7 +649,7 @@ public class CandidateResolver {
@NotNull BindingTrace trace
) {
List<TypeParameterDescriptor> typeParameters = functionDescriptor.getTypeParameters();
for (int i = 0; i < typeParameters.size(); i++) {
for (int i = 0; i < Math.min(typeParameters.size(), jetTypeArguments.size()); i++) {
TypeParameterDescriptor typeParameterDescriptor = typeParameters.get(i);
JetType typeArgument = typeArguments.get(i);
JetTypeReference typeReference = jetTypeArguments.get(i).getTypeReference();
@@ -6,4 +6,4 @@ class Client<T: Data, X> where X: Data {
}
val c = Client<Data>()
val c = Client<Data/*, [ERROR]*/>()
@@ -1,4 +1,4 @@
Type constraint (5: 17) class Client<T: Data, X> where X: Data {
Type constraint (5: 35) class Client<T: Data, X> where X: Data {
Type parameter (9: 16) val c = Client<Data>()
Type parameter (9: 16) val c = Client<Data/*, [ERROR]*/>()
Usage in import (3: 15) import server.Data