diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java index ff330604cae..4c7cca2d970 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/BoxJsTestGenerated.java @@ -3875,6 +3875,11 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { runTest("js/js.translator/testData/box/inline/extensionWithManyArguments.kt"); } + @TestMetadata("fakeOverrideInlining.kt") + public void testFakeOverrideInlining() throws Exception { + runTest("js/js.translator/testData/box/inline/fakeOverrideInlining.kt"); + } + @TestMetadata("faultyRedundantCallElimination.kt") public void testFaultyRedundantCallElimination() throws Exception { runTest("js/js.translator/testData/box/inline/faultyRedundantCallElimination.kt"); diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrBoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrBoxJsTestGenerated.java index 1e0950d0637..f403058e311 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrBoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/semantics/IrBoxJsTestGenerated.java @@ -3875,6 +3875,11 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest { runTest("js/js.translator/testData/box/inline/extensionWithManyArguments.kt"); } + @TestMetadata("fakeOverrideInlining.kt") + public void testFakeOverrideInlining() throws Exception { + runTest("js/js.translator/testData/box/inline/fakeOverrideInlining.kt"); + } + @TestMetadata("faultyRedundantCallElimination.kt") public void testFaultyRedundantCallElimination() throws Exception { runTest("js/js.translator/testData/box/inline/faultyRedundantCallElimination.kt"); diff --git a/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Merger.kt b/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Merger.kt index a2da6be3b0a..2cc348775c8 100644 --- a/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Merger.kt +++ b/js/js.translator/src/org/jetbrains/kotlin/js/translate/general/Merger.kt @@ -236,6 +236,18 @@ class Merger( } } + private fun JsStatement?.isFakeOverrideAssignment(): Boolean { + fun JsExpression?.isMemberReference(): Boolean { + val qualifier = (this as? JsNameRef)?.qualifier as? JsNameRef ?: return false + + return qualifier.name == null && qualifier.ident == "prototype" + } + + val binOp = (this as? JsExpressionStatement)?.expression as? JsBinaryOperation ?: return false + + return binOp.operator == JsBinaryOperator.ASG && binOp.arg1.isMemberReference() && binOp.arg2.isMemberReference() + } + // Adds different boilerplate code (like imports, class prototypes, etc) to resulting program. fun merge() { mergeNames() @@ -246,13 +258,21 @@ class Merger( addClassPrototypes(this) // TODO better placing? - importedFunctionWrappers.values.forEach { - this += it.statements + val additionalFakeOverrides = mutableListOf() + importedFunctionWrappers.values.forEach {block -> + block.statements.forEach { s -> + if (s.isFakeOverrideAssignment()) { + additionalFakeOverrides += s + } else { + this += s + } + } } this += declarationBlock.statements this += exportBlock.statements addClassPostDeclarations(this) + this += additionalFakeOverrides this += initializerBlock.statements this += testsMap.values mainFn?.second?.let { this += it } diff --git a/js/js.translator/testData/box/inline/fakeOverrideInlining.kt b/js/js.translator/testData/box/inline/fakeOverrideInlining.kt new file mode 100644 index 00000000000..c8d65762b08 --- /dev/null +++ b/js/js.translator/testData/box/inline/fakeOverrideInlining.kt @@ -0,0 +1,11 @@ +// EXPECTED_REACHABLE_NODES: 1280 + +inline fun foo() = (object : II {}).ok() + +fun box() = foo() + +interface I { + fun ok() = "OK" +} + +interface II: I \ No newline at end of file