[FE 1.0] Support java sealed classes

^KT-46778 Fixed
This commit is contained in:
Dmitriy Novozhilov
2021-07-14 11:35:20 +03:00
committed by teamcityserver
parent 972211f8e6
commit fa1d09c778
32 changed files with 365 additions and 38 deletions
@@ -0,0 +1 @@
<modernJava>
@@ -0,0 +1,36 @@
// ISSUE: KT-41215, KT-43551
// MODULE: lib
// FILE: Base.java
public sealed class Base permits A, B {}
// FILE: A.java
public final class A extends Base {}
// FILE: B.java
public sealed class B extends Base permits B.C, B.D {
public static final class C extends B {}
public static non-sealed class D extends B {}
}
// MODULE: main(lib)
fun test_1(base: Base): String {
return when (base) {
is A -> "O"
is B -> "Fail"
}
}
fun test_2(base: Base): String {
return when (base) {
is A -> "Fail A"
is B.C -> "K"
is B.D -> "Fail B.D"
}
}
fun box(): String {
return test_1(A()) + test_2(B.C())
}
@@ -0,0 +1,45 @@
// ISSUE: KT-41215, KT-43551
// MODULE: lib
// FILE: Base.java
public sealed interface Base permits A, B, E {}
// FILE: A.java
public non-sealed interface A extends Base {}
// FILE: B.java
public sealed interface B extends Base permits B.C, B.D {
public static final class C implements B {}
public static non-sealed interface D extends B {}
}
// FILE: E.java
public enum E implements Base {
First, Second
}
// MODULE: main(lib)
fun test_1(base: Base): String {
return when (base) {
is A -> "Fail A"
is B -> "Fail B"
is E -> "O"
}
}
fun test_2(base: Base): String {
return when (base) {
is A -> "Fail A"
is B.C -> "Fail B.C"
is B.D -> "K"
E.First -> "Fail E.First"
E.Second -> "Fail E.Second"
}
}
class MyD : B.D
fun box(): String {
return test_1(E.First) + test_2(MyD())
}
@@ -0,0 +1,34 @@
// ISSUE: KT-41215, KT-43551
// FILE: Base.java
public sealed class Base permits A, B {}
// FILE: A.java
public final class A extends Base {}
// FILE: B.java
public sealed class B extends Base permits B.C, B.D {
public static final class C extends B {}
public static non-sealed class D extends B {}
}
// FILE: main.kt
fun test_1(base: Base): String {
return when (base) {
is A -> "O"
is B -> "Fail"
}
}
fun test_2(base: Base): String {
return when (base) {
is A -> "Fail A"
is B.C -> "K"
is B.D -> "Fail B.D"
}
}
fun box(): String {
return test_1(A()) + test_2(B.C())
}
@@ -0,0 +1,44 @@
// ISSUE: KT-41215, KT-43551
// FILE: Base.java
public sealed interface Base permits A, B, E {}
// FILE: A.java
public non-sealed interface A extends Base {}
// FILE: B.java
public sealed interface B extends Base permits B.C, B.D {
public static final class C implements B {}
public static non-sealed interface D extends B {}
}
// FILE: E.java
public enum E implements Base {
First, Second
}
// FILE: main.kt
fun test_1(base: Base): String {
return when (base) {
is A -> "Fail A"
is B -> "Fail B"
is E -> "O"
}
}
fun test_2(base: Base): String {
return when (base) {
is A -> "Fail A"
is B.C -> "Fail B.C"
is B.D -> "K"
E.First -> "Fail E.First"
E.Second -> "Fail E.Second"
}
}
class MyD : B.D
fun box(): String {
return test_1(E.First) + test_2(MyD())
}
@@ -0,0 +1,17 @@
// WITH_REFLECT
// FILE: Base.java
public sealed class Base permits O, K {}
// FILE: O.java
public final class O extends Base {}
// FILE: K.java
public non-sealed class K extends Base {}
// FILE: main.kt
fun box(): String {
val clazz = Base::class.java
if (!clazz.isSealed) return "Error: Base is not sealed"
return clazz.permittedSubclasses.joinToString("") { it.simpleName ?: "_No name provided_" }
}