[K/JS] fix(KT-46643): prevent removal of setter for overridden external field.
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
// 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"
|
||||
}
|
||||
Reference in New Issue
Block a user