diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/TypeTransformingVisitor.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/TypeTransformingVisitor.java index 9dceb8119c8..6f79c65a2d0 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/TypeTransformingVisitor.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/TypeTransformingVisitor.java @@ -124,9 +124,9 @@ class TypeTransformingVisitor extends JetVisitor { TypeProjection argument = arguments.get(i); JetType alternativeType = computeType(argumentAlternativeTypeElement, argument.getType(), originalToAltTypeParameters); Variance variance = argument.getProjectionKind(); + Variance altVariance; if (type instanceof JetUserType) { JetTypeProjection typeProjection = ((JetUserType) type).getTypeArguments().get(i); - Variance altVariance = Variance.INVARIANT; switch (typeProjection.getProjectionKind()) { case IN: altVariance = Variance.IN_VARIANCE; @@ -137,12 +137,16 @@ class TypeTransformingVisitor extends JetVisitor { case STAR: throw new AlternativeSignatureMismatchException("Star projection is not available in alternative signatures"); default: + altVariance = Variance.INVARIANT; } if (altVariance != variance && variance != Variance.INVARIANT) { throw new AlternativeSignatureMismatchException("Variance mismatch, actual: %s, in alternative signature: %s", variance, altVariance); } } - altArguments.add(new TypeProjection(variance, alternativeType)); + else { + altVariance = variance; + } + altArguments.add(new TypeProjection(altVariance, alternativeType)); } TypeConstructor typeConstructor; diff --git a/compiler/testData/loadJava/kotlinSignature/CustomVariance.java b/compiler/testData/loadJava/kotlinSignature/CustomVariance.java new file mode 100644 index 00000000000..b8b012c3d99 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/CustomVariance.java @@ -0,0 +1,12 @@ +package test; + +import java.util.*; + +import jet.runtime.typeinfo.KotlinSignature; + +public class CustomVariance { + @KotlinSignature("fun foo(): MutableList") + public List foo() { + throw new UnsupportedOperationException(); + } +} diff --git a/compiler/testData/loadJava/kotlinSignature/CustomVariance.kt b/compiler/testData/loadJava/kotlinSignature/CustomVariance.kt new file mode 100644 index 00000000000..2f3cc20a793 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/CustomVariance.kt @@ -0,0 +1,7 @@ +package test + +import java.util.* + +public open class CustomVariance : Object() { + public open fun foo() : MutableList = throw UnsupportedOperationException() +} diff --git a/compiler/testData/loadJava/kotlinSignature/CustomVariance.txt b/compiler/testData/loadJava/kotlinSignature/CustomVariance.txt new file mode 100644 index 00000000000..cf20c023d60 --- /dev/null +++ b/compiler/testData/loadJava/kotlinSignature/CustomVariance.txt @@ -0,0 +1,6 @@ +namespace test + +public open class test.CustomVariance : java.lang.Object { + public final /*constructor*/ fun (): test.CustomVariance + public open fun foo(): jet.MutableList +} diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java index 728494a5e0c..af5cd7756c0 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java @@ -260,6 +260,11 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { doTest("compiler/testData/loadJava/kotlinSignature/ConstructorWithoutParams.java"); } + @TestMetadata("CustomVariance.java") + public void testCustomVariance() throws Exception { + doTest("compiler/testData/loadJava/kotlinSignature/CustomVariance.java"); + } + @TestMetadata("MethodWithFunctionTypes.java") public void testMethodWithFunctionTypes() throws Exception { doTest("compiler/testData/loadJava/kotlinSignature/MethodWithFunctionTypes.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 b528574b5e5..fc8e842384d 100644 --- a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java @@ -1155,6 +1155,11 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/ConstructorWithoutParams.kt"); } + @TestMetadata("CustomVariance.kt") + public void testCustomVariance() throws Exception { + doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/CustomVariance.kt"); + } + @TestMetadata("MethodWithFunctionTypes.kt") public void testMethodWithFunctionTypes() throws Exception { doTestSinglePackage("compiler/testData/loadJava/kotlinSignature/MethodWithFunctionTypes.kt");