Substituting type parameters when checking alt signature.
This commit is contained in:
+13
-4
@@ -29,8 +29,7 @@ import org.jetbrains.jet.lang.psi.*;
|
|||||||
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
|
import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver;
|
||||||
import org.jetbrains.jet.lang.resolve.java.wrapper.PsiMethodWrapper;
|
import org.jetbrains.jet.lang.resolve.java.wrapper.PsiMethodWrapper;
|
||||||
import org.jetbrains.jet.lang.resolve.name.Name;
|
import org.jetbrains.jet.lang.resolve.name.Name;
|
||||||
import org.jetbrains.jet.lang.types.JetType;
|
import org.jetbrains.jet.lang.types.*;
|
||||||
import org.jetbrains.jet.lang.types.TypeUtils;
|
|
||||||
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
|
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -94,10 +93,16 @@ public class AlternativeMethodSignatureData extends ElementAlternativeSignatureD
|
|||||||
@NotNull JavaDescriptorResolver.ValueParameterDescriptors valueParameterDescriptors,
|
@NotNull JavaDescriptorResolver.ValueParameterDescriptors valueParameterDescriptors,
|
||||||
@NotNull List<TypeParameterDescriptor> methodTypeParameters
|
@NotNull List<TypeParameterDescriptor> methodTypeParameters
|
||||||
) {
|
) {
|
||||||
|
TypeSubstitutor substitutor = SignaturesUtil.createSubstitutorForFunctionTypeParameters(originalToAltTypeParameters);
|
||||||
|
|
||||||
for (ValueParameterDescriptor parameter : valueParameterDescriptors.getDescriptors()) {
|
for (ValueParameterDescriptor parameter : valueParameterDescriptors.getDescriptors()) {
|
||||||
int index = parameter.getIndex();
|
int index = parameter.getIndex();
|
||||||
ValueParameterDescriptor altParameter = altValueParameters.getDescriptors().get(index);
|
ValueParameterDescriptor altParameter = altValueParameters.getDescriptors().get(index);
|
||||||
if (!TypeUtils.equalTypes(parameter.getType(), altParameter.getType())) {
|
|
||||||
|
JetType substituted = substitutor.substitute(parameter.getType(), Variance.INVARIANT);
|
||||||
|
assert substituted != null;
|
||||||
|
|
||||||
|
if (!TypeUtils.equalTypes(substituted, altParameter.getType())) {
|
||||||
throw new AlternativeSignatureMismatchException(
|
throw new AlternativeSignatureMismatchException(
|
||||||
"Parameter type changed for method which overrides another: " + altParameter.getType()
|
"Parameter type changed for method which overrides another: " + altParameter.getType()
|
||||||
+ ", was: " + parameter.getType());
|
+ ", was: " + parameter.getType());
|
||||||
@@ -108,7 +113,11 @@ public class AlternativeMethodSignatureData extends ElementAlternativeSignatureD
|
|||||||
|
|
||||||
for (TypeParameterDescriptor parameter : methodTypeParameters) {
|
for (TypeParameterDescriptor parameter : methodTypeParameters) {
|
||||||
int index = parameter.getIndex();
|
int index = parameter.getIndex();
|
||||||
if (!TypeUtils.equalTypes(altTypeParameters.get(index).getUpperBoundsAsType(), parameter.getUpperBoundsAsType())) {
|
|
||||||
|
JetType substituted = substitutor.substitute(altTypeParameters.get(index).getUpperBoundsAsType(), Variance.INVARIANT);
|
||||||
|
assert substituted != null;
|
||||||
|
|
||||||
|
if (!TypeUtils.equalTypes(substituted, parameter.getUpperBoundsAsType())) {
|
||||||
throw new AlternativeSignatureMismatchException(
|
throw new AlternativeSignatureMismatchException(
|
||||||
"Type parameter's upper bound changed for method which overrides another: "
|
"Type parameter's upper bound changed for method which overrides another: "
|
||||||
+ altTypeParameters.get(index).getUpperBoundsAsType() + ", was: " + parameter.getUpperBoundsAsType());
|
+ altTypeParameters.get(index).getUpperBoundsAsType() + ", was: " + parameter.getUpperBoundsAsType());
|
||||||
|
|||||||
+15
@@ -20,6 +20,9 @@ import com.google.common.collect.Maps;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
|
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor;
|
||||||
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptorImpl;
|
import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptorImpl;
|
||||||
|
import org.jetbrains.jet.lang.types.TypeConstructor;
|
||||||
|
import org.jetbrains.jet.lang.types.TypeProjection;
|
||||||
|
import org.jetbrains.jet.lang.types.TypeSubstitutor;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -42,6 +45,18 @@ public class SignaturesUtil {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static TypeSubstitutor createSubstitutorForFunctionTypeParameters(
|
||||||
|
@NotNull Map<TypeParameterDescriptor, TypeParameterDescriptorImpl> originalToAltTypeParameters
|
||||||
|
) {
|
||||||
|
Map<TypeConstructor, TypeProjection> typeSubstitutionContext = Maps.newHashMap();
|
||||||
|
for (Map.Entry<TypeParameterDescriptor, TypeParameterDescriptorImpl> originalToAltTypeParameter : originalToAltTypeParameters
|
||||||
|
.entrySet()) {
|
||||||
|
typeSubstitutionContext.put(originalToAltTypeParameter.getKey().getTypeConstructor(),
|
||||||
|
new TypeProjection(originalToAltTypeParameter.getValue().getDefaultType()));
|
||||||
|
}
|
||||||
|
return TypeSubstitutor.create(typeSubstitutionContext);
|
||||||
|
}
|
||||||
|
|
||||||
private SignaturesUtil() {
|
private SignaturesUtil() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user