From caad1c20a22500f22e529757c4590330f9deb6dc Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Tue, 27 Nov 2012 18:10:16 +0400 Subject: [PATCH] Substituting type parameters when checking alt signature. --- .../AlternativeMethodSignatureData.java | 17 +++++++++++++---- .../java/kotlinSignature/SignaturesUtil.java | 15 +++++++++++++++ 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/AlternativeMethodSignatureData.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/AlternativeMethodSignatureData.java index e56f8876f81..b7d952015ef 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/AlternativeMethodSignatureData.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/AlternativeMethodSignatureData.java @@ -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.wrapper.PsiMethodWrapper; import org.jetbrains.jet.lang.resolve.name.Name; -import org.jetbrains.jet.lang.types.JetType; -import org.jetbrains.jet.lang.types.TypeUtils; +import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import java.util.ArrayList; @@ -94,10 +93,16 @@ public class AlternativeMethodSignatureData extends ElementAlternativeSignatureD @NotNull JavaDescriptorResolver.ValueParameterDescriptors valueParameterDescriptors, @NotNull List methodTypeParameters ) { + TypeSubstitutor substitutor = SignaturesUtil.createSubstitutorForFunctionTypeParameters(originalToAltTypeParameters); + for (ValueParameterDescriptor parameter : valueParameterDescriptors.getDescriptors()) { int index = parameter.getIndex(); 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( "Parameter type changed for method which overrides another: " + altParameter.getType() + ", was: " + parameter.getType()); @@ -108,7 +113,11 @@ public class AlternativeMethodSignatureData extends ElementAlternativeSignatureD for (TypeParameterDescriptor parameter : methodTypeParameters) { 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( "Type parameter's upper bound changed for method which overrides another: " + altTypeParameters.get(index).getUpperBoundsAsType() + ", was: " + parameter.getUpperBoundsAsType()); diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/SignaturesUtil.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/SignaturesUtil.java index 4b9c109bd59..48c20614c28 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/SignaturesUtil.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/SignaturesUtil.java @@ -20,6 +20,9 @@ import com.google.common.collect.Maps; import org.jetbrains.annotations.NotNull; import org.jetbrains.jet.lang.descriptors.TypeParameterDescriptor; 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.Map; @@ -42,6 +45,18 @@ public class SignaturesUtil { return result; } + public static TypeSubstitutor createSubstitutorForFunctionTypeParameters( + @NotNull Map originalToAltTypeParameters + ) { + Map typeSubstitutionContext = Maps.newHashMap(); + for (Map.Entry originalToAltTypeParameter : originalToAltTypeParameters + .entrySet()) { + typeSubstitutionContext.put(originalToAltTypeParameter.getKey().getTypeConstructor(), + new TypeProjection(originalToAltTypeParameter.getValue().getDefaultType())); + } + return TypeSubstitutor.create(typeSubstitutionContext); + } + private SignaturesUtil() { } }