[FIR] Support when exhaustiveness for java enum

The problem appear because for java enum its entries was represented by
FirJavaField. To fix this FirEnumEntry was used

#KT-39621 Fixed
This commit is contained in:
Ivan Kylchik
2020-07-08 19:44:01 +03:00
parent 307871a050
commit dcae6f1415
17 changed files with 247 additions and 92 deletions
@@ -11,8 +11,7 @@ public/*package*/ open class A : R|kotlin/Any| {
}
public final enum class Mixed : R|kotlin/Enum<ft<Mixed, Mixed?>!>| {
public final static field NOT_ENTRY_EITHER: R|Mixed|
public final static enum entry NOT_ENTRY_EITHER: R|Mixed|
public final static fun values(): R|kotlin/Array<Mixed>| {
}
@@ -21,10 +20,8 @@ public final enum class Mixed : R|kotlin/Enum<ft<Mixed, Mixed?>!>| {
}
public final enum class Signs : R|kotlin/Enum<ft<Signs, Signs?>!>| {
public final static field HELLO: R|Signs|
public final static field WORLD: R|Signs|
public final static enum entry HELLO: R|Signs|
public final static enum entry WORLD: R|Signs|
public final static field X: R|ft<Signs, Signs?>!|
public final static fun values(): R|kotlin/Array<Signs>| {
@@ -0,0 +1,60 @@
// FILE: JavaEnum.java
public enum JavaEnum {
A, B, C;
public int i = 0;
}
// FILE: main.kt
fun test_1(e: JavaEnum) {
val a = when (e) {
JavaEnum.A -> 1
JavaEnum.B -> 2
}.<!UNRESOLVED_REFERENCE!>plus<!>(0)
val b = when (e) {
JavaEnum.A -> 1
JavaEnum.B -> 2
is String -> 3
}.<!UNRESOLVED_REFERENCE!>plus<!>(0)
val c = when (e) {
JavaEnum.A -> 1
JavaEnum.B -> 2
JavaEnum.C -> 3
}.plus(0)
val d = when (e) {
JavaEnum.A -> 1
else -> 2
}.plus(0)
}
fun test_2(e: JavaEnum?) {
val a = when (e) {
JavaEnum.A -> 1
JavaEnum.B -> 2
JavaEnum.C -> 3
}.<!UNRESOLVED_REFERENCE!>plus<!>(0)
val a = when (e) {
JavaEnum.A -> 1
JavaEnum.B -> 2
JavaEnum.C -> 3
null -> 4
}.plus(0)
val a = when (e) {
JavaEnum.A -> 1
JavaEnum.B -> 2
JavaEnum.C -> 3
else -> 4
}.plus(0)
}
fun test_3(e: JavaEnum) {
val a = when (e) {
JavaEnum.A, JavaEnum.B -> 1
JavaEnum.C -> 2
}.plus(0)
}
@@ -0,0 +1,100 @@
FILE: main.kt
public final fun test_1(e: R|JavaEnum|): R|kotlin/Unit| {
lval a: <ERROR TYPE REF: Unresolved name: plus> = when (R|<local>/e|) {
==($subj$, Q|JavaEnum|.R|/JavaEnum.A|) -> {
Int(1)
}
==($subj$, Q|JavaEnum|.R|/JavaEnum.B|) -> {
Int(2)
}
}
.<Unresolved name: plus>#(Int(0))
lval b: <ERROR TYPE REF: Unresolved name: plus> = when (R|<local>/e|) {
==($subj$, Q|JavaEnum|.R|/JavaEnum.A|) -> {
Int(1)
}
==($subj$, Q|JavaEnum|.R|/JavaEnum.B|) -> {
Int(2)
}
($subj$ is R|kotlin/String|) -> {
Int(3)
}
}
.<Unresolved name: plus>#(Int(0))
lval c: R|kotlin/Int| = when (R|<local>/e|) {
==($subj$, Q|JavaEnum|.R|/JavaEnum.A|) -> {
Int(1)
}
==($subj$, Q|JavaEnum|.R|/JavaEnum.B|) -> {
Int(2)
}
==($subj$, Q|JavaEnum|.R|/JavaEnum.C|) -> {
Int(3)
}
}
.R|kotlin/Int.plus|(Int(0))
lval d: R|kotlin/Int| = when (R|<local>/e|) {
==($subj$, Q|JavaEnum|.R|/JavaEnum.A|) -> {
Int(1)
}
else -> {
Int(2)
}
}
.R|kotlin/Int.plus|(Int(0))
}
public final fun test_2(e: R|JavaEnum?|): R|kotlin/Unit| {
lval a: <ERROR TYPE REF: Unresolved name: plus> = when (R|<local>/e|) {
==($subj$, Q|JavaEnum|.R|/JavaEnum.A|) -> {
Int(1)
}
==($subj$, Q|JavaEnum|.R|/JavaEnum.B|) -> {
Int(2)
}
==($subj$, Q|JavaEnum|.R|/JavaEnum.C|) -> {
Int(3)
}
}
.<Unresolved name: plus>#(Int(0))
lval a: R|kotlin/Int| = when (R|<local>/e|) {
==($subj$, Q|JavaEnum|.R|/JavaEnum.A|) -> {
Int(1)
}
==($subj$, Q|JavaEnum|.R|/JavaEnum.B|) -> {
Int(2)
}
==($subj$, Q|JavaEnum|.R|/JavaEnum.C|) -> {
Int(3)
}
==($subj$, Null(null)) -> {
Int(4)
}
}
.R|kotlin/Int.plus|(Int(0))
lval a: R|kotlin/Int| = when (R|<local>/e|) {
==($subj$, Q|JavaEnum|.R|/JavaEnum.A|) -> {
Int(1)
}
==($subj$, Q|JavaEnum|.R|/JavaEnum.B|) -> {
Int(2)
}
==($subj$, Q|JavaEnum|.R|/JavaEnum.C|) -> {
Int(3)
}
else -> {
Int(4)
}
}
.R|kotlin/Int.plus|(Int(0))
}
public final fun test_3(e: R|JavaEnum|): R|kotlin/Unit| {
lval a: R|kotlin/Int| = when (R|<local>/e|) {
==($subj$, Q|JavaEnum|.R|/JavaEnum.A|) || ==($subj$, Q|JavaEnum|.R|/JavaEnum.B|) -> {
Int(1)
}
==($subj$, Q|JavaEnum|.R|/JavaEnum.C|) -> {
Int(2)
}
}
.R|kotlin/Int.plus|(Int(0))
}