[FE] Make whens on expect sealed classes and enums not exhaustive

This commit is contained in:
Dmitriy Novozhilov
2021-02-24 16:44:48 +03:00
parent 1cf73203c7
commit 4222bb9af2
29 changed files with 768 additions and 11 deletions
@@ -0,0 +1,37 @@
// !LANGUAGE: +MultiPlatformProjects
// !DIAGNOSTICS: -UNUSED_VARIABLE
// ISSUE: KT-20306
// MODULE: m1-common
// FILE: common.kt
expect enum class Base {
A, B
}
fun testCommon(base: Base) {
val x = when (base) { // must be an error
Base.A -> 1
Base.B -> 2
}
}
// MODULE: m1-jvm(m1-common)
// FILE: Base.kt
actual enum class Base {
A, B, C
}
fun testPlatformGood(base: Base) {
val x = when (base) { // must be OK
Base.A -> 1
Base.B -> 2
Base.C -> 3
}
}
fun testPlatformBad(base: Base) {
val x = <!NO_ELSE_IN_WHEN!>when<!> (base) { // must be an error
Base.A -> 1
Base.B -> 2
}
}
@@ -0,0 +1,37 @@
// !LANGUAGE: +MultiPlatformProjects
// !DIAGNOSTICS: -UNUSED_VARIABLE
// ISSUE: KT-20306
// MODULE: m1-common
// FILE: common.kt
expect enum class Base {
A, B
}
fun testCommon(base: Base) {
val x = <!EXPECT_TYPE_IN_WHEN_WITHOUT_ELSE("enum"), NO_ELSE_IN_WHEN("'else' branch"), NO_ELSE_IN_WHEN{JVM}("'C' branch or 'else' branch instead")!>when<!> (base) { // must be an error
Base.A -> 1
Base.B -> 2
}
}
// MODULE: m1-jvm(m1-common)
// FILE: Base.kt
actual enum class Base {
A, B, C
}
fun testPlatformGood(base: Base) {
val x = when (base) { // must be OK
Base.A -> 1
Base.B -> 2
Base.C -> 3
}
}
fun testPlatformBad(base: Base) {
val x = <!NO_ELSE_IN_WHEN!>when<!> (base) { // must be an error
Base.A -> 1
Base.B -> 2
}
}
@@ -0,0 +1,52 @@
// -- Module: <m1-common> --
package
public fun testCommon(/*0*/ base: Base): kotlin.Unit
public final expect enum class Base : kotlin.Enum<Base> {
expect enum entry A
expect enum entry B
public final override /*1*/ /*fake_override*/ val name: kotlin.String
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: Base): kotlin.Int
public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): Base
public final /*synthesized*/ fun values(): kotlin.Array<Base>
}
// -- Module: <m1-jvm> --
package
public fun testCommon(/*0*/ base: Base): kotlin.Unit
public fun testPlatformBad(/*0*/ base: Base): kotlin.Unit
public fun testPlatformGood(/*0*/ base: Base): kotlin.Unit
public final actual enum class Base : kotlin.Enum<Base> {
enum entry A
enum entry B
enum entry C
private constructor Base()
public final override /*1*/ /*fake_override*/ val name: kotlin.String
public final override /*1*/ /*fake_override*/ val ordinal: kotlin.Int
protected final override /*1*/ /*fake_override*/ fun clone(): kotlin.Any
public final override /*1*/ /*fake_override*/ fun compareTo(/*0*/ other: Base): kotlin.Int
public final override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected/*protected and package*/ final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun finalize(): kotlin.Unit
public final override /*1*/ /*fake_override*/ /*isHiddenForResolutionEverywhereBesideSupercalls*/ fun getDeclaringClass(): java.lang.Class<Base!>!
public final override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
// Static members
public final /*synthesized*/ fun valueOf(/*0*/ value: kotlin.String): Base
public final /*synthesized*/ fun values(): kotlin.Array<Base>
}
@@ -0,0 +1,40 @@
// !LANGUAGE: +MultiPlatformProjects
// !DIAGNOSTICS: -UNUSED_VARIABLE
// ISSUE: KT-44474
// MODULE: m1-common
// FILE: common.kt
expect sealed class Base()
class A : Base()
object B : Base()
fun testCommon(base: Base) {
val x = when (base) { // must be an error
is A -> 1
B -> 2
}
}
// MODULE: m1-jvm(m1-common)
// FILE: Base.kt
actual sealed class Base
// FILE: C.kt
class C : Base()
fun testPlatformGood(base: Base) {
val x = when (base) { // must be OK
is A -> 1
B -> 2
is C -> 3
}
}
fun testPlatformBad(base: Base) {
val x = <!NO_ELSE_IN_WHEN!>when<!> (base) { // must be an error
is A -> 1
B -> 2
}
}
@@ -0,0 +1,40 @@
// !LANGUAGE: +MultiPlatformProjects
// !DIAGNOSTICS: -UNUSED_VARIABLE
// ISSUE: KT-44474
// MODULE: m1-common
// FILE: common.kt
expect sealed class Base()
class A : Base()
object B : Base()
fun testCommon(base: Base) {
val x = <!EXPECT_TYPE_IN_WHEN_WITHOUT_ELSE("sealed class"), NO_ELSE_IN_WHEN("'else' branch"), NO_ELSE_IN_WHEN{JVM}("'is C' branch or 'else' branch instead")!>when<!> (base) { // must be an error
is A -> 1
B -> 2
}
}
// MODULE: m1-jvm(m1-common)
// FILE: Base.kt
actual sealed class Base
// FILE: C.kt
class C : Base()
fun testPlatformGood(base: Base) {
val x = when (base) { // must be OK
is A -> 1
B -> 2
is C -> 3
}
}
fun testPlatformBad(base: Base) {
val x = <!NO_ELSE_IN_WHEN!>when<!> (base) { // must be an error
is A -> 1
B -> 2
}
}
@@ -0,0 +1,60 @@
// -- Module: <m1-common> --
package
public fun testCommon(/*0*/ base: Base): kotlin.Unit
public final class A : Base {
public constructor A()
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
}
public object B : Base {
private 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
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public sealed expect class Base {
protected 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
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
// -- Module: <m1-jvm> --
package
public fun testCommon(/*0*/ base: Base): kotlin.Unit
public fun testPlatformBad(/*0*/ base: Base): kotlin.Unit
public fun testPlatformGood(/*0*/ base: Base): kotlin.Unit
public final class A : Base {
public constructor A()
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
}
public object B : Base {
private 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
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public sealed actual class Base {
protected 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
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class C : Base {
public constructor C()
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
}
@@ -0,0 +1,40 @@
// !LANGUAGE: +MultiPlatformProjects
// !DIAGNOSTICS: -UNUSED_VARIABLE
// ISSUE: KT-44474
// MODULE: m1-common
// FILE: common.kt
expect sealed interface Base
class A : Base
object B : Base
fun testCommon(base: Base) {
val x = when (base) { // must be an error
is A -> 1
B -> 2
}
}
// MODULE: m1-jvm(m1-common)
// FILE: Base.kt
actual sealed interface Base
// FILE: C.kt
interface C : Base
fun testPlatformGood(base: Base) {
val x = when (base) { // must be OK
is A -> 1
B -> 2
is C -> 3
}
}
fun testPlatformBad(base: Base) {
val x = <!NO_ELSE_IN_WHEN!>when<!> (base) { // must be an error
is A -> 1
B -> 2
}
}
@@ -0,0 +1,40 @@
// !LANGUAGE: +MultiPlatformProjects
// !DIAGNOSTICS: -UNUSED_VARIABLE
// ISSUE: KT-44474
// MODULE: m1-common
// FILE: common.kt
expect sealed interface Base
class A : Base
object B : Base
fun testCommon(base: Base) {
val x = <!EXPECT_TYPE_IN_WHEN_WITHOUT_ELSE("sealed interface"), NO_ELSE_IN_WHEN("'else' branch"), NO_ELSE_IN_WHEN{JVM}("'is C' branch or 'else' branch instead")!>when<!> (base) { // must be an error
is A -> 1
B -> 2
}
}
// MODULE: m1-jvm(m1-common)
// FILE: Base.kt
actual sealed interface Base
// FILE: C.kt
interface C : Base
fun testPlatformGood(base: Base) {
val x = when (base) { // must be OK
is A -> 1
B -> 2
is C -> 3
}
}
fun testPlatformBad(base: Base) {
val x = <!NO_ELSE_IN_WHEN!>when<!> (base) { // must be an error
is A -> 1
B -> 2
}
}
@@ -0,0 +1,58 @@
// -- Module: <m1-common> --
package
public fun testCommon(/*0*/ base: Base): kotlin.Unit
public final class A : Base {
public constructor A()
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
}
public object B : Base {
private 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
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public sealed expect 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
}
// -- Module: <m1-jvm> --
package
public fun testCommon(/*0*/ base: Base): kotlin.Unit
public fun testPlatformBad(/*0*/ base: Base): kotlin.Unit
public fun testPlatformGood(/*0*/ base: Base): kotlin.Unit
public final class A : Base {
public constructor A()
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
}
public object B : Base {
private 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
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public sealed actual 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
}
public interface C : 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
}