Set correct field visibility in psi2ir
This commit is contained in:
committed by
Alexander Udalov
parent
6c7a904663
commit
a90ac2438d
+4
-2
@@ -6,11 +6,11 @@
|
||||
package org.jetbrains.kotlin.psi2ir.generators
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.CallableDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.ClassDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.ir.declarations.IrDeclarationOrigin
|
||||
import org.jetbrains.kotlin.types.KotlinType
|
||||
import org.jetbrains.kotlin.types.SimpleType
|
||||
|
||||
open class GeneratorExtensions {
|
||||
open val externalDeclarationOrigin: ((DeclarationDescriptor) -> IrDeclarationOrigin)?
|
||||
@@ -32,4 +32,6 @@ open class GeneratorExtensions {
|
||||
|
||||
companion object Instance : SamConversion()
|
||||
}
|
||||
|
||||
open fun computeFieldVisibility(descriptor: PropertyDescriptor): Visibility? = null
|
||||
}
|
||||
|
||||
+15
-2
@@ -18,6 +18,7 @@ package org.jetbrains.kotlin.psi2ir.generators
|
||||
|
||||
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
|
||||
import org.jetbrains.kotlin.descriptors.Visibilities
|
||||
import org.jetbrains.kotlin.descriptors.Visibility
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
|
||||
import org.jetbrains.kotlin.ir.expressions.IrStatementOrigin
|
||||
@@ -86,7 +87,8 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
|
||||
context.symbolTable.declareField(
|
||||
ktPropertyElement.startOffsetSkippingComments, ktPropertyElement.endOffset,
|
||||
IrDeclarationOrigin.PROPERTY_BACKING_FIELD,
|
||||
propertyDescriptor, propertyDescriptor.type.toIrType()
|
||||
propertyDescriptor, propertyDescriptor.type.toIrType(),
|
||||
propertyDescriptor.fieldVisibility
|
||||
).also {
|
||||
it.initializer = generateInitializer(it)
|
||||
}
|
||||
@@ -137,7 +139,7 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
|
||||
val endOffset = ktElement.pureEndOffsetOrUndefined
|
||||
|
||||
val backingField =
|
||||
if (propertyDescriptor.hasBackingField(context.bindingContext))
|
||||
if (propertyDescriptor.hasBackingField(context.bindingContext) && propertyDescriptor.fieldVisibility.admitsFakeOverride)
|
||||
context.symbolTable.declareFieldWithOverrides(
|
||||
startOffset, endOffset, IrDeclarationOrigin.FAKE_OVERRIDE,
|
||||
propertyDescriptor, propertyDescriptor.type.toIrType()
|
||||
@@ -171,5 +173,16 @@ class PropertyGenerator(declarationGenerator: DeclarationGenerator) : Declaratio
|
||||
val variableDescriptor = getOrFail(BindingContext.VARIABLE, ktProperty)
|
||||
return variableDescriptor as? PropertyDescriptor ?: TODO("not a property: $variableDescriptor")
|
||||
}
|
||||
|
||||
private val Visibility.admitsFakeOverride: Boolean
|
||||
get() = !Visibilities.isPrivate(this) && this != Visibilities.INVISIBLE_FAKE
|
||||
|
||||
private val PropertyDescriptor.fieldVisibility: Visibility
|
||||
get() = declarationGenerator.context.extensions.computeFieldVisibility(this)
|
||||
?: when {
|
||||
isLateInit -> setter?.visibility ?: visibility
|
||||
isConst -> visibility
|
||||
else -> Visibilities.PRIVATE
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user