Files
kotlin-fork/js/js.translator/testData/box/native/externalValWithOverridenVar.kt
T

91 lines
1.9 KiB
Kotlin
Vendored

// KT-46643
// IGNORE_BACKEND: WASM
// WITH_STDLIB
import kotlin.reflect.KProperty
external interface IBase {
val foo: String
}
external abstract class Base : IBase
open class A : Base() {
override var foo: String = "Error: A setter was not called."
set(k) { result = "O$k"}
lateinit var result: String
}
open class B : Base() {
override val foo: String = "OK"
open val result: String get() = foo
}
class C : B() {
override var foo: String = "Error: C setter was not called."
set(k) { result = "O$k"}
override lateinit var result: String
}
open class D : B() {
override val foo: String = "OK"
}
open class E : D() {
override var foo: String = "Error: E setter was not called."
set(k) { result = "O$k"}
override lateinit var result: String
}
open class F: B() {
override var foo: String by CustomDelegator
private object CustomDelegator {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return "Error: F setter was not called."
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
result = "O$value"
}
lateinit var result: String
}
override val result: String get() = CustomDelegator.result
}
class G(val b: B): IBase by b {
val result: String get() = b.result
}
fun box(): String {
val a = A()
if (a.result != "OK") return a.foo
val b = B()
if (b.result != "OK") return b.foo
val c = C()
if (c.result != "OK") return c.foo
val d = D()
if (d.result != "OK") return d.foo
val e = E()
if (e.result != "OK") return e.foo
try {
val f = F()
return "Failed: it should not work for now, because of delegating objects initialization order"
} catch (e: Throwable) {}
val g = G(e)
if (g.result != "OK") return g.foo
return "OK"
}