diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrProperty.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrProperty.kt index ea12e05d9c5..a41961acbd3 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrProperty.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/IrProperty.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.ir.declarations import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol +import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol interface IrProperty : IrDeclarationWithName, diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt index de1ba7f2f72..a111aafe635 100644 --- a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/declarations/impl/IrFunctionImpl.kt @@ -8,9 +8,9 @@ package org.jetbrains.kotlin.ir.declarations.impl import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibility -import org.jetbrains.kotlin.ir.declarations.IrAttributeContainer import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.carriers.FunctionCarrier +import org.jetbrains.kotlin.ir.descriptors.WrappedSimpleFunctionDescriptor import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.symbols.impl.IrSimpleFunctionSymbolImpl @@ -18,6 +18,62 @@ import org.jetbrains.kotlin.ir.types.IrType import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.name.Name +abstract class IrFunctionCommonImpl( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + name: Name, + visibility: Visibility, + override val modality: Modality, + returnType: IrType, + isInline: Boolean, + isExternal: Boolean, + override val isTailrec: Boolean, + override val isSuspend: Boolean, + override val isOperator: Boolean, + isExpect: Boolean, + override val isFakeOverride: Boolean +) : + IrFunctionBase(startOffset, endOffset, origin, name, visibility, isInline, isExternal, isExpect, returnType), + IrSimpleFunction, + FunctionCarrier { + + abstract override val descriptor: FunctionDescriptor + + override var overriddenSymbolsField: List = emptyList() + + override var overriddenSymbols: List + get() = getCarrier().overriddenSymbolsField + set(v) { + if (overriddenSymbols !== v) { + setCarrier().overriddenSymbolsField = v + } + } + + override var attributeOwnerIdField: IrAttributeContainer = this + + override var attributeOwnerId: IrAttributeContainer + get() = getCarrier().attributeOwnerIdField + set(v) { + if (attributeOwnerId !== v) { + setCarrier().attributeOwnerIdField = v + } + } + + override var correspondingPropertySymbolField: IrPropertySymbol? = null + + override var correspondingPropertySymbol: IrPropertySymbol? + get() = getCarrier().correspondingPropertySymbolField + set(v) { + if (correspondingPropertySymbol !== v) { + setCarrier().correspondingPropertySymbolField = v + } + } + + override fun accept(visitor: IrElementVisitor, data: D): R = + visitor.visitSimpleFunction(this, data) +} + class IrFunctionImpl( startOffset: Int, endOffset: Int, @@ -34,10 +90,8 @@ class IrFunctionImpl( override val isOperator: Boolean, isExpect: Boolean, override val isFakeOverride: Boolean = origin == IrDeclarationOrigin.FAKE_OVERRIDE -) : - IrFunctionBase(startOffset, endOffset, origin, name, visibility, isInline, isExternal, isExpect, returnType), - IrSimpleFunction, - FunctionCarrier { +) : IrFunctionCommonImpl(startOffset, endOffset, origin, name, visibility, modality, returnType, isInline, + isExternal, isTailrec, isSuspend, isOperator, isExpect, isFakeOverride) { constructor( startOffset: Int, @@ -75,36 +129,6 @@ class IrFunctionImpl( override val descriptor: FunctionDescriptor = symbol.descriptor - override var overriddenSymbolsField: List = emptyList() - - override var overriddenSymbols: List - get() = getCarrier().overriddenSymbolsField - set(v) { - if (overriddenSymbols !== v) { - setCarrier().overriddenSymbolsField = v - } - } - - override var attributeOwnerIdField: IrAttributeContainer = this - - override var attributeOwnerId: IrAttributeContainer - get() = getCarrier().attributeOwnerIdField - set(v) { - if (attributeOwnerId !== v) { - setCarrier().attributeOwnerIdField = v - } - } - - override var correspondingPropertySymbolField: IrPropertySymbol? = null - - override var correspondingPropertySymbol: IrPropertySymbol? - get() = getCarrier().correspondingPropertySymbolField - set(v) { - if (correspondingPropertySymbol !== v) { - setCarrier().correspondingPropertySymbolField = v - } - } - init { symbol.bind(this) } @@ -112,3 +136,37 @@ class IrFunctionImpl( override fun accept(visitor: IrElementVisitor, data: D): R = visitor.visitSimpleFunction(this, data) } + +class IrFakeOverrideFunctionImpl( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + name: Name, + override var visibility: Visibility, + override var modality: Modality, + returnType: IrType, + isInline: Boolean, + isExternal: Boolean, + isTailrec: Boolean, + isSuspend: Boolean, + isOperator: Boolean, + isExpect: Boolean +) : IrFunctionCommonImpl(startOffset, endOffset, origin, name, visibility, modality, returnType, isInline, + isExternal, isTailrec, isSuspend, isOperator, isExpect, + isFakeOverride = true) +{ + private var _symbol: IrSimpleFunctionSymbol? = null + + override val symbol: IrSimpleFunctionSymbol + get() = _symbol ?: error("$this has not acquired a symbol yet") + + override val descriptor get() = + _symbol?.descriptor ?: WrappedSimpleFunctionDescriptor() + + fun acquireSymbol(symbol: IrSimpleFunctionSymbol) { + assert(_symbol == null) { "$this already has symbol _symbol" } + _symbol = symbol + symbol.bind(this) + (symbol.descriptor as? WrappedSimpleFunctionDescriptor)?.bind(this) + } +} 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 92fa0eb65e6..1719d6bc326 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 @@ -16,18 +16,99 @@ package org.jetbrains.kotlin.ir.declarations.impl +import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.PropertyDescriptor import org.jetbrains.kotlin.descriptors.Visibility import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.carriers.PropertyCarrier +import org.jetbrains.kotlin.ir.descriptors.WrappedPropertyDescriptor import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol +import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol import org.jetbrains.kotlin.ir.symbols.impl.IrPropertySymbolImpl import org.jetbrains.kotlin.ir.visitors.IrElementTransformer import org.jetbrains.kotlin.ir.visitors.IrElementVisitor import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.resolve.descriptorUtil.isEffectivelyExternal +abstract class IrPropertyCommonImpl( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + 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, + override val isFakeOverride: Boolean = origin == IrDeclarationOrigin.FAKE_OVERRIDE +) : IrDeclarationBase(startOffset, endOffset, origin), + IrProperty, + PropertyCarrier { + + abstract override val descriptor: PropertyDescriptor + + override var backingFieldField: IrField? = null + + override var backingField: IrField? + get() = getCarrier().backingFieldField + set(v) { + if (backingField !== v) { + setCarrier().backingFieldField = v + } + } + + override var getterField: IrSimpleFunction? = null + + override var getter: IrSimpleFunction? + get() = getCarrier().getterField + set(v) { + if (getter !== v) { + setCarrier().getterField = v + } + } + + override var setterField: IrSimpleFunction? = null + + override var setter: IrSimpleFunction? + get() = getCarrier().setterField + set(v) { + if (setter !== v) { + setCarrier().setterField = v + } + } + + + override fun accept(visitor: IrElementVisitor, data: D): R { + return visitor.visitProperty(this, data) + } + + override fun acceptChildren(visitor: IrElementVisitor, data: D) { + backingField?.accept(visitor, data) + getter?.accept(visitor, data) + setter?.accept(visitor, data) + } + + override var metadataField: MetadataSource? = null + + override var metadata: MetadataSource? + get() = getCarrier().metadataField + set(v) { + if (metadata !== v) { + setCarrier().metadataField = v + } + } + + override fun transformChildren(transformer: IrElementTransformer, data: D) { + backingField = backingField?.transform(transformer, data) as? IrField + getter = getter?.run { transform(transformer, data) as IrSimpleFunction } + setter = setter?.run { transform(transformer, data) as IrSimpleFunction } + } +} + class IrPropertyImpl( startOffset: Int, endOffset: Int, @@ -43,9 +124,7 @@ class IrPropertyImpl( override val isExternal: Boolean, override val isExpect: Boolean = false, override val isFakeOverride: Boolean = origin == IrDeclarationOrigin.FAKE_OVERRIDE -) : IrDeclarationBase(startOffset, endOffset, origin), - IrProperty, - PropertyCarrier { +) : IrPropertyCommonImpl(startOffset, endOffset, origin, name, visibility, modality, isVar, isConst, isLateinit, isDelegated, isExternal, isExpect, isFakeOverride) { @Deprecated(message = "Don't use descriptor-based API for IrProperty", level = DeprecationLevel.WARNING) constructor( @@ -135,63 +214,37 @@ class IrPropertyImpl( init { symbol.bind(this) } - override val descriptor: PropertyDescriptor = symbol.descriptor +} - override var backingFieldField: IrField? = null +class IrFakeOverridePropertyImpl( + startOffset: Int, + endOffset: Int, + origin: IrDeclarationOrigin, + name: Name, + override var visibility: Visibility, + override var modality: Modality, + isVar: Boolean, + isConst: Boolean, + isLateinit: Boolean, + isDelegated: Boolean, + isExternal: Boolean, + isExpect: Boolean, +) : IrPropertyCommonImpl(startOffset, endOffset, origin, name, visibility, modality, isVar, isConst, isLateinit, + isDelegated, isExternal, isExpect, isFakeOverride = true) +{ + private var _symbol: IrPropertySymbol? = null - override var backingField: IrField? - get() = getCarrier().backingFieldField - set(v) { - if (backingField !== v) { - setCarrier().backingFieldField = v - } - } + override val symbol: IrPropertySymbol + get() = _symbol ?: error("$this has not acquired a symbol yet") - override var getterField: IrSimpleFunction? = null + override val descriptor get() = + _symbol?.descriptor ?: WrappedPropertyDescriptor() - override var getter: IrSimpleFunction? - get() = getCarrier().getterField - set(v) { - if (getter !== v) { - setCarrier().getterField = v - } - } - - override var setterField: IrSimpleFunction? = null - - override var setter: IrSimpleFunction? - get() = getCarrier().setterField - set(v) { - if (setter !== v) { - setCarrier().setterField = v - } - } - - - override fun accept(visitor: IrElementVisitor, data: D): R { - return visitor.visitProperty(this, data) - } - - override fun acceptChildren(visitor: IrElementVisitor, data: D) { - backingField?.accept(visitor, data) - getter?.accept(visitor, data) - setter?.accept(visitor, data) - } - - override var metadataField: MetadataSource? = null - - override var metadata: MetadataSource? - get() = getCarrier().metadataField - set(v) { - if (metadata !== v) { - setCarrier().metadataField = v - } - } - - override fun transformChildren(transformer: IrElementTransformer, data: D) { - backingField = backingField?.transform(transformer, data) as? IrField - getter = getter?.run { transform(transformer, data) as IrSimpleFunction } - setter = setter?.run { transform(transformer, data) as IrSimpleFunction } + fun acquireSymbol(symbol: IrPropertySymbol) { + assert(_symbol == null) { "$this already has symbol _symbol" } + _symbol = symbol + symbol.bind(this) + (symbol.descriptor as? WrappedPropertyDescriptor)?.bind(this) } }