diff --git a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/IrJsUtils.kt b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/IrJsUtils.kt index 4c063541c22..6d317617d35 100644 --- a/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/IrJsUtils.kt +++ b/compiler/ir/backend.js/src/org/jetbrains/kotlin/ir/backend/js/utils/IrJsUtils.kt @@ -5,16 +5,18 @@ package org.jetbrains.kotlin.ir.backend.js.utils -import org.jetbrains.kotlin.descriptors.isInterface import org.jetbrains.kotlin.descriptors.isClass +import org.jetbrains.kotlin.descriptors.isInterface import org.jetbrains.kotlin.ir.declarations.IrClass import org.jetbrains.kotlin.ir.declarations.IrDeclaration +import org.jetbrains.kotlin.ir.declarations.IrDeclarationWithVisibility import org.jetbrains.kotlin.ir.expressions.IrReturn import org.jetbrains.kotlin.ir.symbols.IrReturnableBlockSymbol import org.jetbrains.kotlin.ir.util.parentClassOrNull fun IrDeclaration.isExportedMember() = - parentClassOrNull.let { it is IrClass && it.isJsExport() } + (this is IrDeclarationWithVisibility && visibility.isPublicAPI) && + parentClassOrNull.let { it is IrClass && it.isJsExport() } fun IrDeclaration?.isExportedClass() = this is IrClass && kind.isClass && isJsExport() diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/BoxJsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/BoxJsTestGenerated.java index c65eb0d97bc..5066e07a241 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/BoxJsTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/BoxJsTestGenerated.java @@ -2094,6 +2094,12 @@ public class BoxJsTestGenerated extends AbstractBoxJsTest { runTest("js/js.translator/testData/box/export/exportClassWithInternal.kt"); } + @Test + @TestMetadata("exportClassWithInternalOneFile.kt") + public void testExportClassWithInternalOneFile() throws Exception { + runTest("js/js.translator/testData/box/export/exportClassWithInternalOneFile.kt"); + } + @Test @TestMetadata("exportEnumClass.kt") public void testExportEnumClass() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java index 52d8087d7dc..9ca146b551f 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/IrBoxJsTestGenerated.java @@ -2496,6 +2496,12 @@ public class IrBoxJsTestGenerated extends AbstractIrBoxJsTest { runTest("js/js.translator/testData/box/export/exportClassWithInternal.kt"); } + @Test + @TestMetadata("exportClassWithInternalOneFile.kt") + public void testExportClassWithInternalOneFile() throws Exception { + runTest("js/js.translator/testData/box/export/exportClassWithInternalOneFile.kt"); + } + @Test @TestMetadata("exportEnumClass.kt") public void testExportEnumClass() throws Exception { diff --git a/js/js.translator/testData/box/export/exportClassWithInternal.kt b/js/js.translator/testData/box/export/exportClassWithInternal.kt index bb8a09165c7..817f3a141a5 100644 --- a/js/js.translator/testData/box/export/exportClassWithInternal.kt +++ b/js/js.translator/testData/box/export/exportClassWithInternal.kt @@ -1,11 +1,32 @@ // FILE: lib.kt @JsExport -class Foo(internal val constructorParameter: String) +class Foo(internal val constructorParameter: String) { + internal val nonDefaultAccessor: String + get() = "hello" + + internal val defaultAccessor: String = constructorParameter + "!" +} + +@JsExport +enum class Bar(internal val constructorParameter: String) { + A("a"); + + internal val nonDefaultAccessor: String + get() = "hello" + + internal val defaultAccessor: String = constructorParameter + "!" +} // FILE: main.kt -fun box():String { +fun box(): String { val foo = Foo("foo") - if (foo.constructorParameter != "foo") return "fail" + if (foo.constructorParameter != "foo") return "fail1" + if (foo.nonDefaultAccessor != "hello") return "fail2" + if (foo.defaultAccessor != "foo!") return "fail3" + + if (Bar.A.constructorParameter != "a") return "fail4" + if (Bar.A.nonDefaultAccessor != "hello") return "fail5" + if (Bar.A.defaultAccessor != "a!") return "fail6" return "OK" } \ No newline at end of file diff --git a/js/js.translator/testData/box/export/exportClassWithInternalOneFile.kt b/js/js.translator/testData/box/export/exportClassWithInternalOneFile.kt new file mode 100644 index 00000000000..c9d88c8511a --- /dev/null +++ b/js/js.translator/testData/box/export/exportClassWithInternalOneFile.kt @@ -0,0 +1,30 @@ +@JsExport +class Foo(internal val constructorParameter: String) { + internal val nonDefaultAccessor: String + get() = "hello" + + internal val defaultAccessor: String = constructorParameter + "!" +} + +@JsExport +enum class Bar(internal val constructorParameter: String) { + A("a"); + + internal val nonDefaultAccessor: String + get() = "hello" + + internal val defaultAccessor: String = constructorParameter + "!" +} + +fun box(): String { + val foo = Foo("foo") + if (foo.constructorParameter != "foo") return "fail1" + if (foo.nonDefaultAccessor != "hello") return "fail2" + if (foo.defaultAccessor != "foo!") return "fail3" + + if (Bar.A.constructorParameter != "a") return "fail4" + if (Bar.A.nonDefaultAccessor != "hello") return "fail5" + if (Bar.A.defaultAccessor != "a!") return "fail6" + + return "OK" +} \ No newline at end of file