[FE 1.0] Support java sealed classes
^KT-46778 Fixed
This commit is contained in:
committed by
teamcityserver
parent
972211f8e6
commit
fa1d09c778
+1
-1
@@ -1,3 +1,3 @@
|
||||
error: unknown JVM target version: 1.5
|
||||
Supported versions: 1.6, 1.8, 9, 10, 11, 12, 13, 14, 15, 16
|
||||
Supported versions: 1.6, 1.8, 9, 10, 11, 12, 13, 14, 15, 16, 17
|
||||
COMPILATION_ERROR
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<modernJava>
|
||||
+36
@@ -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())
|
||||
}
|
||||
+45
@@ -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())
|
||||
}
|
||||
+44
@@ -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())
|
||||
}
|
||||
+17
@@ -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_" }
|
||||
}
|
||||
+2
-2
@@ -16,14 +16,14 @@ public sealed class B extends Base permits B.C, B.D {
|
||||
|
||||
// FILE: main.kt
|
||||
fun test_ok_1(base: Base) {
|
||||
val x = <!NO_ELSE_IN_WHEN!>when<!> (base) {
|
||||
val x = when (base) {
|
||||
is A -> 1
|
||||
is B -> 2
|
||||
}
|
||||
}
|
||||
|
||||
fun test_ok_2(base: Base) {
|
||||
val x = <!NO_ELSE_IN_WHEN!>when<!> (base) {
|
||||
val x = when (base) {
|
||||
is A -> 1
|
||||
is B.C -> 2
|
||||
is B.D -> 3
|
||||
+2
-2
@@ -12,7 +12,7 @@ public final class A : Base {
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public abstract class B : Base {
|
||||
public sealed class B : Base {
|
||||
public constructor B()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
@@ -33,7 +33,7 @@ public abstract class B : Base {
|
||||
}
|
||||
}
|
||||
|
||||
public abstract class Base {
|
||||
public sealed class Base {
|
||||
public constructor Base()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
+2
-2
@@ -21,7 +21,7 @@ public enum E implements Base {
|
||||
|
||||
// FILE: main.kt
|
||||
fun test_ok_1(base: Base) {
|
||||
val x = <!NO_ELSE_IN_WHEN!>when<!> (base) {
|
||||
val x = when (base) {
|
||||
is A -> 1
|
||||
is B -> 2
|
||||
is E -> 3
|
||||
@@ -29,7 +29,7 @@ fun test_ok_1(base: Base) {
|
||||
}
|
||||
|
||||
fun test_ok_2(base: Base) {
|
||||
val x = <!NO_ELSE_IN_WHEN!>when<!> (base) {
|
||||
val x = when (base) {
|
||||
is A -> 1
|
||||
is B.C -> 2
|
||||
is B.D -> 3
|
||||
+2
-2
@@ -12,7 +12,7 @@ public interface A : Base {
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public interface B : Base {
|
||||
public sealed interface B : Base {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
@@ -31,7 +31,7 @@ public interface B : Base {
|
||||
}
|
||||
}
|
||||
|
||||
public interface Base {
|
||||
public sealed interface Base {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
+1
-1
@@ -14,7 +14,7 @@ public final class B : Base {
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public abstract class Base {
|
||||
public sealed class Base {
|
||||
public constructor Base()
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
+1
-1
@@ -14,7 +14,7 @@ public final class B : Base {
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public interface Base {
|
||||
public sealed interface Base {
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
Reference in New Issue
Block a user