KT-937 When loading array types from Java project them so that they are covariant
#KT-937 Fixed
This commit is contained in:
+1
-1
@@ -851,7 +851,7 @@ public class JavaDescriptorResolver implements DependencyClassByQualifiedNameRes
|
|||||||
outType = semanticServices.getTypeTransformer().transformToType(typeFromAnnotation, typeVariableResolver);
|
outType = semanticServices.getTypeTransformer().transformToType(typeFromAnnotation, typeVariableResolver);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
outType = semanticServices.getTypeTransformer().transformToType(psiType, typeVariableResolver);
|
outType = semanticServices.getTypeTransformer().transformToType(psiType, JavaTypeTransformer.TypeUsage.MEMBER_SIGNATURE_CONTRAVARIANT, typeVariableResolver);
|
||||||
}
|
}
|
||||||
|
|
||||||
JetType varargElementType;
|
JetType varargElementType;
|
||||||
|
|||||||
+11
-2
@@ -116,7 +116,7 @@ public class JavaTypeTransformer {
|
|||||||
@NotNull
|
@NotNull
|
||||||
public JetType transformToType(@NotNull PsiType javaType, @NotNull final TypeUsage howThisTypeIsUsed,
|
public JetType transformToType(@NotNull PsiType javaType, @NotNull final TypeUsage howThisTypeIsUsed,
|
||||||
@NotNull final TypeVariableResolver typeVariableResolver) {
|
@NotNull final TypeVariableResolver typeVariableResolver) {
|
||||||
return javaType.accept(new PsiTypeVisitor<JetType>() {
|
JetType result = javaType.accept(new PsiTypeVisitor<JetType>() {
|
||||||
@Override
|
@Override
|
||||||
public JetType visitClassType(PsiClassType classType) {
|
public JetType visitClassType(PsiClassType classType) {
|
||||||
PsiClassType.ClassResolveResult classResolveResult = classType.resolveGenerics();
|
PsiClassType.ClassResolveResult classResolveResult = classType.resolveGenerics();
|
||||||
@@ -218,8 +218,16 @@ public class JavaTypeTransformer {
|
|||||||
return TypeUtils.makeNullable(jetType);
|
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);
|
JetType type = transformToType(componentType, typeVariableResolver);
|
||||||
return TypeUtils.makeNullable(JetStandardLibrary.getInstance().getArrayType(type));
|
return TypeUtils.makeNullable(JetStandardLibrary.getInstance().getArrayType(variance, type));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -227,6 +235,7 @@ public class JavaTypeTransformer {
|
|||||||
throw new UnsupportedOperationException("Unsupported type: " + type.getPresentableText()); // TODO
|
throw new UnsupportedOperationException("Unsupported type: " + type.getPresentableText()); // TODO
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<String, JetType> getPrimitiveTypesMap() {
|
public Map<String, JetType> getPrimitiveTypesMap() {
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package test;
|
||||||
|
|
||||||
|
public final class ArrayTypeVariance {
|
||||||
|
public final Object[] toArray(Object[] p0) {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
public class ArrayTypeVariance : java.lang.Object() {
|
||||||
|
public fun toArray(p0: Array<out Any?>?): Array<Any?>? {
|
||||||
|
throw UnsupportedOperationException()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
namespace test
|
||||||
|
|
||||||
|
public final class test.ArrayTypeVariance : java.lang.Object {
|
||||||
|
public final /*constructor*/ fun <init>(): test.ArrayTypeVariance
|
||||||
|
public final fun toArray(/*0*/ p0: jet.Array<out jet.Any?>?): jet.Array<jet.Any?>?
|
||||||
|
}
|
||||||
@@ -26,5 +26,5 @@ public open class test.ModalityOfFakeOverrides : java.util.AbstractList<jet.Stri
|
|||||||
public open override /*1*/ fun size(): jet.Int
|
public open override /*1*/ fun size(): jet.Int
|
||||||
public open override /*1*/ fun subList(/*0*/ p0: jet.Int, /*1*/ p1: jet.Int): java.util.List<jet.String>?
|
public open override /*1*/ fun subList(/*0*/ p0: jet.Int, /*1*/ p1: jet.Int): java.util.List<jet.String>?
|
||||||
public open override /*1*/ fun toArray(): jet.Array<jet.Any?>?
|
public open override /*1*/ fun toArray(): jet.Array<jet.Any?>?
|
||||||
public open override /*1*/ fun </*0*/ T : jet.Any?>toArray(/*0*/ p0: jet.Array<T?>?): jet.Array<T?>?
|
public open override /*1*/ fun </*0*/ T : jet.Any?>toArray(/*0*/ p0: jet.Array<out T?>?): jet.Array<T?>?
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
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")
|
@TestMetadata("ClassDoesNotOverrideMethod.java")
|
||||||
public void testClassDoesNotOverrideMethod() throws Exception {
|
public void testClassDoesNotOverrideMethod() throws Exception {
|
||||||
doTest("compiler/testData/readJavaBinaryClass/ClassDoesNotOverrideMethod.java");
|
doTest("compiler/testData/readJavaBinaryClass/ClassDoesNotOverrideMethod.java");
|
||||||
|
|||||||
+9
-1
@@ -15,12 +15,15 @@
|
|||||||
*/
|
*/
|
||||||
package org.jetbrains.jet.lang.resolve.lazy;
|
package org.jetbrains.jet.lang.resolve.lazy;
|
||||||
|
|
||||||
|
import junit.framework.Assert;
|
||||||
import junit.framework.Test;
|
import junit.framework.Test;
|
||||||
import junit.framework.TestSuite;
|
import junit.framework.TestSuite;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import org.jetbrains.jet.JetTestUtils;
|
import org.jetbrains.jet.JetTestUtils;
|
||||||
import org.jetbrains.jet.test.TestMetadata;
|
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 */
|
/** This class is generated by {@link org.jetbrains.jet.lang.resolve.lazy.AbstractLazyResolveNamespaceComparingTest}. DO NOT MODIFY MANUALLY */
|
||||||
public class LazyResolveNamespaceComparingTestGenerated extends AbstractLazyResolveNamespaceComparingTest {
|
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);
|
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")
|
@TestMetadata("ClassDoesNotOverrideMethod.kt")
|
||||||
public void testClassDoesNotOverrideMethod() throws Exception {
|
public void testClassDoesNotOverrideMethod() throws Exception {
|
||||||
doTestSinglePackage("compiler/testData/readJavaBinaryClass/ClassDoesNotOverrideMethod.kt");
|
doTestSinglePackage("compiler/testData/readJavaBinaryClass/ClassDoesNotOverrideMethod.kt");
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import foo.Intf
|
|||||||
|
|
||||||
class Impl(): Intf {
|
class Impl(): Intf {
|
||||||
|
|
||||||
public override fun fooBar(i: Int, s: Array<String?>?, foo: Any?) {
|
public override fun fooBar(i: Int, s: Array<out String?>?, foo: Any?) {
|
||||||
throw UnsupportedOperationException()
|
throw UnsupportedOperationException()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import foo.A
|
|||||||
|
|
||||||
class C : A() {
|
class C : A() {
|
||||||
|
|
||||||
public override fun getAnswer(array: Array<String?>?, number: Int, value: Any?): Int {
|
public override fun getAnswer(array: Array<out String?>?, number: Int, value: Any?): Int {
|
||||||
return super<A>.getAnswer(array, number, value)
|
return super<A>.getAnswer(array, number, value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -86,7 +86,7 @@
|
|||||||
</item>
|
</item>
|
||||||
<item name='java.util.ArrayList T[] toArray(T[])'>
|
<item name='java.util.ArrayList T[] toArray(T[])'>
|
||||||
<annotation name='jet.runtime.typeinfo.KotlinSignature'>
|
<annotation name='jet.runtime.typeinfo.KotlinSignature'>
|
||||||
<val name="value" val=""fun <T> toArray(a : Array<T>) : Array<T>""/>
|
<val name="value" val=""fun <T> toArray(a : Array<out T>) : Array<T>""/>
|
||||||
</annotation>
|
</annotation>
|
||||||
</item>
|
</item>
|
||||||
<item name='java.util.List boolean add(E)'>
|
<item name='java.util.List boolean add(E)'>
|
||||||
@@ -166,7 +166,7 @@
|
|||||||
</item>
|
</item>
|
||||||
<item name='java.util.List T[] toArray(T[])'>
|
<item name='java.util.List T[] toArray(T[])'>
|
||||||
<annotation name='jet.runtime.typeinfo.KotlinSignature'>
|
<annotation name='jet.runtime.typeinfo.KotlinSignature'>
|
||||||
<val name="value" val=""fun <T> toArray(a : Array<T>) : Array<T>""/>
|
<val name="value" val=""fun <T> toArray(a : Array<out T>) : Array<T>""/>
|
||||||
</annotation>
|
</annotation>
|
||||||
</item>
|
</item>
|
||||||
<item name='java.util.HashSet boolean add(E)'>
|
<item name='java.util.HashSet boolean add(E)'>
|
||||||
@@ -216,7 +216,7 @@
|
|||||||
</item>
|
</item>
|
||||||
<item name='java.util.Collection T[] toArray(T[])'>
|
<item name='java.util.Collection T[] toArray(T[])'>
|
||||||
<annotation name='jet.runtime.typeinfo.KotlinSignature'>
|
<annotation name='jet.runtime.typeinfo.KotlinSignature'>
|
||||||
<val name="value" val=""fun <T> toArray(a : Array<T>) : Array<T>""/>
|
<val name="value" val=""fun <T> toArray(a : Array<out T>) : Array<T>""/>
|
||||||
</annotation>
|
</annotation>
|
||||||
</item>
|
</item>
|
||||||
<item name='java.util.Map.Entry K getKey()'>
|
<item name='java.util.Map.Entry K getKey()'>
|
||||||
@@ -301,7 +301,7 @@
|
|||||||
</item>
|
</item>
|
||||||
<item name='java.util.Set T[] toArray(T[])'>
|
<item name='java.util.Set T[] toArray(T[])'>
|
||||||
<annotation name='jet.runtime.typeinfo.KotlinSignature'>
|
<annotation name='jet.runtime.typeinfo.KotlinSignature'>
|
||||||
<val name="value" val=""fun <T> toArray(a : Array<T>) : Array<T>""/>
|
<val name="value" val=""fun <T> toArray(a : Array<out T>) : Array<T>""/>
|
||||||
</annotation>
|
</annotation>
|
||||||
</item>
|
</item>
|
||||||
<item name='java.util.AbstractCollection boolean add(E)'>
|
<item name='java.util.AbstractCollection boolean add(E)'>
|
||||||
@@ -341,7 +341,7 @@
|
|||||||
</item>
|
</item>
|
||||||
<item name='java.util.AbstractCollection T[] toArray(T[])'>
|
<item name='java.util.AbstractCollection T[] toArray(T[])'>
|
||||||
<annotation name='jet.runtime.typeinfo.KotlinSignature'>
|
<annotation name='jet.runtime.typeinfo.KotlinSignature'>
|
||||||
<val name="value" val=""fun <T> toArray(a : Array<T>) : Array<T>""/>
|
<val name="value" val=""fun <T> toArray(a : Array<out T>) : Array<T>""/>
|
||||||
</annotation>
|
</annotation>
|
||||||
</item>
|
</item>
|
||||||
<item name='java.util.Enumeration E nextElement()'>
|
<item name='java.util.Enumeration E nextElement()'>
|
||||||
@@ -556,7 +556,7 @@
|
|||||||
</item>
|
</item>
|
||||||
<item name='java.util.LinkedList T[] toArray(T[])'>
|
<item name='java.util.LinkedList T[] toArray(T[])'>
|
||||||
<annotation name='jet.runtime.typeinfo.KotlinSignature'>
|
<annotation name='jet.runtime.typeinfo.KotlinSignature'>
|
||||||
<val name="value" val=""fun <T> toArray(a : Array<T>) : Array<T>""/>
|
<val name="value" val=""fun <T> toArray(a : Array<out T>) : Array<T>""/>
|
||||||
</annotation>
|
</annotation>
|
||||||
</item>
|
</item>
|
||||||
<item name='java.util.Iterator E next()'>
|
<item name='java.util.Iterator E next()'>
|
||||||
|
|||||||
Reference in New Issue
Block a user