diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index a7bd29bc05e..dcdea8b641c 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -851,7 +851,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes outType = semanticServices.getTypeTransformer().transformToType(typeFromAnnotation, typeVariableResolver); } else { - outType = semanticServices.getTypeTransformer().transformToType(psiType, typeVariableResolver); + outType = semanticServices.getTypeTransformer().transformToType(psiType, JavaTypeTransformer.TypeUsage.MEMBER_SIGNATURE_CONTRAVARIANT, typeVariableResolver); } JetType varargElementType; 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 89d4422d395..601ba5d926e 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 @@ -116,7 +116,7 @@ public class JavaTypeTransformer { @NotNull public JetType transformToType(@NotNull PsiType javaType, @NotNull final TypeUsage howThisTypeIsUsed, @NotNull final TypeVariableResolver typeVariableResolver) { - return javaType.accept(new PsiTypeVisitor() { + JetType result = javaType.accept(new PsiTypeVisitor() { @Override public JetType visitClassType(PsiClassType classType) { PsiClassType.ClassResolveResult classResolveResult = classType.resolveGenerics(); @@ -218,8 +218,16 @@ public class JavaTypeTransformer { return TypeUtils.makeNullable(jetType); } + Variance variance; + if (howThisTypeIsUsed == MEMBER_SIGNATURE_CONTRAVARIANT && !(arrayType instanceof PsiEllipsisType)) { + variance = Variance.OUT_VARIANCE; + } + else { + variance = Variance.INVARIANT; + } + JetType type = transformToType(componentType, typeVariableResolver); - return TypeUtils.makeNullable(JetStandardLibrary.getInstance().getArrayType(type)); + return TypeUtils.makeNullable(JetStandardLibrary.getInstance().getArrayType(variance, type)); } @Override @@ -227,6 +235,7 @@ public class JavaTypeTransformer { throw new UnsupportedOperationException("Unsupported type: " + type.getPresentableText()); // TODO } }); + return result; } public Map getPrimitiveTypesMap() { diff --git a/compiler/testData/readJavaBinaryClass/ArrayTypeVariance.java b/compiler/testData/readJavaBinaryClass/ArrayTypeVariance.java new file mode 100644 index 00000000000..512559ad489 --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/ArrayTypeVariance.java @@ -0,0 +1,7 @@ +package test; + +public final class ArrayTypeVariance { + public final Object[] toArray(Object[] p0) { + throw new UnsupportedOperationException(); + } +} diff --git a/compiler/testData/readJavaBinaryClass/ArrayTypeVariance.kt b/compiler/testData/readJavaBinaryClass/ArrayTypeVariance.kt new file mode 100644 index 00000000000..7883a32e19b --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/ArrayTypeVariance.kt @@ -0,0 +1,7 @@ +package test + +public class ArrayTypeVariance : java.lang.Object() { + public fun toArray(p0: Array?): Array? { + throw UnsupportedOperationException() + } +} diff --git a/compiler/testData/readJavaBinaryClass/ArrayTypeVariance.txt b/compiler/testData/readJavaBinaryClass/ArrayTypeVariance.txt new file mode 100644 index 00000000000..5ff82f8222c --- /dev/null +++ b/compiler/testData/readJavaBinaryClass/ArrayTypeVariance.txt @@ -0,0 +1,6 @@ +namespace test + +public final class test.ArrayTypeVariance : java.lang.Object { + public final /*constructor*/ fun (): test.ArrayTypeVariance + public final fun toArray(/*0*/ p0: jet.Array?): jet.Array? +} diff --git a/compiler/testData/readJavaBinaryClass/modality/ModalityOfFakeOverrides.txt b/compiler/testData/readJavaBinaryClass/modality/ModalityOfFakeOverrides.txt index f1de701f0cf..76f4b8cf5c6 100644 --- a/compiler/testData/readJavaBinaryClass/modality/ModalityOfFakeOverrides.txt +++ b/compiler/testData/readJavaBinaryClass/modality/ModalityOfFakeOverrides.txt @@ -26,5 +26,5 @@ public open class test.ModalityOfFakeOverrides : java.util.AbstractList? public open override /*1*/ fun toArray(): jet.Array? - public open override /*1*/ fun toArray(/*0*/ p0: jet.Array?): jet.Array? + public open override /*1*/ fun toArray(/*0*/ p0: jet.Array?): jet.Array? } diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/ReadJavaBinaryClassTestGenerated.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/ReadJavaBinaryClassTestGenerated.java index 70794cf4e9e..221bbecafae 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/ReadJavaBinaryClassTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/ReadJavaBinaryClassTestGenerated.java @@ -32,6 +32,11 @@ public class ReadJavaBinaryClassTestGenerated extends AbstractReadJavaBinaryClas JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.jvm.compiler.AbstractReadJavaBinaryClassTest", new File("compiler/testData/readJavaBinaryClass"), "java", false); } + @TestMetadata("ArrayTypeVariance.java") + public void testArrayTypeVariance() throws Exception { + doTest("compiler/testData/readJavaBinaryClass/ArrayTypeVariance.java"); + } + @TestMetadata("ClassDoesNotOverrideMethod.java") public void testClassDoesNotOverrideMethod() throws Exception { doTest("compiler/testData/readJavaBinaryClass/ClassDoesNotOverrideMethod.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 6f5625789c4..9be5d5928fd 100644 --- a/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/lang/resolve/lazy/LazyResolveNamespaceComparingTestGenerated.java @@ -15,12 +15,15 @@ */ package org.jetbrains.jet.lang.resolve.lazy; +import junit.framework.Assert; import junit.framework.Test; import junit.framework.TestSuite; + +import java.io.File; import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.test.TestMetadata; -import java.io.File; +import org.jetbrains.jet.lang.resolve.lazy.AbstractLazyResolveNamespaceComparingTest; /** This class is generated by {@link org.jetbrains.jet.lang.resolve.lazy.AbstractLazyResolveNamespaceComparingTest}. DO NOT MODIFY MANUALLY */ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyResolveNamespaceComparingTest { @@ -857,6 +860,11 @@ public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyReso JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.lang.resolve.lazy.AbstractLazyResolveNamespaceComparingTest", new File("compiler/testData/readJavaBinaryClass"), "kt", false); } + @TestMetadata("ArrayTypeVariance.kt") + public void testArrayTypeVariance() throws Exception { + doTestSinglePackage("compiler/testData/readJavaBinaryClass/ArrayTypeVariance.kt"); + } + @TestMetadata("ClassDoesNotOverrideMethod.kt") public void testClassDoesNotOverrideMethod() throws Exception { doTestSinglePackage("compiler/testData/readJavaBinaryClass/ClassDoesNotOverrideMethod.kt"); diff --git a/idea/testData/codeInsight/overrideImplement/javaParameters/foo/Impl.kt.after b/idea/testData/codeInsight/overrideImplement/javaParameters/foo/Impl.kt.after index 25a00fb9429..7ccbabbe802 100644 --- a/idea/testData/codeInsight/overrideImplement/javaParameters/foo/Impl.kt.after +++ b/idea/testData/codeInsight/overrideImplement/javaParameters/foo/Impl.kt.after @@ -2,7 +2,7 @@ import foo.Intf class Impl(): Intf { - public override fun fooBar(i: Int, s: Array?, foo: Any?) { + public override fun fooBar(i: Int, s: Array?, foo: Any?) { throw UnsupportedOperationException() } } diff --git a/idea/testData/codeInsight/overrideImplement/overrideJavaMethod/foo/Impl.kt.after b/idea/testData/codeInsight/overrideImplement/overrideJavaMethod/foo/Impl.kt.after index 52e986dbbe4..c399baf5e61 100644 --- a/idea/testData/codeInsight/overrideImplement/overrideJavaMethod/foo/Impl.kt.after +++ b/idea/testData/codeInsight/overrideImplement/overrideJavaMethod/foo/Impl.kt.after @@ -2,7 +2,7 @@ import foo.A class C : A() { - public override fun getAnswer(array: Array?, number: Int, value: Any?): Int { + public override fun getAnswer(array: Array?, number: Int, value: Any?): Int { return super.getAnswer(array, number, value) } } diff --git a/jdk-annotations/java/util/annotations.xml b/jdk-annotations/java/util/annotations.xml index fd04ab52a52..3caee157def 100644 --- a/jdk-annotations/java/util/annotations.xml +++ b/jdk-annotations/java/util/annotations.xml @@ -86,7 +86,7 @@ - + @@ -166,7 +166,7 @@ - + @@ -216,7 +216,7 @@ - + @@ -301,7 +301,7 @@ - + @@ -341,7 +341,7 @@ - + @@ -556,7 +556,7 @@ - +