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.IrAnonymousInitializerSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
|
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
|
||||||
import org.jetbrains.kotlin.ir.symbols.impl.IrVariableSymbolImpl
|
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.IrElementTransformerVoid
|
||||||
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
import org.jetbrains.kotlin.ir.visitors.transformChildrenVoid
|
||||||
import org.jetbrains.kotlin.load.java.JvmAbi.JVM_FIELD_ANNOTATION_FQ_NAME
|
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 {
|
val companion = irClass.declarations.find {
|
||||||
it is IrClass && it.isCompanion
|
it is IrClass && it.isCompanion
|
||||||
} as IrClass? ?: return
|
} as IrClass? ?: return
|
||||||
companion.declarations.filter { it is IrProperty && it.isConst }.mapNotNullTo(irClass.declarations) {
|
companion.declarations.filter { it is IrProperty && it.isConst && it.hasPublicVisibility }
|
||||||
copyPropertyFieldToStaticParent(it as IrProperty, companion, irClass)
|
.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() =
|
private fun IrClass.allFieldsAreJvmField() =
|
||||||
declarations.filterIsInstance<IrProperty>()
|
declarations.filterIsInstance<IrProperty>()
|
||||||
.mapNotNull { it.backingField }.all { it.hasAnnotation(JVM_FIELD_ANNOTATION_FQ_NAME) }
|
.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 {
|
interface Test {
|
||||||
companion object {
|
companion object {
|
||||||
protected const val prop: Int = 0
|
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");
|
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")
|
@TestMetadata("privateVal.kt")
|
||||||
public void testPrivateVal() throws Exception {
|
public void testPrivateVal() throws Exception {
|
||||||
runTest("compiler/testData/writeFlags/property/classObject/trait/privateVal.kt");
|
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");
|
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")
|
@TestMetadata("privateVal.kt")
|
||||||
public void testPrivateVal() throws Exception {
|
public void testPrivateVal() throws Exception {
|
||||||
runTest("compiler/testData/writeFlags/property/classObject/trait/privateVal.kt");
|
runTest("compiler/testData/writeFlags/property/classObject/trait/privateVal.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user