From ab15a88ce45409c15cf04708a40ddbcbd0e9e211 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Mon, 18 May 2020 18:21:58 +0300 Subject: [PATCH] [IR] Unbind construction methods of IrPropertyImpl from symbol.descriptor --- .../StandaloneDeclarationGenerator.kt | 14 +++- .../ir/declarations/impl/IrPropertyImpl.kt | 68 +++++++++++++------ .../ir/descriptors/IrFunctionFactory.kt | 14 +++- .../jetbrains/kotlin/ir/util/SymbolTable.kt | 10 ++- .../compiler/backend/ir/GeneratorHelpers.kt | 2 +- 5 files changed, 83 insertions(+), 25 deletions(-) diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StandaloneDeclarationGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StandaloneDeclarationGenerator.kt index 0be3befeb7c..afcb08f00ee 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StandaloneDeclarationGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/StandaloneDeclarationGenerator.kt @@ -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) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrPropertyImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrPropertyImpl.kt index f2c6f02d9e3..64b27494109 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrPropertyImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrPropertyImpl.kt @@ -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(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, diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrFunctionFactory.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrFunctionFactory.kt index 810d5d0c2da..dca79234cea 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrFunctionFactory.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/descriptors/IrFunctionFactory.kt @@ -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) } diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt index 485e5f214f2..597c8e73772 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/util/SymbolTable.kt @@ -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) } diff --git a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt index c29fb0fbe3d..39ca31ee0f4 100644 --- a/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt +++ b/plugins/kotlin-serialization/kotlin-serialization-compiler/src/org/jetbrains/kotlinx/serialization/compiler/backend/ir/GeneratorHelpers.kt @@ -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) }