b476eee6e3
Remove a bunch of custom logic to determine when a callable reference is bound or not (and hence mustn't have a receiver). Instead, a helper extension is introduced to determine when a callable reference is bound by checking if dispatch/extensionReceiver is not FirNoReceiver and the referenced member is not static. #KT-57253 Fixed
81 lines
3.5 KiB
Kotlin
Vendored
81 lines
3.5 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"
|
|
|
|
with (A) {
|
|
if (!call(::instance)) return "Fail implicit bound function 1"
|
|
if (!call(::companion)) return "Fail implicit bound function 2"
|
|
if (!call(::ext)) return "Fail implicit bound function 3"
|
|
if (!call(::companionExt)) return "Fail implicit bound function 4"
|
|
if (!call(::instanceProp)) return "Fail imlicit bound prop 5"
|
|
if (!call(::companionProp)) return "Fail imlicit bound prop 6"
|
|
if (!call(::extProp)) return "Fail imlicit bound prop 7"
|
|
if (!call(::companionExtProp)) return "Fail imlicit bound prop 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"
|
|
}
|