// IGNORE_BACKEND_K1: ANY
// ISSUE: KT-73779
// LANGUAGE: +ContextParameters

fun <A, R> context(context: A, block: context(A) () -> R): R = block(context)

class A(val a: String = "d ") {

    context(a: A)
    fun A.funMember(): String {
        return a.a + this@A.a + this.a
    }

    context(a: A)
    val A.propertyMember: String
        get() = a.a + this@A.a + this.a

    fun simpleUsageInsideClass(): String {
        return funMember() + propertyMember
    }

    fun usageWithThisInsideClass(): String {
        return this.funMember() + this.propertyMember
    }

    fun usageWithExtensionInsideClass(): String {
        return A("e ").funMember() + A("e ").propertyMember
    }

    fun usageWithContextAndExtensionInsideClass(): String {
        var temp = ""
        context(A("c ")) {
            temp = A("e ").funMember() + A("e ").propertyMember
        }
        return temp
    }
}

fun simpleUsageOutsideClass(): String {
    with(A("d ")) {
        return funMember() + propertyMember
    }
}

fun usageWithExtensionOutsideClass(): String {
    with(A("d ")) {
        return A("e ").funMember() + A("e ").propertyMember
    }
}

fun usageWithExtensionAndContextOutsideClass(): String {
    var temp = ""
    with(A("d ")) {
        context(A("c ")) {
            temp = (@Suppress("RECEIVER_SHADOWED_BY_CONTEXT_PARAMETER") A("e ").funMember()) + (@Suppress("RECEIVER_SHADOWED_BY_CONTEXT_PARAMETER") A("e ").propertyMember)
        }
    }
    return temp
}

fun box(): String {
    return if (
        (A().simpleUsageInsideClass() == "d d d d d d ") &&
        (A().usageWithThisInsideClass() == "d d d d d d ") &&
        (A().usageWithExtensionInsideClass() == "d d e d d e ") &&
        (A().usageWithContextAndExtensionInsideClass() == "c d e c d e ") &&
        (simpleUsageOutsideClass() == "d d d d d d ") &&
        (usageWithExtensionOutsideClass() == "d d e d d e ") &&
        (usageWithExtensionAndContextOutsideClass() == "c d e c d e ")
    ) "OK" else "NOK"
}