KT-937 When loading array types from Java project them so that they are covariant

#KT-937 Fixed
This commit is contained in:
Alexander Udalov
2012-08-01 21:14:32 +04:00
parent 8550b74fdb
commit a85f46816e
11 changed files with 55 additions and 13 deletions
@@ -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;
@@ -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");
@@ -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)
}
}
+6 -6
View File
@@ -86,7 +86,7 @@
</item>
<item name='java.util.ArrayList T[] toArray(T[])'>
<annotation name='jet.runtime.typeinfo.KotlinSignature'>
<val name="value" val="&quot;fun &lt;T&gt; toArray(a : Array&lt;T&gt;) : Array&lt;T&gt;&quot;"/>
<val name="value" val="&quot;fun &lt;T&gt; toArray(a : Array&lt;out T&gt;) : Array&lt;T&gt;&quot;"/>
</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="&quot;fun &lt;T&gt; toArray(a : Array&lt;T&gt;) : Array&lt;T&gt;&quot;"/>
<val name="value" val="&quot;fun &lt;T&gt; toArray(a : Array&lt;out T&gt;) : Array&lt;T&gt;&quot;"/>
</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="&quot;fun &lt;T&gt; toArray(a : Array&lt;T&gt;) : Array&lt;T&gt;&quot;"/>
<val name="value" val="&quot;fun &lt;T&gt; toArray(a : Array&lt;out T&gt;) : Array&lt;T&gt;&quot;"/>
</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="&quot;fun &lt;T&gt; toArray(a : Array&lt;T&gt;) : Array&lt;T&gt;&quot;"/>
<val name="value" val="&quot;fun &lt;T&gt; toArray(a : Array&lt;out T&gt;) : Array&lt;T&gt;&quot;"/>
</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="&quot;fun &lt;T&gt; toArray(a : Array&lt;T&gt;) : Array&lt;T&gt;&quot;"/>
<val name="value" val="&quot;fun &lt;T&gt; toArray(a : Array&lt;out T&gt;) : Array&lt;T&gt;&quot;"/>
</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="&quot;fun &lt;T&gt; toArray(a : Array&lt;T&gt;) : Array&lt;T&gt;&quot;"/>
<val name="value" val="&quot;fun &lt;T&gt; toArray(a : Array&lt;out T&gt;) : Array&lt;T&gt;&quot;"/>
</annotation>
</item>
<item name='java.util.Iterator E next()'>