KT-13426: store map from ImplicitReceiver into KotlinType for implicit receiver smart casts

This commit is contained in:
Mikhail Glukhikh
2016-08-15 17:17:18 +03:00
parent 33e96fcb9a
commit cbcef67d82
15 changed files with 265 additions and 8 deletions
@@ -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
}