From 2c4569568bb037c61a924543cd47531d7092126c Mon Sep 17 00:00:00 2001 From: Artem Kobzar Date: Thu, 3 Aug 2023 13:10:03 +0000 Subject: [PATCH] [K/JS] Fix importing behavior for external interfaces in case of implementing them --- .../backend/js/transformers/irToJs/JsClassGenerator.kt | 9 ++++++++- .../testData/box/esModules/jsModule/interfaces.kt | 9 +++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsClassGenerator.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsClassGenerator.kt index 51d64866a10..2a96b3dae68 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsClassGenerator.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/transformers/irToJs/JsClassGenerator.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addToStdlib.butIf import org.jetbrains.kotlin.utils.addToStdlib.runIf import org.jetbrains.kotlin.utils.memoryOptimizedMap +import org.jetbrains.kotlin.utils.memoryOptimizedMapNotNull import org.jetbrains.kotlin.utils.toSmartList class JsClassGenerator(private val irClass: IrClass, val context: JsGenerationContext) { @@ -537,8 +538,14 @@ private fun IrOverridableDeclaration<*>.overridesExternal(): Boolean { private val IrClassifierSymbol.isInterface get() = (owner as? IrClass)?.isInterface == true +private fun IrClassSymbol.existsInRuntime(): Boolean { + return !owner.isEffectivelyExternal() || !owner.isInterface +} + class JsIrClassModel(val klass: IrClass) { - val superClasses = klass.superTypes.memoryOptimizedMap { it.classifierOrNull as IrClassSymbol } + val superClasses = klass.superTypes.memoryOptimizedMapNotNull { + (it.classifierOrNull as IrClassSymbol).takeIf(IrClassSymbol::existsInRuntime) + } val preDeclarationBlock = JsCompositeBlock() val postDeclarationBlock = JsCompositeBlock() diff --git a/js/js.translator/testData/box/esModules/jsModule/interfaces.kt b/js/js.translator/testData/box/esModules/jsModule/interfaces.kt index c01aa0e44a1..d38cc4d00c1 100644 --- a/js/js.translator/testData/box/esModules/jsModule/interfaces.kt +++ b/js/js.translator/testData/box/esModules/jsModule/interfaces.kt @@ -1,4 +1,5 @@ // DONT_TARGET_EXACT_BACKEND: JS +// IGNORE_BACKEND: WASM // ES_MODULES // FILE: bar.kt @file:JsModule("./interfaces.mjs") @@ -26,8 +27,16 @@ external val bar: Bar external val baz: Baz // FILE: test.kt +import boo.Baz + fun box(): String { if (bar.ping() != "ping" || baz.pong() != 194) return "Fail" + val local = object : Baz { + override fun pong(): Int = 322 + } + + if (local.asDynamic().pong() != 322) return "Fail" + return "OK" } \ No newline at end of file