From 0c3c0989b4d2f1d42d48aa18d5e8e4388a614170 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Steven=20Sch=C3=A4fer?= Date: Fri, 9 Aug 2019 14:07:49 +0200 Subject: [PATCH] JVM IR: Don't move inaccessible const fields out of interface companions --- .../jvm/lower/MoveCompanionObjectFieldsLowering.kt | 12 ++++++++---- .../property/classObject/trait/privateConstVal.kt | 13 +++++++++++++ .../property/classObject/trait/protectedConstVal.kt | 1 - .../codegen/flags/WriteFlagsTestGenerated.java | 5 +++++ .../codegen/ir/IrWriteFlagsTestGenerated.java | 5 +++++ 5 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/writeFlags/property/classObject/trait/privateConstVal.kt diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MoveCompanionObjectFieldsLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MoveCompanionObjectFieldsLowering.kt index 58fac5437b6..98b27513443 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MoveCompanionObjectFieldsLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/MoveCompanionObjectFieldsLowering.kt @@ -27,7 +27,9 @@ import org.jetbrains.kotlin.ir.symbols.IrFieldSymbol import org.jetbrains.kotlin.ir.symbols.impl.IrAnonymousInitializerSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl -import org.jetbrains.kotlin.ir.util.* +import org.jetbrains.kotlin.ir.util.hasAnnotation +import org.jetbrains.kotlin.ir.util.isObject +import org.jetbrains.kotlin.ir.util.patchDeclarationParents import org.jetbrains.kotlin.ir.visitors.IrElementTransformerVoid import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid import org.jetbrains.kotlin.load.java.JvmAbi.JVM_FIELD_ANNOTATION_FQ_NAME @@ -96,11 +98,13 @@ private class MoveOrCopyCompanionObjectFieldsLowering(val context: CommonBackend val companion = irClass.declarations.find { it is IrClass && it.isCompanion } as IrClass? ?: return - companion.declarations.filter { it is IrProperty && it.isConst }.mapNotNullTo(irClass.declarations) { - copyPropertyFieldToStaticParent(it as IrProperty, companion, irClass) - } + companion.declarations.filter { it is IrProperty && it.isConst && it.hasPublicVisibility } + .mapNotNullTo(irClass.declarations) { copyPropertyFieldToStaticParent(it as IrProperty, companion, irClass) } } + private val IrProperty.hasPublicVisibility: Boolean + get() = !Visibilities.isPrivate(visibility) && visibility != Visibilities.PROTECTED + private fun IrClass.allFieldsAreJvmField() = declarations.filterIsInstance() .mapNotNull { it.backingField }.all { it.hasAnnotation(JVM_FIELD_ANNOTATION_FQ_NAME) } diff --git a/compiler/testData/writeFlags/property/classObject/trait/privateConstVal.kt b/compiler/testData/writeFlags/property/classObject/trait/privateConstVal.kt new file mode 100644 index 00000000000..2e5a772e630 --- /dev/null +++ b/compiler/testData/writeFlags/property/classObject/trait/privateConstVal.kt @@ -0,0 +1,13 @@ +interface Test { + companion object { + private const val prop: Int = 0 + } +} + +// TESTED_OBJECT_KIND: property +// TESTED_OBJECTS: Test, prop +// ABSENT: TRUE + +// TESTED_OBJECT_KIND: property +// TESTED_OBJECTS: Test$Companion, prop +// FLAGS: ACC_PRIVATE, ACC_FINAL, ACC_STATIC diff --git a/compiler/testData/writeFlags/property/classObject/trait/protectedConstVal.kt b/compiler/testData/writeFlags/property/classObject/trait/protectedConstVal.kt index d59f6babfb2..43abe383c46 100644 --- a/compiler/testData/writeFlags/property/classObject/trait/protectedConstVal.kt +++ b/compiler/testData/writeFlags/property/classObject/trait/protectedConstVal.kt @@ -1,4 +1,3 @@ -// IGNORE_BACKEND: JVM_IR interface Test { companion object { protected const val prop: Int = 0 diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java index b13ccba1441..4ae42a37a3d 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/flags/WriteFlagsTestGenerated.java @@ -1039,6 +1039,11 @@ public class WriteFlagsTestGenerated extends AbstractWriteFlagsTest { runTest("compiler/testData/writeFlags/property/classObject/trait/noBackingField.kt"); } + @TestMetadata("privateConstVal.kt") + public void testPrivateConstVal() throws Exception { + runTest("compiler/testData/writeFlags/property/classObject/trait/privateConstVal.kt"); + } + @TestMetadata("privateVal.kt") public void testPrivateVal() throws Exception { runTest("compiler/testData/writeFlags/property/classObject/trait/privateVal.kt"); diff --git a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrWriteFlagsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrWriteFlagsTestGenerated.java index 51bfecafd6a..3a9ce499cb3 100644 --- a/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrWriteFlagsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/codegen/ir/IrWriteFlagsTestGenerated.java @@ -1039,6 +1039,11 @@ public class IrWriteFlagsTestGenerated extends AbstractIrWriteFlagsTest { runTest("compiler/testData/writeFlags/property/classObject/trait/noBackingField.kt"); } + @TestMetadata("privateConstVal.kt") + public void testPrivateConstVal() throws Exception { + runTest("compiler/testData/writeFlags/property/classObject/trait/privateConstVal.kt"); + } + @TestMetadata("privateVal.kt") public void testPrivateVal() throws Exception { runTest("compiler/testData/writeFlags/property/classObject/trait/privateVal.kt");