Support basic light-classes basic with FIR for CLI

This commit is contained in:
Denis Zharkov
2019-08-23 16:22:30 +03:00
parent e7410348a7
commit bf610323cf
38 changed files with 1077 additions and 11 deletions
@@ -0,0 +1,30 @@
// FILE: K1.kt
class K2: J1() {
fun bar() {
foo()
baz()
superClass()
superI()
}
}
// FILE: J1.java
public class J1 extends KFirst {
void baz() {}
}
// FILE: K2.kt
open class KFirst : SuperClass(), SuperI {
fun foo() {
}
}
// FILE: K3.kt
abstract class SuperClass {
fun superClass() {}
}
interface SuperI {
fun superI() {}
}
@@ -0,0 +1,39 @@
FILE: K1.kt
public final class K2 : R|J1| {
public constructor(): R|K2| {
super<R|J1|>()
}
public final fun bar(): R|kotlin/Unit| {
this@R|/KFirst|.R|/KFirst.foo|()
this@R|/J1|.R|/J1.baz|()
this@R|/SuperClass|.R|/SuperClass.superClass|()
this@R|/SuperI|.R|/SuperI.superI|()
}
}
FILE: K2.kt
public open class KFirst : R|SuperClass|, R|SuperI| {
public constructor(): R|KFirst| {
super<R|SuperClass|>()
}
public final fun foo(): R|kotlin/Unit| {
}
}
FILE: K3.kt
public abstract class SuperClass : R|kotlin/Any| {
public constructor(): R|SuperClass| {
super<R|kotlin/Any|>()
}
public final fun superClass(): R|kotlin/Unit| {
}
}
public abstract interface SuperI : R|kotlin/Any| {
public open fun superI(): R|kotlin/Unit| {
}
}
@@ -0,0 +1,37 @@
// FILE: K1.kt
class KSub : J1()
fun main(k: KSub, vString: SuperClass<String>.NestedInSuperClass, vInt: SuperClass<Int>.NestedInSuperClass) {
k.getImpl().nestedI(vString)
// TODO: Support parametrisized inner classes
k.getImpl().nestedI(vInt)
k.getNestedSubClass().nested("")
k.getNestedSubClass().nested(1)
}
// FILE: J1.java
public class J1 extends KFirst {
public class NestedSubClass extends NestedInSuperClass {}
public abstract class NestedIImpl implements NestedInI<NestedInSuperClass> {}
public NestedIImpl getImpl() { return null; }
public NestedSubClass getNestedSubClass() { return null; }
}
// FILE: K2.kt
open class KFirst : SuperClass<String>(), SuperI<Int>
// FILE: K3.kt
abstract class SuperClass<T> {
inner open class NestedInSuperClass {
fun nested(x: T) {}
}
}
interface SuperI<E> {
interface NestedInI<F> {
fun nestedI(f: F) {}
}
}
@@ -0,0 +1,45 @@
FILE: K1.kt
public final class KSub : R|J1| {
public constructor(): R|KSub| {
super<R|J1|>()
}
}
public final fun main(k: R|KSub|, vString: R|SuperClass.NestedInSuperClass<kotlin/String>|, vInt: R|SuperClass.NestedInSuperClass<kotlin/Int>|): R|kotlin/Unit| {
R|<local>/k|.R|/J1.getImpl|().R|FakeOverride</SuperI.NestedInI.nestedI: R|kotlin/Unit|>|(R|<local>/vString|)
R|<local>/k|.R|/J1.getImpl|().R|FakeOverride</SuperI.NestedInI.nestedI: R|kotlin/Unit|>|(R|<local>/vInt|)
R|<local>/k|.R|/J1.getNestedSubClass|().<Inapplicable(INAPPLICABLE): [/SuperClass.NestedInSuperClass.nested]>#(String())
R|<local>/k|.R|/J1.getNestedSubClass|().<Inapplicable(INAPPLICABLE): [/SuperClass.NestedInSuperClass.nested]>#(Int(1))
}
FILE: K2.kt
public open class KFirst : R|SuperClass<kotlin/String>|, R|SuperI<kotlin/Int>| {
public constructor(): R|KFirst| {
super<R|SuperClass<kotlin/String>|>()
}
}
FILE: K3.kt
public abstract class SuperClass<T> : R|kotlin/Any| {
public constructor<T>(): R|SuperClass<T>| {
super<R|kotlin/Any|>()
}
public open inner class NestedInSuperClass : R|kotlin/Any| {
public constructor(): R|SuperClass.NestedInSuperClass| {
super<R|kotlin/Any|>()
}
public final fun nested(x: R|T|): R|kotlin/Unit| {
}
}
}
public abstract interface SuperI<E> : R|kotlin/Any| {
public abstract interface NestedInI<F> : R|kotlin/Any| {
public open fun nestedI(f: R|F|): R|kotlin/Unit| {
}
}
}
@@ -0,0 +1,18 @@
// FILE: K1.kt
open class KFirst() {
fun foo() {
}
}
// FILE: J1.java
public class J1 extends KFirst {
void baz() {}
}
// FILE: K2.kt
class K2: J1() {
fun bar() {
foo()
baz()
}
}
@@ -0,0 +1,22 @@
FILE: K1.kt
public open class KFirst : R|kotlin/Any| {
public constructor(): R|KFirst| {
super<R|kotlin/Any|>()
}
public final fun foo(): R|kotlin/Unit| {
}
}
FILE: K2.kt
public final class K2 : R|J1| {
public constructor(): R|K2| {
super<R|J1|>()
}
public final fun bar(): R|kotlin/Unit| {
this@R|/KFirst|.R|/KFirst.foo|()
this@R|/J1|.R|/J1.baz|()
}
}
@@ -0,0 +1,17 @@
// FILE: K1.kt
open class KFirst<T: java.io.Serializable>() {
fun foo(t: T): T = t
}
// FILE: J1.java
public class J1 extends KFirst<Integer> {
void baz() {}
}
// FILE: K2.kt
class K2: J1() {
fun bar() {
foo(1)
baz()
}
}
@@ -0,0 +1,23 @@
FILE: K1.kt
public open class KFirst<T : R|java/io/Serializable|> : R|kotlin/Any| {
public constructor<T : R|java/io/Serializable|>(): R|KFirst<T>| {
super<R|kotlin/Any|>()
}
public final fun foo(t: R|T|): R|T| {
^foo R|<local>/t|
}
}
FILE: K2.kt
public final class K2 : R|J1| {
public constructor(): R|K2| {
super<R|J1|>()
}
public final fun bar(): R|kotlin/Unit| {
this@R|/KFirst|.R|FakeOverride</KFirst.foo: R|kotlin/Int|>|(Int(1))
this@R|/J1|.R|/J1.baz|()
}
}
@@ -0,0 +1,13 @@
// FILE: K1.kt
class KotlinClass
// FILE: JavaClass.java
public class JavaClass {
public static void baz(KotlinClass k) {}
}
// FILE: K2.kt
fun main() {
JavaClass.baz(KotlinClass())
JavaClass.baz("")
}
@@ -0,0 +1,12 @@
FILE: K1.kt
public final class KotlinClass : R|kotlin/Any| {
public constructor(): R|KotlinClass| {
super<R|kotlin/Any|>()
}
}
FILE: K2.kt
public final fun main(): R|kotlin/Unit| {
Q|JavaClass|.R|/JavaClass.baz|(R|/KotlinClass.KotlinClass|())
Q|JavaClass|.<Inapplicable(INAPPLICABLE): [/JavaClass.baz]>#(String())
}
@@ -0,0 +1,15 @@
// FILE: K1.kt
class KotlinClass<T>
// FILE: JavaClass.java
public class JavaClass {
public static void baz(KotlinClass<Integer> k) {}
}
// FILE: K2.kt
fun main() {
JavaClass.baz(KotlinClass())
JavaClass.baz(KotlinClass<Int>())
JavaClass.baz(KotlinClass<String>())
JavaClass.baz("")
}
@@ -0,0 +1,14 @@
FILE: K1.kt
public final class KotlinClass<T> : R|kotlin/Any| {
public constructor<T>(): R|KotlinClass<T>| {
super<R|kotlin/Any|>()
}
}
FILE: K2.kt
public final fun main(): R|kotlin/Unit| {
Q|JavaClass|.R|/JavaClass.baz|(R|/KotlinClass.KotlinClass|<R|ft<kotlin/Int, kotlin/Int?>!|>())
Q|JavaClass|.R|/JavaClass.baz|(R|/KotlinClass.KotlinClass|<R|kotlin/Int|>())
Q|JavaClass|.<Inapplicable(INAPPLICABLE): [/JavaClass.baz]>#(R|/KotlinClass.KotlinClass|<R|kotlin/String|>())
Q|JavaClass|.<Inapplicable(INAPPLICABLE): [/JavaClass.baz]>#(String())
}
@@ -0,0 +1,34 @@
// FILE: K1.kt
open class KotlinOuter {
inner open class KotlinInner {
fun foo() {}
}
fun bar() {}
}
// FILE: J1.java
public class J1 extends KotlinOuter {
public class J2 extends KotlinInner {
public void bazbaz() {}
}
public void baz() {}
}
// FILE: K2.kt
class K2: J1() {
fun main() {
bar()
baz()
}
inner class K3 : J2() {
fun main() {
foo()
bazbaz()
bar()
baz()
}
}
}
@@ -0,0 +1,46 @@
FILE: K1.kt
public open class KotlinOuter : R|kotlin/Any| {
public constructor(): R|KotlinOuter| {
super<R|kotlin/Any|>()
}
public open inner class KotlinInner : R|kotlin/Any| {
public constructor(): R|KotlinOuter.KotlinInner| {
super<R|kotlin/Any|>()
}
public final fun foo(): R|kotlin/Unit| {
}
}
public final fun bar(): R|kotlin/Unit| {
}
}
FILE: K2.kt
public final class K2 : R|J1| {
public constructor(): R|K2| {
super<R|J1|>()
}
public final fun main(): R|kotlin/Unit| {
this@R|/KotlinOuter|.R|/KotlinOuter.bar|()
this@R|/J1|.R|/J1.baz|()
}
public final inner class K3 : R|J1.J2| {
public constructor(): R|K2.K3| {
super<R|J1.J2|>()
}
public final fun main(): R|kotlin/Unit| {
this@R|/KotlinOuter.KotlinInner|.R|/KotlinOuter.KotlinInner.foo|()
this@R|/J1.J2|.R|/J1.J2.bazbaz|()
this@R|/KotlinOuter|.R|/KotlinOuter.bar|()
this@R|/J1|.R|/J1.baz|()
}
}
}