Sealed class hierarchies are now correctly processed in when (by checking possible smart casts to nested sealed classes) #KT-10648 Fixed

(cherry picked from commit 2eaaf9c)
This commit is contained in:
Mikhail Glukhikh
2016-06-16 14:46:10 +03:00
committed by Mikhail Glukhikh
parent 01430b4b99
commit 49fb9ff424
5 changed files with 154 additions and 39 deletions
@@ -0,0 +1,45 @@
// See KT-10648: Exhaustiveness check does not work with nested sealed hierarchy
sealed class Base {
sealed class A : Base() {
class A1 : A()
class A2 : A()
}
sealed class B : Base() {
class B1 : B()
class B2 : B()
}
}
fun foo(b: Base) = when (b) {
is Base.A -> when(<!DEBUG_INFO_SMARTCAST!>b<!>) {
is Base.A.A1 -> 1
is Base.A.A2 -> 2
}
is Base.B -> when(<!DEBUG_INFO_SMARTCAST!>b<!>) {
is Base.B.B1 -> 3
is Base.B.B2 -> 4
}
}
fun bar(b: Base?) = if (b == null) 0 else when (<!DEBUG_INFO_SMARTCAST!>b<!>) {
is Base.A -> when(<!DEBUG_INFO_SMARTCAST!>b<!>) {
is Base.A.A1 -> 1
is Base.A.A2 -> 2
}
is Base.B -> when(<!DEBUG_INFO_SMARTCAST!>b<!>) {
is Base.B.B1 -> 3
is Base.B.B2 -> 4
}
}
fun gav(b: Base?) = when (b) {
null -> 0
is Base.A -> when(<!DEBUG_INFO_SMARTCAST!>b<!>) {
is Base.A.A1 -> 1
is Base.A.A2 -> 2
}
is Base.B -> when(<!DEBUG_INFO_SMARTCAST!>b<!>) {
is Base.B.B1 -> 3
is Base.B.B2 -> 4
}
}
@@ -0,0 +1,54 @@
package
public fun bar(/*0*/ b: Base?): kotlin.Int
public fun foo(/*0*/ b: Base): kotlin.Int
public fun gav(/*0*/ b: Base?): kotlin.Int
public sealed class Base {
private 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 sealed class A : Base {
private 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 final class A1 : Base.A {
public constructor A1()
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 A2 : Base.A {
public constructor A2()
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 class 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 final class B1 : Base.B {
public constructor B1()
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 B2 : Base.B {
public constructor B2()
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
}
}
}