diff --git a/.idea/modules.xml b/.idea/modules.xml index bb2762df12f..31cba86fb8f 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -4,6 +4,7 @@ + diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaTypeTransformer.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaTypeTransformer.java index d8bcec9079a..5c30676b45a 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaTypeTransformer.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaTypeTransformer.java @@ -269,6 +269,7 @@ public class JavaTypeTransformer { } public static TypeUsage adjustTypeUsageWithMutabilityAnnotations(PsiModifierListOwner owner, TypeUsage originalTypeUsage) { + // Overrides type usage in method signature depending on mutability annotation present EnumSet signatureTypeUsages = EnumSet.of(TypeUsage.MEMBER_SIGNATURE_COVARIANT, TypeUsage.MEMBER_SIGNATURE_CONTRAVARIANT, TypeUsage.MEMBER_SIGNATURE_INVARIANT); if (!signatureTypeUsages.contains(originalTypeUsage)) { diff --git a/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterable.java b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterable.java new file mode 100644 index 00000000000..cb095c5d42e --- /dev/null +++ b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterable.java @@ -0,0 +1,11 @@ +package test; + +import org.jetbrains.annotations.*; + +public interface LoadIterable { + public @Mutable Iterable getIterable(); + public void setIterable(@Mutable Iterable Iterable); + + public @ReadOnly Iterable getReadOnlyIterable(); + public void setReadOnlyIterable(@ReadOnly Iterable Iterable); +} diff --git a/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterable.kt b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterable.kt new file mode 100644 index 00000000000..88d32c0a381 --- /dev/null +++ b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterable.kt @@ -0,0 +1,9 @@ +package test + +public trait LoadIterable : java.lang.Object { + public fun getIterable(): MutableIterable? + public fun setIterable(p0: MutableIterable?) + + public fun getReadOnlyIterable(): Iterable? + public fun setReadOnlyIterable(p0: Iterable?) +} diff --git a/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterable.txt b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterable.txt new file mode 100644 index 00000000000..52dc3f9f521 --- /dev/null +++ b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterable.txt @@ -0,0 +1,8 @@ +package test + +public trait LoadIterable : java.lang.Object { + public abstract fun getIterable() : jet.MutableIterable? + public abstract fun getReadOnlyIterable() : jet.Iterable? + public abstract fun setIterable(/*0*/ p0 : jet.MutableIterable?) : jet.Unit + public abstract fun setReadOnlyIterable(/*0*/ p0 : jet.Iterable?) : jet.Unit +} diff --git a/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithConflict.java b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithConflict.java new file mode 100644 index 00000000000..91f36b65687 --- /dev/null +++ b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithConflict.java @@ -0,0 +1,8 @@ +package test; + +import org.jetbrains.annotations.*; + +public interface LoadIterableWithConflict { + public @ReadOnly @Mutable Iterable getIterable(); + public void setIterable(@ReadOnly @Mutable Iterable Iterable); +} diff --git a/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithConflict.kt b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithConflict.kt new file mode 100644 index 00000000000..4c8ef4e6521 --- /dev/null +++ b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithConflict.kt @@ -0,0 +1,6 @@ +package test + +public trait LoadIterableWithConflict : java.lang.Object { + public fun getIterable(): MutableIterable? + public fun setIterable(p0: MutableIterable?) +} diff --git a/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithConflict.txt b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithConflict.txt new file mode 100644 index 00000000000..d811dc6c20b --- /dev/null +++ b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithConflict.txt @@ -0,0 +1,6 @@ +package test + +public trait LoadIterableWithConflict : java.lang.Object { + public abstract fun getIterable() : jet.MutableIterable? + public abstract fun setIterable(/*0*/ p0 : jet.MutableIterable?) : jet.Unit +} diff --git a/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithNullability.java b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithNullability.java new file mode 100644 index 00000000000..88b2f547e8d --- /dev/null +++ b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithNullability.java @@ -0,0 +1,11 @@ +package test; + +import org.jetbrains.annotations.*; + +public interface LoadIterableWithNullability { + public @NotNull @Mutable Iterable getIterable(); + public void setIterable(@Mutable @NotNull Iterable Iterable); + + public @NotNull @ReadOnly Iterable getReadOnlyIterable(); + public void setReadOnlyIterable(@ReadOnly @NotNull Iterable Iterable); +} diff --git a/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithNullability.kt b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithNullability.kt new file mode 100644 index 00000000000..4a3753195a7 --- /dev/null +++ b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithNullability.kt @@ -0,0 +1,9 @@ +package test + +public trait LoadIterableWithNullability : java.lang.Object { + public fun getIterable(): MutableIterable + public fun setIterable(p0: MutableIterable) + + public fun getReadOnlyIterable(): Iterable + public fun setReadOnlyIterable(p0: Iterable) +} diff --git a/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithNullability.txt b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithNullability.txt new file mode 100644 index 00000000000..bef44ff87ff --- /dev/null +++ b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithNullability.txt @@ -0,0 +1,8 @@ +package test + +public trait LoadIterableWithNullability : java.lang.Object { + public abstract fun getIterable() : jet.MutableIterable + public abstract fun getReadOnlyIterable() : jet.Iterable + public abstract fun setIterable(/*0*/ p0 : jet.MutableIterable) : jet.Unit + public abstract fun setReadOnlyIterable(/*0*/ p0 : jet.Iterable) : jet.Unit +} diff --git a/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithPropagation.java b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithPropagation.java new file mode 100644 index 00000000000..3cd88d66247 --- /dev/null +++ b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithPropagation.java @@ -0,0 +1,22 @@ +package test; + +import org.jetbrains.annotations.*; +import java.util.ArrayList; + +public interface LoadIterableWithPropagation { + public interface LoadIterable { + public @Mutable Iterable getIterable(); + public void setIterable(@Mutable Iterable Iterable); + + public @ReadOnly Iterable getReadOnlyIterable(); + public void setReadOnlyIterable(@ReadOnly Iterable Iterable); + } + + public class LoadIterableImpl implements LoadIterable { + public Iterable getIterable() {return new ArrayList();} + public void setIterable(Iterable Iterable) {} + + public Iterable getReadOnlyIterable() {return new ArrayList();} + public void setReadOnlyIterable(Iterable Iterable) {} + } +} diff --git a/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithPropagation.kt b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithPropagation.kt new file mode 100644 index 00000000000..8f90e700924 --- /dev/null +++ b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithPropagation.kt @@ -0,0 +1,21 @@ +package test + +import java.util.ArrayList + +public trait LoadIterableWithPropagation: java.lang.Object { + public trait LoadIterable : java.lang.Object { + public fun getIterable(): MutableIterable? + public fun setIterable(p0: MutableIterable?) + + public fun getReadOnlyIterable(): Iterable? + public fun setReadOnlyIterable(p0: Iterable?) + } + + public open class LoadIterableImpl : LoadIterable { + public override fun getIterable(): MutableIterable? = ArrayList() + public override fun setIterable(p0: MutableIterable?): Unit {} + + public override fun getReadOnlyIterable(): Iterable? = ArrayList() + public override fun setReadOnlyIterable(p0: Iterable?): Unit {} + } +} diff --git a/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithPropagation.txt b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithPropagation.txt new file mode 100644 index 00000000000..271816b9b8c --- /dev/null +++ b/compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithPropagation.txt @@ -0,0 +1,19 @@ +package test + +public trait LoadIterableWithPropagation : java.lang.Object { + + public trait LoadIterable : java.lang.Object { + public abstract fun getIterable() : jet.MutableIterable? + public abstract fun getReadOnlyIterable() : jet.Iterable? + public abstract fun setIterable(/*0*/ p0 : jet.MutableIterable?) : jet.Unit + public abstract fun setReadOnlyIterable(/*0*/ p0 : jet.Iterable?) : jet.Unit + } + + public open class LoadIterableImpl : test.LoadIterableWithPropagation.LoadIterable { + public constructor LoadIterableImpl() + public open override /*1*/ fun getIterable() : jet.MutableIterable? + public open override /*1*/ fun getReadOnlyIterable() : jet.Iterable? + public open override /*1*/ fun setIterable(/*0*/ p0 : jet.MutableIterable?) : jet.Unit + public open override /*1*/ fun setReadOnlyIterable(/*0*/ p0 : jet.Iterable?) : jet.Unit + } +} diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java index 4751df1feb5..177e669ed1a 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/LoadJavaTestGenerated.java @@ -33,7 +33,7 @@ import org.jetbrains.jet.jvm.compiler.AbstractLoadJavaTest; @InnerTestClasses({LoadJavaTestGenerated.CompiledJavaCompareWithKotlin.class, LoadJavaTestGenerated.CompiledJavaIncludeObjectMethods.class, LoadJavaTestGenerated.CompiledJava.class, LoadJavaTestGenerated.SourceJava.class, LoadJavaTestGenerated.JavaAgainstKotlin.class}) public class LoadJavaTestGenerated extends AbstractLoadJavaTest { @TestMetadata("compiler/testData/loadJava/compiledJavaCompareWithKotlin") - @InnerTestClasses({CompiledJavaCompareWithKotlin.Annotation.class, CompiledJavaCompareWithKotlin.Constructor.class, CompiledJavaCompareWithKotlin.JavaBean.class, CompiledJavaCompareWithKotlin.KotlinSignature.class, CompiledJavaCompareWithKotlin.Library.class, CompiledJavaCompareWithKotlin.Modality.class, CompiledJavaCompareWithKotlin.NotNull.class, CompiledJavaCompareWithKotlin.Vararg.class}) + @InnerTestClasses({CompiledJavaCompareWithKotlin.Annotation.class, CompiledJavaCompareWithKotlin.Constructor.class, CompiledJavaCompareWithKotlin.JavaBean.class, CompiledJavaCompareWithKotlin.KotlinSignature.class, CompiledJavaCompareWithKotlin.Library.class, CompiledJavaCompareWithKotlin.Modality.class, CompiledJavaCompareWithKotlin.Mutability.class, CompiledJavaCompareWithKotlin.NotNull.class, CompiledJavaCompareWithKotlin.Vararg.class}) public static class CompiledJavaCompareWithKotlin extends AbstractLoadJavaTest { public void testAllFilesPresentInCompiledJavaCompareWithKotlin() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/loadJava/compiledJavaCompareWithKotlin"), Pattern.compile("^(.+)\\.java$"), true); @@ -914,6 +914,34 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { } + @TestMetadata("compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability") + public static class Mutability extends AbstractLoadJavaTest { + public void testAllFilesPresentInMutability() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability"), Pattern.compile("^(.+)\\.java$"), true); + } + + @TestMetadata("LoadIterable.java") + public void testLoadIterable() throws Exception { + doTest("compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterable.java"); + } + + @TestMetadata("LoadIterableWithConflict.java") + public void testLoadIterableWithConflict() throws Exception { + doTest("compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithConflict.java"); + } + + @TestMetadata("LoadIterableWithNullability.java") + public void testLoadIterableWithNullability() throws Exception { + doTest("compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithNullability.java"); + } + + @TestMetadata("LoadIterableWithPropagation.java") + public void testLoadIterableWithPropagation() throws Exception { + doTest("compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithPropagation.java"); + } + + } + @TestMetadata("compiler/testData/loadJava/compiledJavaCompareWithKotlin/notNull") public static class NotNull extends AbstractLoadJavaTest { public void testAllFilesPresentInNotNull() throws Exception { @@ -964,6 +992,7 @@ public class LoadJavaTestGenerated extends AbstractLoadJavaTest { suite.addTest(KotlinSignature.innerSuite()); suite.addTestSuite(Library.class); suite.addTestSuite(Modality.class); + suite.addTestSuite(Mutability.class); suite.addTestSuite(NotNull.class); suite.addTestSuite(Vararg.class); return suite; 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 aa39f5c5a44..b6f7225a1dd 100644 --- a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java @@ -1075,7 +1075,7 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso } @TestMetadata("compiler/testData/loadJava/compiledJavaCompareWithKotlin") - @InnerTestClasses({CompiledJavaCompareWithKotlin.Annotation.class, CompiledJavaCompareWithKotlin.Constructor.class, CompiledJavaCompareWithKotlin.JavaBean.class, CompiledJavaCompareWithKotlin.KotlinSignature.class, CompiledJavaCompareWithKotlin.Library.class, CompiledJavaCompareWithKotlin.Modality.class, CompiledJavaCompareWithKotlin.NotNull.class, CompiledJavaCompareWithKotlin.Vararg.class}) + @InnerTestClasses({CompiledJavaCompareWithKotlin.Annotation.class, CompiledJavaCompareWithKotlin.Constructor.class, CompiledJavaCompareWithKotlin.JavaBean.class, CompiledJavaCompareWithKotlin.KotlinSignature.class, CompiledJavaCompareWithKotlin.Library.class, CompiledJavaCompareWithKotlin.Modality.class, CompiledJavaCompareWithKotlin.Mutability.class, CompiledJavaCompareWithKotlin.NotNull.class, CompiledJavaCompareWithKotlin.Vararg.class}) public static class CompiledJavaCompareWithKotlin extends AbstractLazyResolveNamespaceComparingTest { public void testAllFilesPresentInCompiledJavaCompareWithKotlin() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/loadJava/compiledJavaCompareWithKotlin"), Pattern.compile("^(.+)\\.kt$"), true); @@ -1956,6 +1956,34 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso } + @TestMetadata("compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability") + public static class Mutability extends AbstractLazyResolveNamespaceComparingTest { + public void testAllFilesPresentInMutability() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability"), Pattern.compile("^(.+)\\.kt$"), true); + } + + @TestMetadata("LoadIterable.kt") + public void testLoadIterable() throws Exception { + doTestNotCheckingPrimaryConstructors("compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterable.kt"); + } + + @TestMetadata("LoadIterableWithConflict.kt") + public void testLoadIterableWithConflict() throws Exception { + doTestNotCheckingPrimaryConstructors("compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithConflict.kt"); + } + + @TestMetadata("LoadIterableWithNullability.kt") + public void testLoadIterableWithNullability() throws Exception { + doTestNotCheckingPrimaryConstructors("compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithNullability.kt"); + } + + @TestMetadata("LoadIterableWithPropagation.kt") + public void testLoadIterableWithPropagation() throws Exception { + doTestNotCheckingPrimaryConstructors("compiler/testData/loadJava/compiledJavaCompareWithKotlin/mutability/LoadIterableWithPropagation.kt"); + } + + } + @TestMetadata("compiler/testData/loadJava/compiledJavaCompareWithKotlin/notNull") public static class NotNull extends AbstractLazyResolveNamespaceComparingTest { public void testAllFilesPresentInNotNull() throws Exception { @@ -2006,6 +2034,7 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso suite.addTest(KotlinSignature.innerSuite()); suite.addTestSuite(Library.class); suite.addTestSuite(Modality.class); + suite.addTestSuite(Mutability.class); suite.addTestSuite(NotNull.class); suite.addTestSuite(Vararg.class); return suite;