[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.endOffsetOrUndefined
import org.jetbrains.kotlin.psi2ir.startOffsetOrUndefined import org.jetbrains.kotlin.psi2ir.startOffsetOrUndefined
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
class StandaloneDeclarationGenerator(private val context: GeneratorContext) { 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 { 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) 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.name.Name
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal
@Suppress("DEPRECATION_ERROR")
class IrPropertyImpl( class IrPropertyImpl(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
override val symbol: IrPropertySymbol, override val symbol: IrPropertySymbol,
override val name: Name = symbol.descriptor.name, override val name: Name,
override val visibility: Visibility = symbol.descriptor.visibility, override val visibility: Visibility,
override val modality: Modality = symbol.descriptor.modality, override val modality: Modality,
override val isVar: Boolean = symbol.descriptor.isVar, override val isVar: Boolean,
override val isConst: Boolean = symbol.descriptor.isConst, override val isConst: Boolean,
override val isLateinit: Boolean = symbol.descriptor.isLateInit, override val isLateinit: Boolean,
override val isDelegated: Boolean = @Suppress("DEPRECATION") symbol.descriptor.isDelegated, override val isDelegated: Boolean,
override val isExternal: Boolean = symbol.descriptor.isEffectivelyExternal(), override val isExternal: Boolean,
override val isExpect: Boolean = symbol.descriptor.isExpect, override val isExpect: Boolean = false,
override val isFakeOverride: Boolean = origin == IrDeclarationOrigin.FAKE_OVERRIDE override val isFakeOverride: Boolean = origin == IrDeclarationOrigin.FAKE_OVERRIDE
) : IrDeclarationBase<PropertyCarrier>(startOffset, endOffset, origin), ) : IrDeclarationBase<PropertyCarrier>(startOffset, endOffset, origin),
IrProperty, IrProperty,
PropertyCarrier { 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) @Deprecated(message = "Don't use descriptor-based API for IrProperty", level = DeprecationLevel.WARNING)
constructor( constructor(
startOffset: Int, startOffset: Int,
endOffset: Int, endOffset: Int,
origin: IrDeclarationOrigin, origin: IrDeclarationOrigin,
descriptor: PropertyDescriptor, descriptor: PropertyDescriptor,
name: Name, symbol: IrPropertySymbol = IrPropertySymbolImpl(descriptor),
visibility: Visibility, name: Name = descriptor.name,
modality: Modality, visibility: Visibility = descriptor.visibility,
isVar: Boolean, modality: Modality = descriptor.modality,
isConst: Boolean, isVar: Boolean = descriptor.isVar,
isLateinit: Boolean, isConst: Boolean = descriptor.isConst,
isDelegated: Boolean, isLateinit: Boolean = descriptor.isLateInit,
isExternal: Boolean isDelegated: Boolean = descriptor.isDelegated,
isExternal: Boolean = descriptor.isExternal
) : this( ) : this(
startOffset, endOffset, origin, startOffset, endOffset, origin,
IrPropertySymbolImpl(descriptor), symbol,
name, visibility, modality, name, visibility, modality,
isVar = isVar, isVar = isVar,
isConst = isConst, isConst = isConst,
isLateinit = isLateinit, isLateinit = isLateinit,
isDelegated = isDelegated, isDelegated = isDelegated,
isExternal = isExternal isExternal = isExternal,
isExpect = descriptor.isExpect
) )
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
@@ -83,7 +107,9 @@ class IrPropertyImpl(
descriptor: PropertyDescriptor descriptor: PropertyDescriptor
) : this( ) : this(
startOffset, endOffset, origin, descriptor, startOffset, endOffset, origin, descriptor,
descriptor.name, descriptor.visibility, descriptor.modality, name = descriptor.name,
visibility = descriptor.visibility,
modality = descriptor.modality,
isVar = descriptor.isVar, isVar = descriptor.isVar,
isConst = descriptor.isConst, isConst = descriptor.isConst,
isLateinit = descriptor.isLateInit, isLateinit = descriptor.isLateInit,
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.ir.types.impl.*
import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.util.*
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal
import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter import org.jetbrains.kotlin.resolve.scopes.DescriptorKindFilter
import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.Variance import org.jetbrains.kotlin.types.Variance
@@ -391,7 +392,18 @@ class IrFunctionFactory(private val irBuiltIns: IrBuiltIns, private val symbolTa
fun createFakeOverrideProperty(descriptor: PropertyDescriptor): IrProperty { fun createFakeOverrideProperty(descriptor: PropertyDescriptor): IrProperty {
return symbolTable.declareProperty(offset, offset, memberOrigin, descriptor) { 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 parent = this@addFakeOverrides
getter = descriptor.getter?.let { g -> createFakeOverrideFunction(g, symbol) } getter = descriptor.getter?.let { g -> createFakeOverrideFunction(g, symbol) }
setter = descriptor.setter?.let { s -> createFakeOverrideFunction(s, 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.*
import org.jetbrains.kotlin.ir.symbols.impl.* import org.jetbrains.kotlin.ir.symbols.impl.*
import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DescriptorWithContainerSource import org.jetbrains.kotlin.serialization.deserialization.descriptors.DescriptorWithContainerSource
interface IrProvider { interface IrProvider {
@@ -601,7 +602,14 @@ open class SymbolTable(
propertyFactory: (IrPropertySymbol) -> IrProperty = { symbol -> propertyFactory: (IrPropertySymbol) -> IrProperty = { symbol ->
IrPropertyImpl( IrPropertyImpl(
startOffset, endOffset, origin, symbol, isDelegated = isDelegated, 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 { ).apply {
metadata = MetadataSource.Property(symbol.descriptor) metadata = MetadataSource.Property(symbol.descriptor)
} }
@@ -205,7 +205,7 @@ interface IrBuilderExtension {
assert(irPropertySymbol.isBound || declare) assert(irPropertySymbol.isBound || declare)
if (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 it.parent = propertyParent
propertyParent.addMember(it) propertyParent.addMember(it)
} }