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:
@@ -1,10 +1,14 @@
|
||||
// "Cast expression 'a' to 'Foo'" "true"
|
||||
|
||||
trait Foo {
|
||||
fun plus(x: Any) : Foo
|
||||
}
|
||||
|
||||
fun foo(_a: Any): Any {
|
||||
var a = _a
|
||||
open class MyClass {
|
||||
public open val a: Any = "42"
|
||||
}
|
||||
|
||||
fun MyClass.foo(): Any {
|
||||
if (a is Foo) {
|
||||
return a as Foo + a
|
||||
}
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
// "Cast expression 'a' to 'Foo'" "true"
|
||||
|
||||
trait Foo {
|
||||
fun not() : Foo
|
||||
}
|
||||
|
||||
fun foo(_a: Any): Any {
|
||||
var a = _a
|
||||
open class MyClass {
|
||||
public open val a: Any = "42"
|
||||
}
|
||||
|
||||
fun MyClass.foo(): Any {
|
||||
if (a is Foo) {
|
||||
return !(a as Foo)
|
||||
}
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
// "Cast expression 'x' to 'Foo<*>'" "true"
|
||||
|
||||
trait Foo<T: Number> {
|
||||
fun foo()
|
||||
fun bar()
|
||||
}
|
||||
|
||||
fun bar(_x: Any) {
|
||||
var x = _x
|
||||
open class MyClass {
|
||||
public open val x: Any = "42"
|
||||
}
|
||||
|
||||
fun MyClass.bar() {
|
||||
if (x is Foo<*>) {
|
||||
(x as Foo<*>).foo()
|
||||
(x as Foo<*>).bar()
|
||||
}
|
||||
}
|
||||
@@ -1,10 +1,14 @@
|
||||
// "Cast expression 'a' to 'Foo'" "true"
|
||||
|
||||
trait Foo {
|
||||
fun plus(x: Any) : Foo
|
||||
}
|
||||
|
||||
fun foo(_a: Any): Any {
|
||||
var a = _a
|
||||
open class MyClass {
|
||||
public open val a: Any = "42"
|
||||
}
|
||||
|
||||
fun MyClass.foo(): Any {
|
||||
if (a is Foo) {
|
||||
return a<caret> + a
|
||||
}
|
||||
|
||||
@@ -1,10 +1,14 @@
|
||||
// "Cast expression 'a' to 'Foo'" "true"
|
||||
|
||||
trait Foo {
|
||||
fun not() : Foo
|
||||
}
|
||||
|
||||
fun foo(_a: Any): Any {
|
||||
var a = _a
|
||||
open class MyClass {
|
||||
public open val a: Any = "42"
|
||||
}
|
||||
|
||||
fun MyClass.foo(): Any {
|
||||
if (a is Foo) {
|
||||
return !a<caret>
|
||||
}
|
||||
|
||||
@@ -1,11 +1,15 @@
|
||||
// "Cast expression 'x' to 'Foo<*>'" "true"
|
||||
|
||||
trait Foo<T: Number> {
|
||||
fun foo()
|
||||
fun bar()
|
||||
}
|
||||
|
||||
fun bar(_x: Any) {
|
||||
var x = _x
|
||||
open class MyClass {
|
||||
public open val x: Any = "42"
|
||||
}
|
||||
|
||||
fun MyClass.bar() {
|
||||
if (x is Foo<*>) {
|
||||
x<caret>.foo()
|
||||
x<caret>.bar()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user