From 54d707b3b631def1e03afe92c9434549f05d81ab Mon Sep 17 00:00:00 2001 From: pyos Date: Mon, 16 Dec 2019 13:52:48 +0100 Subject: [PATCH] JVM_IR: make constructors of named local classes public They are accessible through reflection --- .../src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt | 7 ++++++- .../writeFlags/function/constructors/localClass.kt | 9 +++++++++ .../kotlin/codegen/flags/WriteFlagsTestGenerated.java | 5 +++++ .../kotlin/codegen/ir/IrWriteFlagsTestGenerated.java | 5 +++++ 4 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 compiler/testData/writeFlags/function/constructors/localClass.kt diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt index f7f0f6fd194..9f5df16e953 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/JvmLower.kt @@ -17,6 +17,8 @@ import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.ir.IrElement import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.util.PatchDeclarationParentsVisitor +import org.jetbrains.kotlin.ir.util.isAnonymousObject +import org.jetbrains.kotlin.ir.util.parentAsClass import org.jetbrains.kotlin.ir.visitors.IrElementVisitorVoid import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid @@ -122,7 +124,10 @@ internal val localDeclarationsPhase = makeIrFilePhase( } override fun forConstructor(declaration: IrConstructor, inInlineFunctionScope: Boolean): Visibility = - scopedVisibility(inInlineFunctionScope) + if (declaration.parentAsClass.isAnonymousObject) + scopedVisibility(inInlineFunctionScope) + else + declaration.visibility private fun scopedVisibility(inInlineFunctionScope: Boolean): Visibility = if (inInlineFunctionScope) Visibilities.PUBLIC else JavaVisibilities.PACKAGE_VISIBILITY diff --git a/compiler/testData/writeFlags/function/constructors/localClass.kt b/compiler/testData/writeFlags/function/constructors/localClass.kt new file mode 100644 index 00000000000..fad4d408c99 --- /dev/null +++ b/compiler/testData/writeFlags/function/constructors/localClass.kt @@ -0,0 +1,9 @@ +class Foo { + fun a() { + class S + } +} + +// TESTED_OBJECT_KIND: function +// TESTED_OBJECTS: Foo$a$S, +// FLAGS: ACC_PUBLIC diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java index 80626f1f547..495a71c81c9 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java @@ -477,6 +477,11 @@ public class WriteFlagsTestGenerated extends AbstractWriteFlagsTest { runTest("compiler/testData/writeFlags/function/constructors/enum.kt"); } + @TestMetadata("localClass.kt") + public void testLocalClass() throws Exception { + runTest("compiler/testData/writeFlags/function/constructors/localClass.kt"); + } + @TestMetadata("objectInClass.kt") public void testObjectInClass() throws Exception { runTest("compiler/testData/writeFlags/function/constructors/objectInClass.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrWriteFlagsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrWriteFlagsTestGenerated.java index ef64e2f5cd2..d7d01083f92 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrWriteFlagsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrWriteFlagsTestGenerated.java @@ -477,6 +477,11 @@ public class IrWriteFlagsTestGenerated extends AbstractIrWriteFlagsTest { runTest("compiler/testData/writeFlags/function/constructors/enum.kt"); } + @TestMetadata("localClass.kt") + public void testLocalClass() throws Exception { + runTest("compiler/testData/writeFlags/function/constructors/localClass.kt"); + } + @TestMetadata("objectInClass.kt") public void testObjectInClass() throws Exception { runTest("compiler/testData/writeFlags/function/constructors/objectInClass.kt");