JVM IR: Don't move inaccessible const fields out of interface companions
This commit is contained in:
committed by
max-kammerer
parent
3742425547
commit
0c3c0989b4
+8
-4
@@ -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<IrProperty>()
|
||||
.mapNotNull { it.backingField }.all { it.hasAnnotation(JVM_FIELD_ANNOTATION_FQ_NAME) }
|
||||
|
||||
@@ -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
|
||||
@@ -1,4 +1,3 @@
|
||||
// IGNORE_BACKEND: JVM_IR
|
||||
interface Test {
|
||||
companion object {
|
||||
protected const val prop: Int = 0
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
+5
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user