diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/SignaturesPropagationData.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/SignaturesPropagationData.java index a2dc168a1e1..cfbc80a03e3 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/SignaturesPropagationData.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/SignaturesPropagationData.java @@ -62,6 +62,7 @@ public class SignaturesPropagationData { private final List signatureErrors = Lists.newArrayList(); private final List superFunctions; private final Map autoTypeParameterToModified; + private final ClassDescriptor containingClass; public SignaturesPropagationData( @NotNull ClassDescriptor containingClass, @@ -71,6 +72,7 @@ public class SignaturesPropagationData { @NotNull PsiMethodWrapper method, @NotNull BindingTrace trace ) { + this.containingClass = containingClass; superFunctions = getSuperFunctionsForMethod(method, trace, containingClass); autoTypeParameterToModified = SignaturesUtil.recreateTypeParametersAndReturnMapping(autoTypeParameters); @@ -617,6 +619,37 @@ public class SignaturesPropagationData { } } + // Weird workaround for weird case. The sample code below is compiled by javac. + // In this case, we try to replace "Any" parameter type with "T" to fix substitution principle. + // + // public interface Super { + // void foo(T t); + // } + // + // public interface Sub extends Super { + // void foo(Object o); + // } + + List typeParameterClassifiersFromSuper = Lists.newArrayList(); + for (TypeAndVariance typeFromSuper : typesFromSuper) { + ClassifierDescriptor classifierFromSuper = typeFromSuper.type.getConstructor().getDeclarationDescriptor(); + if (classifierFromSuper instanceof TypeParameterDescriptor) { + typeParameterClassifiersFromSuper.add((TypeParameterDescriptor) classifierFromSuper); + } + } + + if (!typeParameterClassifiersFromSuper.isEmpty() && typeParameterClassifiersFromSuper.size() == typesFromSuper.size()) { + for (TypeParameterDescriptor typeParameter : typeParameterClassifiersFromSuper) { + if (typeParameter.getContainingDeclaration() != containingClass) { + continue; + } + + return autoTypeParameterToModified.containsKey(typeParameter) ? autoTypeParameterToModified + .get(typeParameter) : typeParameter; + + } + } + return classifier; } diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/parameter/OverrideWithErasedParameter.java b/compiler/testData/loadJava/kotlinSignature/propagation/parameter/OverrideWithErasedParameter.java new file mode 100644 index 00000000000..56e7345920d --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/parameter/OverrideWithErasedParameter.java @@ -0,0 +1,12 @@ +package test; + +public interface OverrideWithErasedParameter { + + public interface Super { + void foo(T t); + } + + public interface Sub extends Super { + void foo(Object o); + } +} \ No newline at end of file diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/parameter/OverrideWithErasedParameter.kt b/compiler/testData/loadJava/kotlinSignature/propagation/parameter/OverrideWithErasedParameter.kt new file mode 100644 index 00000000000..e40f8028fa3 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/parameter/OverrideWithErasedParameter.kt @@ -0,0 +1,12 @@ +package test + +public trait OverrideWithErasedParameter: Object { + + public trait Super: Object { + public fun foo(p0: T?) + } + + public trait Sub: Super { + override fun foo(p0: T?) + } +} \ No newline at end of file diff --git a/compiler/testData/loadJava/kotlinSignature/propagation/parameter/OverrideWithErasedParameter.txt b/compiler/testData/loadJava/kotlinSignature/propagation/parameter/OverrideWithErasedParameter.txt new file mode 100644 index 00000000000..19e2d5e2b35 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/propagation/parameter/OverrideWithErasedParameter.txt @@ -0,0 +1,12 @@ +package test + +public trait OverrideWithErasedParameter : java.lang.Object { + + public trait Sub : test.OverrideWithErasedParameter.Super { + public abstract override /*1*/ fun foo(/*0*/ p0 : T?) : Unit + } + + public trait Super : java.lang.Object { + public abstract fun foo(/*0*/ p0 : T?) : Unit + } +} diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java index 1a6d5377b0f..1b89a409540 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java @@ -599,6 +599,11 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { doTest("compiler/testData/loadJava/kotlinSignature/propagation/parameter/NullableToNotNullKotlinSignature.java"); } + @TestMetadata("OverrideWithErasedParameter.java") + public void testOverrideWithErasedParameter() throws Exception { + doTest("compiler/testData/loadJava/kotlinSignature/propagation/parameter/OverrideWithErasedParameter.java"); + } + @TestMetadata("ReadOnlyToMutable.java") public void testReadOnlyToMutable() throws Exception { doTest("compiler/testData/loadJava/kotlinSignature/propagation/parameter/ReadOnlyToMutable.java"); diff --git a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java index 4e05d900526..1a6581cf1ad 100644 --- a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java @@ -1568,6 +1568,11 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso doTestNotCheckingPrimaryConstructors("compiler/testData/loadJava/kotlinSignature/propagation/parameter/NullableToNotNullKotlinSignature.kt"); } + @TestMetadata("OverrideWithErasedParameter.kt") + public void testOverrideWithErasedParameter() throws Exception { + doTestNotCheckingPrimaryConstructors("compiler/testData/loadJava/kotlinSignature/propagation/parameter/OverrideWithErasedParameter.kt"); + } + @TestMetadata("ReadOnlyToMutable.kt") public void testReadOnlyToMutable() throws Exception { doTestNotCheckingPrimaryConstructors("compiler/testData/loadJava/kotlinSignature/propagation/parameter/ReadOnlyToMutable.kt");