dfd9aabf8e
#KT-61514 Fixed
49 lines
1.2 KiB
Kotlin
Vendored
49 lines
1.2 KiB
Kotlin
Vendored
// FIR_IDENTICAL
|
|
// TARGET_BACKEND: JVM
|
|
// WITH_STDLIB
|
|
// FULL_JDK
|
|
// JVM_TARGET: 1.8
|
|
|
|
interface SymbolOwner<E : SymbolOwner<E>>
|
|
|
|
interface Symbol<E : SymbolOwner<E>>
|
|
|
|
interface ReceiverValue {
|
|
val type: String
|
|
}
|
|
|
|
class ImplicitReceiverValue<S : Symbol<*>>(val boundSymbol: S?, override val type: String) : ReceiverValue
|
|
|
|
abstract class ImplicitReceiverStack : Iterable<ImplicitReceiverValue<*>> {
|
|
abstract operator fun get(name: String?): ImplicitReceiverValue<*>?
|
|
}
|
|
|
|
class PersistentImplicitReceiverStack(
|
|
private val stack: List<ImplicitReceiverValue<*>>
|
|
) : ImplicitReceiverStack(), Iterable<ImplicitReceiverValue<*>> {
|
|
override operator fun iterator(): Iterator<ImplicitReceiverValue<*>> {
|
|
return stack.iterator()
|
|
}
|
|
|
|
override operator fun get(name: String?): ImplicitReceiverValue<*>? {
|
|
return stack.lastOrNull()
|
|
}
|
|
}
|
|
|
|
fun bar(s: String) {}
|
|
|
|
fun foo(stack: PersistentImplicitReceiverStack) {
|
|
stack.forEach {
|
|
it.boundSymbol
|
|
bar(it.type)
|
|
}
|
|
}
|
|
|
|
fun box(): String {
|
|
val stack = PersistentImplicitReceiverStack(
|
|
listOf(ImplicitReceiverValue(null, "O"), ImplicitReceiverValue(null, "K"))
|
|
)
|
|
foo(stack)
|
|
return stack.first().type + stack[null]?.type
|
|
}
|