Set correct field visibility in psi2ir

This commit is contained in:
Steven Schäfer
2019-08-07 16:35:34 +02:00
committed by Alexander Udalov
parent 6c7a904663
commit a90ac2438d
186 changed files with 1030 additions and 909 deletions
@@ -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
}
@@ -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
}
}