Smart casts for local variables not captured in a closure and not changed in a loop, see #KT-3175.

isLocalVariable added. Assignment / initialization analysis.
Control whether a variable is changed in a loop at the beginning and at the end of the loop.
Control whether a variable is captured in a closure. #KT-3175  Fixed. #KT-2266  Fixed.
Tests for variable null safety and for variables is/as operations.
Loop / closure / variable property tests are included.
Old tests changed in accordance with KT-3175. In particular, all three of testSmartcastImpossible were fixed.
This commit is contained in:
Mikhail Glukhikh
2015-03-24 17:03:01 +03:00
parent e4b1046a54
commit d5aed62410
126 changed files with 1655 additions and 71 deletions
@@ -5,10 +5,10 @@ class A() {
fun f(): Unit {
var x: Int? = <warning>1</warning>
x = 1
x <error>+</error> 1
x <error>plus</error> 1
x <error><</error> 1
x <error>+=</error> 1
x + 1
x plus 1
x < 1
x += 1
x == 1
x != 1
@@ -21,8 +21,8 @@ fun f(): Unit {
x === 1
x !== 1
x<error>..</error>2
<error>x</error> in 1..2
x..2
x in 1..2
val y : Boolean? = true
<warning>false || <error>y</error></warning>
+3 -3
View File
@@ -198,8 +198,8 @@ fun mergeSmartCasts(a: Any?) {
fun f(): String {
var <info>a</info>: Any = 11
if (<info>a</info> is String) {
val <warning>i</warning>: String = <error descr="[SMARTCAST_IMPOSSIBLE] Smart cast to 'kotlin.String' is impossible, because 'a' could have changed since the is-check">a</error>
<error descr="[SMARTCAST_IMPOSSIBLE] Smart cast to 'kotlin.String' is impossible, because 'a' could have changed since the is-check">a</error>.compareTo("f")
val <warning>i</warning>: String = <info descr="Smart cast to kotlin.String"><info descr="Wrapped into a reference object to be modified when captured in a closure">a</info></info>
<info descr="Smart cast to kotlin.String"><info descr="Wrapped into a reference object to be modified when captured in a closure">a</info></info>.compareTo("f")
val <warning>f</warning>: Function0<String> = { <error descr="[SMARTCAST_IMPOSSIBLE] Smart cast to 'kotlin.String' is impossible, because 'a' could have changed since the is-check">a</error> }
return <error descr="[SMARTCAST_IMPOSSIBLE] Smart cast to 'kotlin.String' is impossible, because 'a' could have changed since the is-check">a</error>
}
@@ -209,7 +209,7 @@ fun f(): String {
fun foo(aa: Any): Int {
var a = aa
if (a is Int) {
return <error descr="[SMARTCAST_IMPOSSIBLE] Smart cast to 'kotlin.Int' is impossible, because 'a' could have changed since the is-check">a</error>
return <info descr="Smart cast to kotlin.Int">a</info>
}
return 1
}