Respect receiver-dependent visibility when selecting smart-cast type

This commit is contained in:
Denis Zharkov
2016-03-25 13:59:52 +03:00
parent d3b7eb81fa
commit 5bf336474d
16 changed files with 302 additions and 21 deletions
@@ -0,0 +1,30 @@
open class Base {
open protected fun foo() {}
open protected fun bar() {}
open protected var x: Int = 1
open var y: Int = 1
protected set
}
class Derived : Base() {
override fun bar() { }
protected fun baz(x: Base) {
x.<!INVISIBLE_MEMBER!>foo<!>()
x.<!INVISIBLE_MEMBER!>bar<!>()
x.<!INVISIBLE_MEMBER!>x<!> = x.<!INVISIBLE_MEMBER!>x<!> + 1
<!INVISIBLE_SETTER!>x.y<!> = x.y + 1
if (x is Derived) {
<!DEBUG_INFO_SMARTCAST!>x<!>.foo()
<!DEBUG_INFO_SMARTCAST!>x<!>.bar()
<!DEBUG_INFO_SMARTCAST!>x<!>.baz(x)
<!DEBUG_INFO_SMARTCAST!>x<!>.x = <!DEBUG_INFO_SMARTCAST!>x<!>.x + 1
// TODO: Should be smart cast
<!INVISIBLE_SETTER!>x.y<!> = x.y + 1
}
}
}