== A == class A { companion object } --------------------- ===================== == B == object B { val A.Companion.foo: X get() = X } --------------------- ===================== == X == object X --------------------- ===================== == C == object C { operator fun X.invoke() = println("Hello!") } --------------------- ===================== == invoke == operator fun X.invoke() = println("Hello!") --------------------- println !: * "Hello!" : * NEW: r("Hello!") -> println("Hello!") : {<: [ERROR : Error function type]} NEW: magic[UNRESOLVED_CALL](println("Hello!")|, !) -> ===================== == with == inline fun with(receiver: T, block: T.() -> R): R = receiver.block() --------------------- : {<: T} NEW: magic[FAKE_INITIALIZER](receiver: T) -> : {<: T.() -> R} NEW: magic[FAKE_INITIALIZER](block: T.() -> R) -> receiver : {<: T} NEW: r(receiver) -> block : {<: (T) -> R} NEW: r(block) -> block() : {<: R} NEW: call(block(), invoke|, ) -> receiver.block() : {<: R} COPY ===================== == use == fun use() = with(C) { with(B) { A.foo() } } --------------------- C : C NEW: r(C) -> { with(B) { A.foo() } } : {<: C.() -> ???} NEW: r({ with(B) { A.foo() } }) -> with(C) { with(B) { A.foo() } } : {<: [ERROR : Error function type]} NEW: call(with(C) { with(B) { A.foo() } }, with|, ) -> ===================== == anonymous_0 == { with(B) { A.foo() } } --------------------- B : B NEW: r(B) -> { A.foo() } : {<: B.() -> ???} NEW: r({ A.foo() }) -> with(B) { A.foo() } : {<: ???} NEW: call(with(B) { A.foo() }, with|, ) -> with(B) { A.foo() } : {<: ???} COPY ===================== == anonymous_1 == { A.foo() } --------------------- : B NEW: magic[IMPLICIT_RECEIVER](foo) -> : C NEW: magic[IMPLICIT_RECEIVER](foo()) -> A : A.Companion NEW: r(A, Companion) -> foo : X NEW: r(foo|, ) -> foo() : {<: ???} NEW: call(foo(), invoke|, ) -> A.foo() : {<: ???} COPY A.foo() : {<: ???} COPY =====================