JVM IR: Don't move inaccessible const fields out of interface companions

This commit is contained in:
Steven Schäfer
2019-08-09 14:07:49 +02:00
committed by max-kammerer
parent 3742425547
commit 0c3c0989b4
5 changed files with 31 additions and 5 deletions
@@ -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
@@ -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");
@@ -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");