Handle java raw types in IR

Raw type Q is represented as a flexible type
  Q<B1, ... Bn> .. Q<*, ... *>
where Bi is a representative upper bound of the corresponding ith type
parameter of Q.
When mapping generic signature, JVM takes type arguments of lower bound
(which is 'Q<B1, ..., Bn>').

There is still some difference in how JVM and JVM_IR handle raw type in
signature. It requires additional investigation.
This commit is contained in:
Dmitry Petrov
2020-09-03 10:39:05 +03:00
parent 8420c0b7c7
commit 714ab7c37f
11 changed files with 507 additions and 22 deletions
@@ -0,0 +1,31 @@
// FILE: rawTypeInSignature.kt
// WITH_SIGNATURES
class GenericInv<T : Number>
class GenericIn<in T : Number>
class GenericOut<out T : Number>
fun testReturnsRawGenericInv(j: JRaw) = j.returnsRawGenericInv()
fun testReturnsRawGenericIn(j: JRaw) = j.returnsRawGenericIn()
fun testReturnsRawGenericOut(j: JRaw) = j.returnsRawGenericOut()
class KRaw(j: JRaw) : JRaw by j
// JVM: public <(Ljava/util/List<Ljava/lang/Object;>;)V> method takesRawList(p0: java.util.List): void
// JVM_IR: public <(Ljava/util/List<+Ljava/lang/Object;>;)V> method takesRawList(p0: java.util.List): void
// FILE: JRaw.java
import java.util.*;
public interface JRaw {
void takesRawList(List list);
List returnsRawList();
void takesRawGenericInv(GenericInv g);
GenericInv returnsRawGenericInv();
void takesRawGenericIn(GenericIn g);
GenericIn returnsRawGenericIn();
void takesRawGenericOut(GenericOut g);
GenericOut returnsRawGenericOut();
}
@@ -0,0 +1,40 @@
@kotlin.Metadata
public final class<<T:Ljava/lang/Number;>Ljava/lang/Object;> GenericIn {
// source: 'rawTypeInSignature.kt'
public <null> method <init>(): void
}
@kotlin.Metadata
public final class<<T:Ljava/lang/Number;>Ljava/lang/Object;> GenericInv {
// source: 'rawTypeInSignature.kt'
public <null> method <init>(): void
}
@kotlin.Metadata
public final class<<T:Ljava/lang/Number;>Ljava/lang/Object;> GenericOut {
// source: 'rawTypeInSignature.kt'
public <null> method <init>(): void
}
@kotlin.Metadata
public final class<null> KRaw {
// source: 'rawTypeInSignature.kt'
public <()LGenericIn<Ljava/lang/Number;>;> method returnsRawGenericIn(): GenericIn
public <()LGenericInv<Ljava/lang/Number;>;> method returnsRawGenericInv(): GenericInv
public <()LGenericOut<Ljava/lang/Number;>;> method returnsRawGenericOut(): GenericOut
public <()Ljava/util/List<Ljava/lang/Object;>;> method returnsRawList(): java.util.List
public <(LGenericIn<-Ljava/lang/Number;>;)V> method takesRawGenericIn(p0: GenericIn): void
public <(LGenericInv<Ljava/lang/Number;>;)V> method takesRawGenericInv(p0: GenericInv): void
public <(LGenericOut<+Ljava/lang/Number;>;)V> method takesRawGenericOut(p0: GenericOut): void
public <(Ljava/util/List<Ljava/lang/Object;>;)V> method takesRawList(p0: java.util.List): void
public <null> method <init>(@org.jetbrains.annotations.NotNull p0: JRaw): void
private synthetic final field <null> $$delegate_0: JRaw
}
@kotlin.Metadata
public final class<null> RawTypeInSignatureKt {
// source: 'rawTypeInSignature.kt'
public final static <(LJRaw;)LGenericIn<Ljava/lang/Number;>;> method testReturnsRawGenericIn(@org.jetbrains.annotations.NotNull p0: JRaw): GenericIn
public final static <(LJRaw;)LGenericInv<Ljava/lang/Number;>;> method testReturnsRawGenericInv(@org.jetbrains.annotations.NotNull p0: JRaw): GenericInv
public final static <(LJRaw;)LGenericOut<Ljava/lang/Number;>;> method testReturnsRawGenericOut(@org.jetbrains.annotations.NotNull p0: JRaw): GenericOut
}
@@ -0,0 +1,40 @@
@kotlin.Metadata
public final class<<T:Ljava/lang/Number;>Ljava/lang/Object;> GenericIn {
// source: 'rawTypeInSignature.kt'
public <null> method <init>(): void
}
@kotlin.Metadata
public final class<<T:Ljava/lang/Number;>Ljava/lang/Object;> GenericInv {
// source: 'rawTypeInSignature.kt'
public <null> method <init>(): void
}
@kotlin.Metadata
public final class<<T:Ljava/lang/Number;>Ljava/lang/Object;> GenericOut {
// source: 'rawTypeInSignature.kt'
public <null> method <init>(): void
}
@kotlin.Metadata
public final class<null> KRaw {
// source: 'rawTypeInSignature.kt'
public <()LGenericIn<Ljava/lang/Number;>;> method returnsRawGenericIn(): GenericIn
public <()LGenericInv<Ljava/lang/Number;>;> method returnsRawGenericInv(): GenericInv
public <()LGenericOut<Ljava/lang/Number;>;> method returnsRawGenericOut(): GenericOut
public <()Ljava/util/List<Ljava/lang/Object;>;> method returnsRawList(): java.util.List
public <(LGenericIn<-Ljava/lang/Number;>;)V> method takesRawGenericIn(p0: GenericIn): void
public <(LGenericInv<Ljava/lang/Number;>;)V> method takesRawGenericInv(p0: GenericInv): void
public <(LGenericOut<+Ljava/lang/Number;>;)V> method takesRawGenericOut(p0: GenericOut): void
public <(Ljava/util/List<+Ljava/lang/Object;>;)V> method takesRawList(p0: java.util.List): void
public <null> method <init>(@org.jetbrains.annotations.NotNull p0: JRaw): void
private synthetic final field <null> $$delegate_0: JRaw
}
@kotlin.Metadata
public final class<null> RawTypeInSignatureKt {
// source: 'rawTypeInSignature.kt'
public final static <(LJRaw;)LGenericIn<Ljava/lang/Number;>;> method testReturnsRawGenericIn(@org.jetbrains.annotations.NotNull p0: JRaw): GenericIn
public final static <(LJRaw;)LGenericInv<Ljava/lang/Number;>;> method testReturnsRawGenericInv(@org.jetbrains.annotations.NotNull p0: JRaw): GenericInv
public final static <(LJRaw;)LGenericOut<Ljava/lang/Number;>;> method testReturnsRawGenericOut(@org.jetbrains.annotations.NotNull p0: JRaw): GenericOut
}