Respect receiver-dependent visibility when selecting smart-cast type
This commit is contained in:
+13
@@ -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<!>
|
||||
}
|
||||
}
|
||||
+27
@@ -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
|
||||
}
|
||||
Vendored
+9
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
Vendored
+10
@@ -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
|
||||
}
|
||||
+18
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
+30
@@ -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
|
||||
}
|
||||
+30
@@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
+24
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user