From 4d4aabab8dee16a996ab88d9c82776608f47a70d Mon Sep 17 00:00:00 2001 From: Victor Turansky Date: Tue, 20 Oct 2020 15:49:29 +0300 Subject: [PATCH] [JS BE] Make properties configurable when implementing an interface by delegation #KT-42364 Fixed --- .../translate/declaration/DelegationTranslator.kt | 1 + .../testData/box/propertyAccess/configurable.kt | 15 ++++++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/DelegationTranslator.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/DelegationTranslator.kt index 182c60c4e12..16858fbcd8b 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/DelegationTranslator.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/declaration/DelegationTranslator.kt @@ -194,6 +194,7 @@ class DelegationTranslator( } else { val literal = JsObjectLiteral(true) + literal.propertyInitializers += JsPropertyInitializer(JsStringLiteral("configurable"), JsBooleanLiteral(true)) literal.propertyInitializers.addGetterAndSetter(descriptor, ::generateDelegateGetter, ::generateDelegateSetter) context().addAccessorsToPrototype(classDescriptor, descriptor, literal) } diff --git a/js/js.translator/testData/box/propertyAccess/configurable.kt b/js/js.translator/testData/box/propertyAccess/configurable.kt index 1dc14f25aa4..2d892420efc 100644 --- a/js/js.translator/testData/box/propertyAccess/configurable.kt +++ b/js/js.translator/testData/box/propertyAccess/configurable.kt @@ -1,4 +1,4 @@ -// EXPECTED_REACHABLE_NODES: 1325 +// EXPECTED_REACHABLE_NODES: 1345 // KJS_WITH_FULL_RUNTIME package foo @@ -15,11 +15,18 @@ class P : EP { get() = true } +class PD : EP by P() + fun usages() { val p = P() assertEquals(13, p.simpleProp) assertEquals("42", p.anotherProp) assertEquals(true, p.propWithGetter) + + val pd = PD() + assertEquals(13, pd.simpleProp) + assertEquals("42", pd.anotherProp) + assertEquals(true, pd.propWithGetter) } fun box(): String { @@ -31,6 +38,12 @@ fun box(): String { assertTrue(isConfigurable(prototype, "anotherProp")) assertTrue(isConfigurable(prototype, "propWithGetter")) + val delegatePrototype = PD::class.js.asDynamic().prototype + + assertTrue(isConfigurable(delegatePrototype, "simpleProp")) + assertTrue(isConfigurable(delegatePrototype, "anotherProp")) + assertTrue(isConfigurable(delegatePrototype, "propWithGetter")) + return "OK" }