[IR] Unbind construction methods of IrPropertyImpl from symbol.descriptor

This commit is contained in:
Mikhail Glukhikh
2020-05-18 18:21:58 +03:00
parent 7840adde12
commit ab15a88ce4
5 changed files with 83 additions and 25 deletions
@@ -20,6 +20,7 @@ import org.jetbrains.kotlin.psi.psiUtil.pureStartOffset
import org.jetbrains.kotlin.psi2ir.endOffsetOrUndefined
import org.jetbrains.kotlin.psi2ir.startOffsetOrUndefined
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal
import org.jetbrains.kotlin.types.KotlinType
class StandaloneDeclarationGenerator(private val context: GeneratorContext) {
@@ -185,7 +186,18 @@ class StandaloneDeclarationGenerator(private val context: GeneratorContext) {
}
fun generateProperty(startOffset: Int, endOffset: Int, origin: IrDeclarationOrigin, descriptor: PropertyDescriptor, symbol: IrPropertySymbol): IrProperty {
val irProperty = IrPropertyImpl(startOffset, endOffset, origin, symbol, isDelegated = false)
val irProperty = IrPropertyImpl(
startOffset, endOffset, origin, symbol,
name = descriptor.name,
visibility = descriptor.visibility,
modality = descriptor.modality,
isVar = descriptor.isVar,
isConst = descriptor.isConst,
isLateinit = descriptor.isLateInit,
isDelegated = false,
isExternal = descriptor.isEffectivelyExternal(),
isExpect = descriptor.isExpect
)
irProperty.metadata = MetadataSource.Property(descriptor)
@@ -28,49 +28,73 @@ import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal
@Suppress("DEPRECATION_ERROR")
class IrPropertyImpl(
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
override val symbol: IrPropertySymbol,
override val name: Name = symbol.descriptor.name,
override val visibility: Visibility = symbol.descriptor.visibility,
override val modality: Modality = symbol.descriptor.modality,
override val isVar: Boolean = symbol.descriptor.isVar,
override val isConst: Boolean = symbol.descriptor.isConst,
override val isLateinit: Boolean = symbol.descriptor.isLateInit,
override val isDelegated: Boolean = @Suppress("DEPRECATION") symbol.descriptor.isDelegated,
override val isExternal: Boolean = symbol.descriptor.isEffectivelyExternal(),
override val isExpect: Boolean = symbol.descriptor.isExpect,
override val name: Name,
override val visibility: Visibility,
override val modality: Modality,
override val isVar: Boolean,
override val isConst: Boolean,
override val isLateinit: Boolean,
override val isDelegated: Boolean,
override val isExternal: Boolean,
override val isExpect: Boolean = false,
override val isFakeOverride: Boolean = origin == IrDeclarationOrigin.FAKE_OVERRIDE
) : IrDeclarationBase<PropertyCarrier>(startOffset, endOffset, origin),
IrProperty,
PropertyCarrier {
@Deprecated(
"This constructor is left for native compilation purpose only. " +
"It takes property attributes from symbol.descriptor " +
"Please either provide property attributes or its descriptor explicitly"
)
constructor(
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
symbol: IrPropertySymbol,
name: Name
) : this(
startOffset, endOffset, origin, symbol, name,
visibility = symbol.descriptor.visibility,
modality = symbol.descriptor.modality,
isVar = symbol.descriptor.isVar,
isConst = symbol.descriptor.isConst,
isLateinit = symbol.descriptor.isLateInit,
isDelegated = symbol.descriptor.isDelegated,
isExternal = symbol.descriptor.isExternal,
isExpect = symbol.descriptor.isExpect
)
@Deprecated(message = "Don't use descriptor-based API for IrProperty", level = DeprecationLevel.WARNING)
constructor(
startOffset: Int,
endOffset: Int,
origin: IrDeclarationOrigin,
descriptor: PropertyDescriptor,
name: Name,
visibility: Visibility,
modality: Modality,
isVar: Boolean,
isConst: Boolean,
isLateinit: Boolean,
isDelegated: Boolean,
isExternal: Boolean
symbol: IrPropertySymbol = IrPropertySymbolImpl(descriptor),
name: Name = descriptor.name,
visibility: Visibility = descriptor.visibility,
modality: Modality = descriptor.modality,
isVar: Boolean = descriptor.isVar,
isConst: Boolean = descriptor.isConst,
isLateinit: Boolean = descriptor.isLateInit,
isDelegated: Boolean = descriptor.isDelegated,
isExternal: Boolean = descriptor.isExternal
) : this(
startOffset, endOffset, origin,
IrPropertySymbolImpl(descriptor),
symbol,
name, visibility, modality,
isVar = isVar,
isConst = isConst,
isLateinit = isLateinit,
isDelegated = isDelegated,
isExternal = isExternal
isExternal = isExternal,
isExpect = descriptor.isExpect
)
@Suppress("DEPRECATION")
@@ -83,7 +107,9 @@ class IrPropertyImpl(
descriptor: PropertyDescriptor
) : this(
startOffset, endOffset, origin, descriptor,
descriptor.name, descriptor.visibility, descriptor.modality,
name = descriptor.name,
visibility = descriptor.visibility,
modality = descriptor.modality,
isVar = descriptor.isVar,
isConst = descriptor.isConst,
isLateinit = descriptor.isLateInit,
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.ir.types.impl.*
import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.Variance
@@ -391,7 +392,18 @@ class IrFunctionFactory(private val irBuiltIns: IrBuiltIns, private val symbolTa
fun createFakeOverrideProperty(descriptor: PropertyDescriptor): IrProperty {
return symbolTable.declareProperty(offset, offset, memberOrigin, descriptor) {
IrPropertyImpl(offset, offset, memberOrigin, it, descriptor.name).apply {
IrPropertyImpl(
offset, offset, memberOrigin, it,
name = descriptor.name,
visibility = descriptor.visibility,
modality = descriptor.modality,
isVar = descriptor.isVar,
isConst = descriptor.isConst,
isLateinit = descriptor.isLateInit,
isDelegated = descriptor.isDelegated,
isExternal = descriptor.isEffectivelyExternal(),
isExpect = descriptor.isExpect
).apply {
parent = this@addFakeOverrides
getter = descriptor.getter?.let { g -> createFakeOverrideFunction(g, symbol) }
setter = descriptor.setter?.let { s -> createFakeOverrideFunction(s, symbol) }
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.symbols.impl.*
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DescriptorWithContainerSource
interface IrProvider {
@@ -601,7 +602,14 @@ open class SymbolTable(
propertyFactory: (IrPropertySymbol) -> IrProperty = { symbol ->
IrPropertyImpl(
startOffset, endOffset, origin, symbol, isDelegated = isDelegated,
name = nameProvider.nameForDeclaration(descriptor)
name = nameProvider.nameForDeclaration(descriptor),
visibility = descriptor.visibility,
modality = descriptor.modality,
isVar = descriptor.isVar,
isConst = descriptor.isConst,
isLateinit = descriptor.isLateInit,
isExternal = descriptor.isEffectivelyExternal(),
isExpect = descriptor.isExpect
).apply {
metadata = MetadataSource.Property(symbol.descriptor)
}
@@ -205,7 +205,7 @@ interface IrBuilderExtension {
assert(irPropertySymbol.isBound || declare)
if (declare) {
IrPropertyImpl(propertyParent.startOffset, propertyParent.endOffset, SERIALIZABLE_PLUGIN_ORIGIN, irPropertySymbol).also {
IrPropertyImpl(propertyParent.startOffset, propertyParent.endOffset, SERIALIZABLE_PLUGIN_ORIGIN, propertyDescriptor, irPropertySymbol).also {
it.parent = propertyParent
propertyParent.addMember(it)
}