Files
kotlin-fork/compiler/testData/codegen/box/callableReference/bound/companionObjectReceiverInheritsFromOuter.kt
T
Kirill Rakhman 1f0e6321b0 [FIR2IR] Use companion as bound receiver if expected type requires it
A::foo is preferably resolved as an unbound reference to A.foo, however
if A.Companion is a subtype of A and the expected type has one fewer
parameter than the type of the unbound reference, generate a bound
reference with the companion as receiver.

^KT-56519 Fixed
2023-03-02 10:55:46 +00:00

70 lines
3.0 KiB
Kotlin
Vendored

// !LANGUAGE: +ContextReceivers
// IGNORE_BACKEND_K1: JS, NATIVE
// SKIP_NODE_JS
open class A {
fun instance() = true
val instanceProp = true
companion object : A() {
fun companion() = true
val companionProp = true
}
}
fun A.ext() = true
val A.extProp get() = true
fun A.Companion.companionExt() = true
val A.Companion.companionExtProp get() = true
inline fun call(f: () -> Boolean) = f()
inline fun callExtension(f: A.() -> Boolean, receiver: A) = receiver.f()
inline fun callParameter(f: (A) -> Boolean, parameter: A) = f(parameter)
inline fun callContext(f: context(A) () -> Boolean, receiver: A) = f(receiver)
fun box(): String {
if (!call(A::instance)) return "Fail bound function 1"
if (!call(A.Companion::instance)) return "Fail bound function 2"
if (!call(A::companion)) return "Fail bound function 3"
if (!call(A.Companion::companion)) return "Fail bound function 4"
if (!call(A::ext)) return "Fail bound function 5"
if (!call(A.Companion::ext)) return "Fail bound function 6"
if (!call(A::companionExt)) return "Fail bound function 7"
if (!call(A.Companion::companionExt)) return "Fail bound function 8"
if (!call(A::instanceProp)) return "Fail bound prop 1"
if (!call(A.Companion::instanceProp)) return "Fail bound prop 2"
if (!call(A::companionProp)) return "Fail bound prop 3"
if (!call(A.Companion::companionProp)) return "Fail bound prop 4"
if (!call(A::extProp)) return "Fail bound prop 5"
if (!call(A.Companion::extProp)) return "Fail bound prop 6"
if (!call(A::companionExtProp)) return "Fail bound prop 7"
if (!call(A.Companion::companionExtProp)) return "Fail bound prop 8"
if (!callParameter(A::instance, A.Companion)) return "Fail unbound 1"
if (!callParameter(A::ext, A.Companion)) return "Fail unbound 2"
if (!callParameter(A::instanceProp, A.Companion)) return "Fail unbound 3"
if (!callParameter(A::extProp, A.Companion)) return "Fail unbound 4"
if (!callExtension(A::instance, A.Companion)) return "Fail unbound 5"
if (!callExtension(A::ext, A.Companion)) return "Fail unbound 6"
if (!callExtension(A::instanceProp, A.Companion)) return "Fail unbound 7"
if (!callExtension(A::extProp, A.Companion)) return "Fail unbound 8"
if (!callContext(A::instance, A.Companion)) return "Fail unbound 5"
if (!callContext(A::ext, A.Companion)) return "Fail unbound 6"
if (!callContext(A::instanceProp, A.Companion)) return "Fail unbound 7"
if (!callContext(A::extProp, A.Companion)) return "Fail unbound 8"
val instance = A::instance
val ext = A::ext
val instanceProp = A::instanceProp
val extProp = A::extProp
if (!callParameter(instance, A.Companion)) return "Fail unbound variable 1"
if (!callParameter(ext, A.Companion)) return "Fail unbound variable 2"
if (!callParameter(instanceProp, A.Companion)) return "Fail unbound variable 3"
if (!callParameter(extProp, A.Companion)) return "Fail unbound variable 4"
return "OK"
}