diff --git a/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsClassModel.kt b/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsClassModel.kt index 88816fd11df..b6cc71dab8a 100644 --- a/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsClassModel.kt +++ b/js/js.ast/src/org/jetbrains/kotlin/js/backend/ast/JsClassModel.kt @@ -18,6 +18,6 @@ package org.jetbrains.kotlin.js.backend.ast class JsClassModel(val name: JsName, val superName: JsName?) { val interfaces: MutableSet = mutableSetOf() - val preDeclarationBlock = JsGlobalBlock() + val preDeclarationBlock = JsGlobalBlock() // TODO only used in IR backend => hide from current backend val postDeclarationBlock = JsGlobalBlock() } diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/InliningScope.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/InliningScope.kt index 20e96ac89a0..0efe10290ae 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/InliningScope.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/InliningScope.kt @@ -140,6 +140,9 @@ class ImportIntoFragmentInliningScope private constructor( get() = JsBlock( JsBlock(fragment.inlinedLocalDeclarations.values.toList()), fragment.declarationBlock, + JsBlock(fragment.classes.values.flatMap { + listOf(it.preDeclarationBlock, it.postDeclarationBlock) + }), fragment.exportBlock, JsExpressionStatement(JsFunction(JsDynamicScope, fragment.initializerBlock, "")) ).also { block -> diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java index 3e0a64fe70c..1fa56b5ff00 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/ir/semantics/IrBoxJsTestGenerated.java @@ -5316,6 +5316,11 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest { runTest("js/js.translator/testData/box/multiModule/moduleAndVariableNameClash.kt"); } + @TestMetadata("privateInterfaceMethodInheritance.kt") + public void testPrivateInterfaceMethodInheritance() throws Exception { + runTest("js/js.translator/testData/box/multiModule/privateInterfaceMethodInheritance.kt"); + } + @TestMetadata("privateInterfaceNameClash.kt") public void testPrivateInterfaceNameClash() throws Exception { runTest("js/js.translator/testData/box/multiModule/privateInterfaceNameClash.kt"); 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 77a10106363..c63ca65e3be 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 @@ -5321,6 +5321,11 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { runTest("js/js.translator/testData/box/multiModule/moduleAndVariableNameClash.kt"); } + @TestMetadata("privateInterfaceMethodInheritance.kt") + public void testPrivateInterfaceMethodInheritance() throws Exception { + runTest("js/js.translator/testData/box/multiModule/privateInterfaceMethodInheritance.kt"); + } + @TestMetadata("privateInterfaceNameClash.kt") public void testPrivateInterfaceNameClash() throws Exception { runTest("js/js.translator/testData/box/multiModule/privateInterfaceNameClash.kt"); diff --git a/js/js.translator/testData/box/multiModule/privateInterfaceMethodInheritance.kt b/js/js.translator/testData/box/multiModule/privateInterfaceMethodInheritance.kt new file mode 100644 index 00000000000..ff01a718f67 --- /dev/null +++ b/js/js.translator/testData/box/multiModule/privateInterfaceMethodInheritance.kt @@ -0,0 +1,25 @@ +// EXPECTED_REACHABLE_NODES: 1280 +// IGNORE_BACKEND: JS_IR +// MODULE: lib +// FILE: lib.kt +package lib + +interface A { + private fun foo() = "OK" + + fun bar() = foo() +} + +open class AProxy: A + +// MODULE: main(lib) +// FILE: main.kt +package main + +// KT-31007 +import lib.AProxy + +// Important bit: don't inherit A directly +class B : AProxy() + +fun box(): String = B().bar() \ No newline at end of file