From 102072a229ccafd4d1450aaa347bb4065d452284 Mon Sep 17 00:00:00 2001 From: Artem Kobzar Date: Fri, 29 Oct 2021 14:09:31 +0000 Subject: [PATCH] fix(KT-40236): compute JsName from overridden symbols. --- .../ir/backend/js/utils/AnnotationUtils.kt | 14 +++++++- .../semantics/IrBoxJsES6TestGenerated.java | 5 +++ .../ir/semantics/IrBoxJsTestGenerated.java | 5 +++ .../kotlin/js/testNew/BoxJsTestGenerated.java | 6 ++++ .../externalPropertyOverride.kt | 33 +++++++++++++++++++ 5 files changed, 62 insertions(+), 1 deletion(-) create mode 100644 js/js.translator/testData/box/propertyOverride/externalPropertyOverride.kt diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/AnnotationUtils.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/AnnotationUtils.kt index 7df5ec5df78..412009215e8 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/AnnotationUtils.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/AnnotationUtils.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.ir.backend.js.utils import org.jetbrains.kotlin.ir.declarations.IrAnnotationContainer import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrDeclarationWithName +import org.jetbrains.kotlin.ir.declarations.IrOverridableDeclaration import org.jetbrains.kotlin.ir.expressions.IrClassReference import org.jetbrains.kotlin.ir.expressions.IrConst import org.jetbrains.kotlin.ir.expressions.IrConstructorCall @@ -56,8 +57,19 @@ fun IrAnnotationContainer.isJsNativeSetter(): Boolean = hasAnnotation(JsAnnotati fun IrAnnotationContainer.isJsNativeInvoke(): Boolean = hasAnnotation(JsAnnotations.jsNativeInvoke) +fun IrDeclarationWithName.getJsNameForOverriddenDeclaration(): String? { + val jsName = getJsName() + + return when { + jsName != null -> jsName + this is IrOverridableDeclaration<*> -> + overriddenSymbols.firstNotNullOfOrNull { (it.owner as? IrAnnotationContainer)?.getJsName() } + else -> null + } +} + fun IrDeclarationWithName.getJsNameOrKotlinName(): Name = - when (val jsName = getJsName()) { + when (val jsName = getJsNameForOverriddenDeclaration()) { null -> name else -> Name.identifier(jsName) } diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrBoxJsES6TestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrBoxJsES6TestGenerated.java index 9dd48d88994..734d162c87c 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrBoxJsES6TestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/es6/semantics/IrBoxJsES6TestGenerated.java @@ -7488,6 +7488,11 @@ public class IrBoxJsES6TestGenerated extends AbstractIrBoxJsES6Test { runTest("js/js.translator/testData/box/propertyOverride/exportedBaseClass.kt"); } + @TestMetadata("externalPropertyOverride.kt") + public void testExternalPropertyOverride() throws Exception { + runTest("js/js.translator/testData/box/propertyOverride/externalPropertyOverride.kt"); + } + @TestMetadata("initOverrideInConstructor.kt") public void testInitOverrideInConstructor() throws Exception { runTest("js/js.translator/testData/box/propertyOverride/initOverrideInConstructor.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java index 63158b8c56c..330f3428b61 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java @@ -7483,6 +7483,11 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest { runTest("js/js.translator/testData/box/propertyOverride/exportedBaseClass.kt"); } + @TestMetadata("externalPropertyOverride.kt") + public void testExternalPropertyOverride() throws Exception { + runTest("js/js.translator/testData/box/propertyOverride/externalPropertyOverride.kt"); + } + @TestMetadata("initOverrideInConstructor.kt") public void testInitOverrideInConstructor() throws Exception { runTest("js/js.translator/testData/box/propertyOverride/initOverrideInConstructor.kt"); diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testNew/BoxJsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testNew/BoxJsTestGenerated.java index 7b7a7d40b68..809a598b062 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testNew/BoxJsTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/testNew/BoxJsTestGenerated.java @@ -8088,6 +8088,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { runTest("js/js.translator/testData/box/propertyOverride/exportedBaseClass.kt"); } + @Test + @TestMetadata("externalPropertyOverride.kt") + public void testExternalPropertyOverride() throws Exception { + runTest("js/js.translator/testData/box/propertyOverride/externalPropertyOverride.kt"); + } + @Test @TestMetadata("initOverrideInConstructor.kt") public void testInitOverrideInConstructor() throws Exception { diff --git a/js/js.translator/testData/box/propertyOverride/externalPropertyOverride.kt b/js/js.translator/testData/box/propertyOverride/externalPropertyOverride.kt new file mode 100644 index 00000000000..391ce5e2f2a --- /dev/null +++ b/js/js.translator/testData/box/propertyOverride/externalPropertyOverride.kt @@ -0,0 +1,33 @@ +external interface A { + @JsName("__name") + val name: String + + @JsName("bar") + fun foo(): String +} + +external class B: A { + override val name: String + override fun foo(): String +} + +fun box(): String { + val c = js("{ __name: 'Frodo', bar: function() { return 'Baggins' } }") + + val a: A = c + val b: B = c + + assertEquals(a.name, "Frodo") + assertEquals(a.asDynamic().__name, "Frodo") + + assertEquals(b.name, "Frodo") + assertEquals(b.asDynamic().__name, "Frodo") + + assertEquals(a.foo(), "Baggins") + assertEquals(a.asDynamic().bar(), "Baggins") + + assertEquals(b.foo(), "Baggins") + assertEquals(b.asDynamic().bar(), "Baggins") + + return "OK" +} \ No newline at end of file