KT-5182 Data flow info is lost for 'when' branches

#KT-5158 Fixed
  #KT-4332 Fixed
This commit is contained in:
Svetlana Isakova
2014-06-06 13:55:24 +04:00
parent cb788579ba
commit 68b4b8e946
7 changed files with 68 additions and 6 deletions
@@ -4,7 +4,7 @@ fun foo(x: Number, y: Int) {
y -> {}
else -> {}
}
<!TYPE_MISMATCH!>x<!> : Int
<!DEBUG_INFO_AUTOCAST!>x<!> : Int
}
fun bar(x: Number) {
@@ -0,0 +1,24 @@
fun foo(x: Number, y: Int) {
when (x) {
is Int -> <!DEBUG_INFO_AUTOCAST!>x<!> : Int
y -> {}
else -> {}
}
<!TYPE_MISMATCH!>x<!> : Int
}
fun bar(x: Number) {
when (x) {
is Int -> <!DEBUG_INFO_AUTOCAST!>x<!> : Int
else -> {}
}
<!TYPE_MISMATCH!>x<!> : Int
}
fun whenWithoutSubject(x: Number) {
when {
(x is Int) -> <!DEBUG_INFO_AUTOCAST!>x<!> : Int
else -> {}
}
<!TYPE_MISMATCH!>x<!> : Int
}
@@ -0,0 +1,9 @@
//KT-4332 when/autocast underperforms
fun testWhen(t: String?, x: String?): Int {
return when {
t == null -> 0
x == null -> <!DEBUG_INFO_AUTOCAST!>t<!>.length // Wrong error report here. t can be inferred as not-null. (And it actually does if you replace when with if/else if)
else -> (<!DEBUG_INFO_AUTOCAST!>t<!> + x).length
}
}
@@ -0,0 +1,13 @@
//KT-5182 Data flow info is lost for 'when' branches
open class A
class B: A() {
fun foo() = 1
}
fun foo(a: A) = when {
a !is B -> 2
true -> <!DEBUG_INFO_AUTOCAST!>a<!>.foo() //'foo' is unresolved, smart cast doesn't work
else -> <!DEBUG_INFO_AUTOCAST!>a<!>.foo()
}