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);
|
||||
}
|
||||
else {
|
||||
outType = semanticServices.getTypeTransformer().transformToType(psiType, typeVariableResolver);
|
||||
outType = semanticServices.getTypeTransformer().transformToType(psiType, JavaTypeTransformer.TypeUsage.MEMBER_SIGNATURE_CONTRAVARIANT, typeVariableResolver);
|
||||
}
|
||||
|
||||
JetType varargElementType;
|
||||
|
||||
+11
-2
@@ -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>() {
|
||||
JetType result = javaType.accept(new PsiTypeVisitor<JetType>() {
|
||||
@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<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 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 </*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);
|
||||
}
|
||||
|
||||
@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");
|
||||
|
||||
+9
-1
@@ -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");
|
||||
|
||||
@@ -2,7 +2,7 @@ import foo.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()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ import foo.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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
</item>
|
||||
<item name='java.util.ArrayList T[] toArray(T[])'>
|
||||
<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>
|
||||
</item>
|
||||
<item name='java.util.List boolean add(E)'>
|
||||
@@ -166,7 +166,7 @@
|
||||
</item>
|
||||
<item name='java.util.List T[] toArray(T[])'>
|
||||
<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>
|
||||
</item>
|
||||
<item name='java.util.HashSet boolean add(E)'>
|
||||
@@ -216,7 +216,7 @@
|
||||
</item>
|
||||
<item name='java.util.Collection T[] toArray(T[])'>
|
||||
<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>
|
||||
</item>
|
||||
<item name='java.util.Map.Entry K getKey()'>
|
||||
@@ -301,7 +301,7 @@
|
||||
</item>
|
||||
<item name='java.util.Set T[] toArray(T[])'>
|
||||
<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>
|
||||
</item>
|
||||
<item name='java.util.AbstractCollection boolean add(E)'>
|
||||
@@ -341,7 +341,7 @@
|
||||
</item>
|
||||
<item name='java.util.AbstractCollection T[] toArray(T[])'>
|
||||
<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>
|
||||
</item>
|
||||
<item name='java.util.Enumeration E nextElement()'>
|
||||
@@ -556,7 +556,7 @@
|
||||
</item>
|
||||
<item name='java.util.LinkedList T[] toArray(T[])'>
|
||||
<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>
|
||||
</item>
|
||||
<item name='java.util.Iterator E next()'>
|
||||
|
||||
Reference in New Issue
Block a user