KT-13426: store map from ImplicitReceiver into KotlinType for implicit receiver smart casts
This commit is contained in:
@@ -3,8 +3,13 @@ open class A {
|
||||
val a = "FAIL"
|
||||
}
|
||||
|
||||
class C : A() {
|
||||
val a = "FATAL"
|
||||
}
|
||||
|
||||
fun foo(): String {
|
||||
if (this is B) return <!DEBUG_INFO_IMPLICIT_RECEIVER_SMARTCAST!>a<!>
|
||||
else if (this is C) return <!DEBUG_INFO_IMPLICIT_RECEIVER_SMARTCAST!>a<!>
|
||||
return "OK"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,6 +18,15 @@ public open class A {
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
|
||||
public final class C : A {
|
||||
public constructor C()
|
||||
public final val a: kotlin.String = "FATAL"
|
||||
public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean
|
||||
public final override /*1*/ /*fake_override*/ fun foo(): kotlin.String
|
||||
public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int
|
||||
public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String
|
||||
}
|
||||
}
|
||||
|
||||
public final class C {
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
interface IA
|
||||
interface IB
|
||||
interface IC
|
||||
|
||||
object Host : IB
|
||||
|
||||
object Prop : IA {
|
||||
val Host.foo: Callee get() = Callee
|
||||
}
|
||||
|
||||
object Callee
|
||||
|
||||
object Invoke : IC {
|
||||
operator fun Callee.invoke() { }
|
||||
}
|
||||
|
||||
fun test(a: IA, b: IB, c: IC) {
|
||||
with(a) lambdaA@{
|
||||
with(b) lambdaB@{
|
||||
with(c) lambdaC@{
|
||||
if (this@lambdaA is Prop && this@lambdaB is Host && this@lambdaC is Invoke) {
|
||||
<!DEBUG_INFO_IMPLICIT_RECEIVER_SMARTCAST!>foo<!>()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
package
|
||||
|
||||
public fun test(/*0*/ a: IA, /*1*/ b: IB, /*2*/ c: IC): kotlin.Unit
|
||||
|
||||
public object Callee {
|
||||
private constructor Callee()
|
||||
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 object Host : IB {
|
||||
private constructor Host()
|
||||
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 interface IA {
|
||||
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 interface IB {
|
||||
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 interface IC {
|
||||
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 object Invoke : IC {
|
||||
private constructor Invoke()
|
||||
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 operator fun Callee.invoke(): kotlin.Unit
|
||||
}
|
||||
|
||||
public object Prop : IA {
|
||||
private constructor Prop()
|
||||
public final val Host.foo: Callee
|
||||
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,18 @@
|
||||
interface IA
|
||||
interface IB
|
||||
|
||||
object A : IA {
|
||||
fun B.foo() { }
|
||||
}
|
||||
|
||||
object B : IB
|
||||
|
||||
fun test(a: IA, b: IB) {
|
||||
with(a) lambda1@{
|
||||
with(b) lambda2@{
|
||||
if (this@lambda1 is A && this@lambda2 is B) {
|
||||
<!DEBUG_INFO_IMPLICIT_RECEIVER_SMARTCAST!>foo<!>()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
package
|
||||
|
||||
public fun test(/*0*/ a: IA, /*1*/ b: IB): kotlin.Unit
|
||||
|
||||
public object A : IA {
|
||||
private constructor A()
|
||||
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 fun B.foo(): kotlin.Unit
|
||||
}
|
||||
|
||||
public object B : IB {
|
||||
private constructor B()
|
||||
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 interface IA {
|
||||
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 interface IB {
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user