Record type arguments when they are inferred.

This commit is contained in:
Evgeny Gerashchenko
2013-07-11 14:35:19 +04:00
parent c22f54055e
commit 99bfd6d477
3 changed files with 8 additions and 13 deletions
@@ -73,9 +73,6 @@ public class CallResolverUtil {
if (constraintSystem != null) { if (constraintSystem != null) {
copy.setConstraintSystem(constraintSystem.copy()); copy.setConstraintSystem(constraintSystem.copy());
} }
for (Map.Entry<TypeParameterDescriptor, JetType> entry : call.getTypeArguments().entrySet()) {
copy.recordTypeArgument(entry.getKey(), entry.getValue());
}
for (Map.Entry<ValueParameterDescriptor, ResolvedValueArgument> entry : call.getValueArguments().entrySet()) { for (Map.Entry<ValueParameterDescriptor, ResolvedValueArgument> entry : call.getValueArguments().entrySet()) {
copy.recordValueArgument(entry.getKey(), entry.getValue()); copy.recordValueArgument(entry.getKey(), entry.getValue());
} }
@@ -159,11 +159,6 @@ public class CandidateResolver {
TypeSubstitutor substitutor = TypeSubstitutor.create(substitutionContext); TypeSubstitutor substitutor = TypeSubstitutor.create(substitutionContext);
candidateCall.setResultingSubstitutor(substitutor); candidateCall.setResultingSubstitutor(substitutor);
List<TypeParameterDescriptor> typeParameters = candidateCall.getCandidateDescriptor().getTypeParameters();
for (int i = 0; i < typeParameters.size(); i++) {
TypeParameterDescriptor typeParameterDescriptor = typeParameters.get(i);
candidateCall.recordTypeArgument(typeParameterDescriptor, typeArguments.get(i));
}
candidateCall.addStatus(checkAllValueArguments(context, SKIP_FUNCTION_ARGUMENTS).status); candidateCall.addStatus(checkAllValueArguments(context, SKIP_FUNCTION_ARGUMENTS).status);
} }
else { else {
@@ -36,6 +36,7 @@ import org.jetbrains.jet.lang.resolve.calls.inference.ConstraintSystem;
import org.jetbrains.jet.lang.resolve.calls.tasks.TracingStrategy; import org.jetbrains.jet.lang.resolve.calls.tasks.TracingStrategy;
import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue; import org.jetbrains.jet.lang.resolve.scopes.receivers.ReceiverValue;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.TypeProjection;
import org.jetbrains.jet.lang.types.TypeSubstitutor; import org.jetbrains.jet.lang.types.TypeSubstitutor;
import java.util.*; import java.util.*;
@@ -144,6 +145,13 @@ public class ResolvedCallImpl<D extends CallableDescriptor> implements ResolvedC
resultingDescriptor = (D) candidateDescriptor.substitute(substitutor); resultingDescriptor = (D) candidateDescriptor.substitute(substitutor);
assert resultingDescriptor != null : candidateDescriptor; assert resultingDescriptor != null : candidateDescriptor;
for (TypeParameterDescriptor typeParameter : candidateDescriptor.getTypeParameters()) {
TypeProjection typeArgumentProjection = substitutor.getSubstitution().get(typeParameter.getTypeConstructor());
if (typeArgumentProjection != null) {
typeArguments.put(typeParameter, typeArgumentProjection.getType());
}
}
Map<ValueParameterDescriptor, ValueParameterDescriptor> parameterMap = Maps.newHashMap(); Map<ValueParameterDescriptor, ValueParameterDescriptor> parameterMap = Maps.newHashMap();
for (ValueParameterDescriptor valueParameterDescriptor : resultingDescriptor.getValueParameters()) { for (ValueParameterDescriptor valueParameterDescriptor : resultingDescriptor.getValueParameters()) {
parameterMap.put(valueParameterDescriptor.getOriginal(), valueParameterDescriptor); parameterMap.put(valueParameterDescriptor.getOriginal(), valueParameterDescriptor);
@@ -158,11 +166,6 @@ public class ResolvedCallImpl<D extends CallableDescriptor> implements ResolvedC
} }
} }
public void recordTypeArgument(@NotNull TypeParameterDescriptor typeParameter, @NotNull JetType typeArgument) {
assert !typeArguments.containsKey(typeParameter) : typeParameter + " -> " + typeArgument;
typeArguments.put(typeParameter, typeArgument);
}
public void setConstraintSystem(@NotNull ConstraintSystem constraintSystem) { public void setConstraintSystem(@NotNull ConstraintSystem constraintSystem) {
this.constraintSystem = constraintSystem; this.constraintSystem = constraintSystem;
} }