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,13 @@
open class BaseClass() {
protected class Nested(val x: Int, protected val y: Int)
protected fun foo() = Nested(1, 2)
}
class Foo : BaseClass() {
fun bar() {
val f = foo()
f.x
f.<!INVISIBLE_MEMBER!>y<!>
}
}
@@ -0,0 +1,27 @@
package
public open class BaseClass {
public constructor BaseClass()
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected final fun foo(): BaseClass.Nested
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
protected final class Nested {
public constructor Nested(/*0*/ x: kotlin.Int, /*1*/ y: kotlin.Int)
public final val x: kotlin.Int
protected final val y: kotlin.Int
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
}
public final class Foo : BaseClass {
public constructor Foo()
public final fun bar(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected final override /*1*/ /*fake_override*/ fun foo(): BaseClass.Nested
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -0,0 +1,9 @@
abstract class A<T : Any> {
abstract protected fun T.foo()
fun bar(x: T?) {
if (x != null) {
<!DEBUG_INFO_SMARTCAST!>x<!>.foo()
}
}
}
@@ -0,0 +1,10 @@
package
public abstract class A</*0*/ T : kotlin.Any> {
public constructor A</*0*/ T : kotlin.Any>()
public final fun bar(/*0*/ x: T?): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
protected abstract fun T.foo(): kotlin.Unit
}
@@ -0,0 +1,18 @@
// !CHECK_TYPE
open class BaseOuter {
protected fun foo() = 1
protected fun bar() { }
}
class Foo(var base: BaseOuter)
fun BaseOuter.foo(): String = ""
class Derived : BaseOuter() {
fun test(foo: Foo) {
if (foo.base is Derived) {
foo.base.foo() checkType { _<String>() } // Resolved to extension
<!SMARTCAST_IMPOSSIBLE!>foo.base<!>.bar()
}
}
}
@@ -0,0 +1,30 @@
package
public fun BaseOuter.foo(): kotlin.String
public open class BaseOuter {
public constructor BaseOuter()
protected final fun bar(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected final fun foo(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class Derived : BaseOuter {
public constructor Derived()
protected final override /*1*/ /*fake_override*/ fun bar(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected final override /*1*/ /*fake_override*/ fun foo(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public final fun test(/*0*/ foo: Foo): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class Foo {
public constructor Foo(/*0*/ base: BaseOuter)
public final var base: BaseOuter
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
@@ -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
}
}
}
@@ -0,0 +1,24 @@
package
public open class Base {
public constructor Base()
protected open var x: kotlin.Int
public open var y: kotlin.Int
protected open fun bar(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected open fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}
public final class Derived : Base {
public constructor Derived()
protected open override /*1*/ /*fake_override*/ var x: kotlin.Int
public open override /*1*/ /*fake_override*/ var y: kotlin.Int
protected open override /*1*/ fun bar(): kotlin.Unit
protected final fun baz(/*0*/ x: Base): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
protected open override /*1*/ /*fake_override*/ fun foo(): kotlin.Unit
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
}