IR: move containerSource from descriptor to IrFunction, IrProperty

This commit is contained in:
Georgy Bronnikov
2020-08-09 13:29:11 +03:00
parent 4669e019d1
commit 04d93dfbce
41 changed files with 178 additions and 93 deletions
@@ -367,7 +367,7 @@ class Fir2IrDeclarationStorage(
): IrSimpleFunction {
if (signature == null) {
val descriptor =
if (containerSource != null) WrappedFunctionDescriptorWithContainerSource(containerSource)
if (containerSource != null) WrappedFunctionDescriptorWithContainerSource()
else WrappedSimpleFunctionDescriptor()
return symbolTable.declareSimpleFunction(descriptor, factory).apply { descriptor.bind(this) }
}
@@ -411,7 +411,8 @@ class Fir2IrDeclarationStorage(
isExpect = simpleFunction?.isExpect == true,
isFakeOverride = updatedOrigin == IrDeclarationOrigin.FAKE_OVERRIDE,
isOperator = simpleFunction?.isOperator == true,
isInfix = simpleFunction?.isInfix == true
isInfix = simpleFunction?.isInfix == true,
containerSource = simpleFunction?.containerSource,
).apply {
metadata = FirMetadataSource.Function(function)
convertAnnotationsFromLibrary(function)
@@ -522,9 +523,11 @@ class Fir2IrDeclarationStorage(
): IrSimpleFunction {
val prefix = if (isSetter) "set" else "get"
val signature = if (isLocal) null else signatureComposer.composeAccessorSignature(property, isSetter)
val containerSource =
(correspondingProperty.descriptor as? WrappedPropertyDescriptorWithContainerSource)?.containerSource
return declareIrAccessor(
signature,
(correspondingProperty.descriptor as? WrappedPropertyDescriptorWithContainerSource)?.containerSource,
containerSource,
isGetter = !isSetter
) { symbol ->
val accessorReturnType = if (isSetter) irBuiltIns.unitType else propertyType
@@ -535,9 +538,10 @@ class Fir2IrDeclarationStorage(
correspondingProperty.modality, accessorReturnType,
isInline = propertyAccessor?.isInline == true,
isExternal = propertyAccessor?.isExternal == true,
isTailrec = false, isSuspend = false, isExpect = false,
isFakeOverride = origin == IrDeclarationOrigin.FAKE_OVERRIDE,
isOperator = false, isInfix = false
isTailrec = false, isSuspend = false, isOperator = false,
isInfix = false,
isExpect = false, isFakeOverride = origin == IrDeclarationOrigin.FAKE_OVERRIDE,
containerSource = containerSource,
).apply {
correspondingPropertySymbol = correspondingProperty.symbol
if (propertyAccessor != null) {
@@ -618,7 +622,7 @@ class Fir2IrDeclarationStorage(
): IrProperty {
if (signature == null) {
val descriptor =
if (containerSource != null) WrappedPropertyDescriptorWithContainerSource(containerSource)
if (containerSource != null) WrappedPropertyDescriptorWithContainerSource()
else WrappedPropertyDescriptor()
return symbolTable.declareProperty(0, 0, IrDeclarationOrigin.DEFINED, descriptor, isDelegated = false, factory).apply {
descriptor.bind(this)
@@ -647,7 +651,8 @@ class Fir2IrDeclarationStorage(
isDelegated = property.delegate != null,
isExternal = property.isExternal,
isExpect = property.isExpect,
isFakeOverride = origin == IrDeclarationOrigin.FAKE_OVERRIDE
isFakeOverride = origin == IrDeclarationOrigin.FAKE_OVERRIDE,
containerSource = property.containerSource,
).apply {
metadata = FirMetadataSource.Variable(property)
convertAnnotationsFromLibrary(property)
@@ -237,8 +237,8 @@ class DataClassMembersGenerator(val components: Fir2IrComponents) {
return components.declarationStorage.declareIrSimpleFunction(signature, null) { symbol ->
components.irFactory.createFunction(
UNDEFINED_OFFSET, UNDEFINED_OFFSET, origin, symbol, name, Visibilities.PUBLIC, Modality.OPEN, returnType,
isInline = false, isExternal = false, isTailrec = false, isSuspend = false, isExpect = false,
isFakeOverride = false, isOperator = false, isInfix = false,
isInline = false, isExternal = false, isTailrec = false, isSuspend = false, isOperator = false,
isInfix = false, isExpect = false, isFakeOverride = false,
).apply {
if (otherParameterNeeded) {
val irValueParameter = createSyntheticIrParameter(
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.parentClassOrNull
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
class Fir2IrLazyConstructor(
components: Fir2IrComponents,
@@ -109,6 +110,9 @@ class Fir2IrLazyConstructor(
get() = null
set(_) = error("We should never need to store metadata of external declarations.")
override val containerSource: DeserializedContainerSource?
get() = fir.containerSource
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R {
return visitor.visitConstructor(this, data)
}
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.ir.types.IrErrorType
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.isInterface
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
class Fir2IrLazyProperty(
components: Fir2IrComponents,
@@ -149,4 +150,7 @@ class Fir2IrLazyProperty(
override var metadata: MetadataSource?
get() = null
set(_) = error("We should never need to store metadata of external declarations.")
override val containerSource: DeserializedContainerSource?
get() = fir.containerSource
}
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
class Fir2IrLazySimpleFunction(
components: Fir2IrComponents,
@@ -137,4 +138,7 @@ class Fir2IrLazySimpleFunction(
override var metadata: MetadataSource?
get() = null
set(_) = error("We should never need to store metadata of external declarations.")
override val containerSource: DeserializedContainerSource?
get() = fir.containerSource
}
@@ -45,7 +45,7 @@ abstract class Fir2IrBindableSymbol<out D : DeclarationDescriptor, B : IrSymbolO
is IrConstructor -> WrappedClassConstructorDescriptor().apply { bind(owner) }
is IrSimpleFunction -> when {
containerSource != null ->
WrappedFunctionDescriptorWithContainerSource(containerSource)
WrappedFunctionDescriptorWithContainerSource()
owner.name.isSpecial && owner.name.asString().startsWith(GETTER_PREFIX) ->
WrappedPropertyGetterDescriptor(Annotations.EMPTY, SourceElement.NO_SOURCE)
owner.name.isSpecial && owner.name.asString().startsWith(SETTER_PREFIX) ->
@@ -57,7 +57,7 @@ abstract class Fir2IrBindableSymbol<out D : DeclarationDescriptor, B : IrSymbolO
is IrValueParameter -> WrappedValueParameterDescriptor().apply { bind(owner) }
is IrTypeParameter -> WrappedTypeParameterDescriptor().apply { bind(owner) }
is IrProperty -> if (containerSource != null) {
WrappedPropertyDescriptorWithContainerSource(containerSource)
WrappedPropertyDescriptorWithContainerSource()
} else {
WrappedPropertyDescriptor()
}.apply { bind(owner) }
@@ -508,7 +508,7 @@ fun IrFactory.createStaticFunctionWithReceivers(
typeParametersFromContext: List<IrTypeParameter> = listOf()
): IrSimpleFunction {
val descriptor = (oldFunction.descriptor as? DescriptorWithContainerSource)?.let {
WrappedFunctionDescriptorWithContainerSource(it.containerSource)
WrappedFunctionDescriptorWithContainerSource()
} ?: WrappedSimpleFunctionDescriptor(Annotations.EMPTY, oldFunction.descriptor.source)
return createFunction(
oldFunction.startOffset, oldFunction.endOffset,
@@ -525,7 +525,8 @@ fun IrFactory.createStaticFunctionWithReceivers(
isExpect = oldFunction.isExpect,
isFakeOverride = isFakeOverride,
isOperator = oldFunction is IrSimpleFunction && oldFunction.isOperator,
isInfix = oldFunction is IrSimpleFunction && oldFunction.isInfix
isInfix = oldFunction is IrSimpleFunction && oldFunction.isInfix,
containerSource = oldFunction.containerSource,
).apply {
descriptor.bind(this)
parent = irParent
@@ -537,7 +537,7 @@ private fun IrFunction.generateDefaultsFunctionImpl(
visibility = newVisibility
}
is IrSimpleFunction ->
factory.buildFun(descriptor) {
factory.buildFun {
updateFrom(this@generateDefaultsFunctionImpl)
name = Name.identifier("${this@generateDefaultsFunctionImpl.name}\$default")
origin = newOrigin
@@ -595,7 +595,7 @@ class LocalDeclarationsLowering(
// TODO: consider using fields to access the closure of enclosing class.
val (capturedValues, capturedTypeParameters) = localFunctionContext.closure
val newDeclaration = context.irFactory.buildFun(oldDeclaration.descriptor) {
val newDeclaration = context.irFactory.buildFun {
updateFrom(oldDeclaration)
name = newName
visibility = Visibilities.PRIVATE
@@ -694,7 +694,7 @@ class LocalDeclarationsLowering(
val localClassContext = localClasses[oldDeclaration.parent]!!
val capturedValues = localClassContext.closure.capturedValues
val newDeclaration = context.irFactory.buildConstructor(oldDeclaration.descriptor) {
val newDeclaration = context.irFactory.buildConstructor {
updateFrom(oldDeclaration)
visibility = visibilityPolicy.forConstructor(oldDeclaration, constructorContext.inInlineFunctionScope)
returnType = oldDeclaration.returnType
@@ -10,6 +10,8 @@ import org.jetbrains.kotlin.backend.common.ir.copyTo
import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.declarations.impl.IrVariableImpl
import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyFunction
import org.jetbrains.kotlin.ir.declarations.lazy.IrLazyProperty
import org.jetbrains.kotlin.ir.descriptors.*
import org.jetbrains.kotlin.ir.symbols.impl.*
import org.jetbrains.kotlin.ir.types.IrType
@@ -74,32 +76,30 @@ fun IrClass.addField(fieldName: String, fieldType: IrType, fieldVisibility: Visi
addField(Name.identifier(fieldName), fieldType, fieldVisibility)
@PublishedApi
internal fun IrFactory.buildProperty(
builder: IrPropertyBuilder,
originalDescriptor: PropertyDescriptor? = null
): IrProperty = with(builder) {
val wrappedDescriptor = when (originalDescriptor) {
is DescriptorWithContainerSource -> WrappedPropertyDescriptorWithContainerSource(originalDescriptor.containerSource)
else -> WrappedPropertyDescriptor()
}
internal fun IrFactory.buildProperty(builder: IrPropertyBuilder): IrProperty = with(builder) {
val wrappedDescriptor = if (originalDeclaration is IrLazyProperty || containerSource != null)
WrappedPropertyDescriptorWithContainerSource()
else WrappedPropertyDescriptor()
createProperty(
startOffset, endOffset, origin,
IrPropertySymbolImpl(wrappedDescriptor),
name, visibility, modality,
isVar, isConst, isLateinit, isDelegated, isExternal, isExpect, isFakeOverride
isVar, isConst, isLateinit, isDelegated, isExternal, isExpect, isFakeOverride,
containerSource,
).also {
wrappedDescriptor.bind(it)
}
}
inline fun IrFactory.buildProperty(originalDescriptor: PropertyDescriptor? = null, builder: IrPropertyBuilder.() -> Unit) =
inline fun IrFactory.buildProperty(builder: IrPropertyBuilder.() -> Unit) =
IrPropertyBuilder().run {
builder()
buildProperty(this, originalDescriptor)
buildProperty(this)
}
inline fun IrClass.addProperty(originalDescriptor: PropertyDescriptor? = null, builder: IrPropertyBuilder.() -> Unit): IrProperty =
factory.buildProperty(originalDescriptor, builder).also { property ->
inline fun IrClass.addProperty(builder: IrPropertyBuilder.() -> Unit): IrProperty =
factory.buildProperty(builder).also { property ->
declarations.add(property)
property.parent = this@addProperty
}
@@ -116,57 +116,44 @@ inline fun IrProperty.addGetter(builder: IrFunctionBuilder.() -> Unit = {}): IrS
}
@PublishedApi
internal fun IrFactory.buildFunction(
builder: IrFunctionBuilder,
originalDescriptor: FunctionDescriptor? = null
): IrSimpleFunction = with(builder) {
// Inlining relies on descriptors for external declarations. When replacing a potentially external function (e.g. in an IrCall),
// we have to ensure that we keep information from the original descriptor so as not to break inlining.
val wrappedDescriptor = when (originalDescriptor) {
is DescriptorWithContainerSource -> WrappedFunctionDescriptorWithContainerSource(originalDescriptor.containerSource)
is PropertyGetterDescriptor -> WrappedPropertyGetterDescriptor(originalDescriptor.annotations, originalDescriptor.source)
is PropertySetterDescriptor -> WrappedPropertySetterDescriptor(originalDescriptor.annotations, originalDescriptor.source)
null -> WrappedSimpleFunctionDescriptor()
else -> WrappedSimpleFunctionDescriptor(originalDescriptor)
}
internal fun IrFactory.buildFunction(builder: IrFunctionBuilder): IrSimpleFunction = with(builder) {
val wrappedDescriptor = if (originalDeclaration is IrLazyFunction || containerSource != null)
WrappedFunctionDescriptorWithContainerSource()
else WrappedSimpleFunctionDescriptor()
createFunction(
startOffset, endOffset, origin,
IrSimpleFunctionSymbolImpl(wrappedDescriptor),
name, visibility, modality, returnType,
isInline, isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect, isFakeOverride
isInline, isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect, isFakeOverride,
containerSource,
).also {
wrappedDescriptor.bind(it)
}
}
@PublishedApi
internal fun IrFactory.buildConstructor(
builder: IrFunctionBuilder, originalDescriptor: ConstructorDescriptor?
): IrConstructor = with(builder) {
val wrappedDescriptor =
if (originalDescriptor != null) WrappedClassConstructorDescriptor(originalDescriptor.annotations, originalDescriptor.source)
else WrappedClassConstructorDescriptor()
internal fun IrFactory.buildConstructor(builder: IrFunctionBuilder): IrConstructor = with(builder) {
val wrappedDescriptor = WrappedClassConstructorDescriptor()
return createConstructor(
startOffset, endOffset, origin,
IrConstructorSymbolImpl(wrappedDescriptor),
Name.special("<init>"),
visibility, returnType,
isInline = isInline, isExternal = isExternal, isPrimary = isPrimary, isExpect = isExpect
isInline = isInline, isExternal = isExternal, isPrimary = isPrimary, isExpect = isExpect,
containerSource = containerSource
).also {
wrappedDescriptor.bind(it)
}
}
inline fun IrFactory.buildFun(
originalDescriptor: FunctionDescriptor? = null, builder: IrFunctionBuilder.() -> Unit
): IrSimpleFunction =
inline fun IrFactory.buildFun(builder: IrFunctionBuilder.() -> Unit): IrSimpleFunction =
IrFunctionBuilder().run {
builder()
buildFunction(this, originalDescriptor)
buildFunction(this)
}
inline fun IrFactory.addFunction(klass: IrDeclarationContainer, builder: IrFunctionBuilder.() -> Unit): IrSimpleFunction =
buildFun(null, builder).also { function ->
buildFun(builder).also { function ->
klass.declarations.add(function)
function.parent = klass
}
@@ -198,13 +185,10 @@ fun IrClass.addFunction(
}
}
inline fun IrFactory.buildConstructor(
originalDescriptor: ConstructorDescriptor? = null,
builder: IrFunctionBuilder.() -> Unit
): IrConstructor =
inline fun IrFactory.buildConstructor(builder: IrFunctionBuilder.() -> Unit): IrConstructor =
IrFunctionBuilder().run {
builder()
buildConstructor(this, originalDescriptor)
buildConstructor(this)
}
inline fun IrClass.addConstructor(builder: IrFunctionBuilder.() -> Unit = {}): IrConstructor =
@@ -309,7 +309,7 @@ class CallableReferenceLowering(private val context: CommonBackendContext) : Bod
val superProperty = superFunctionInterface.declarations.filterIsInstance<IrProperty>().single()
val supperGetter = superProperty.getter ?: error("Expected getter for KFunction.name property")
val nameProperty = clazz.addProperty {
val nameProperty = clazz.addProperty() {
visibility = superProperty.visibility
name = superProperty.name
origin = GENERATED_MEMBER_IN_CALLABLE_REFERENCE
@@ -75,7 +75,7 @@ class JsInnerClassesSupport(mapping: JsMapping, private val irFactory: IrFactory
val irClass = oldConstructor.parent as IrClass
val outerThisType = (irClass.parent as IrClass).defaultType
val newConstructor = irFactory.buildConstructor(oldConstructor.descriptor) {
val newConstructor = irFactory.buildConstructor {
updateFrom(oldConstructor)
returnType = oldConstructor.returnType
}.also {
@@ -203,7 +203,7 @@ class JvmCachedDeclarations(
defaultImplsRedirections.getOrPut(fakeOverride) {
assert(fakeOverride.isFakeOverride)
val irClass = fakeOverride.parentAsClass
context.irFactory.buildFun(fakeOverride.descriptor) {
context.irFactory.buildFun {
origin = JvmLoweredDeclarationOrigin.DEFAULT_IMPLS_BRIDGE
name = fakeOverride.name
visibility = fakeOverride.visibility
@@ -444,7 +444,7 @@ class JvmSymbols(
}
val receiverFieldName = Name.identifier("receiver")
klass.addProperty {
klass.addProperty() {
name = receiverFieldName
}.apply {
backingField = irFactory.buildField {
@@ -570,7 +570,7 @@ class JvmSymbols(
collectionToArrayClass.functions.single { it.owner.name.asString() == "toArray" && it.owner.valueParameters.size == 2 }
val kClassJava: IrPropertySymbol =
irFactory.buildProperty {
irFactory.buildProperty() {
name = Name.identifier("java")
}.apply {
parent = kotlinJvmPackage
@@ -320,7 +320,7 @@ fun IrSimpleFunction.copyCorrespondingPropertyFrom(source: IrSimpleFunction) {
val property = source.correspondingPropertySymbol?.owner ?: return
val target = this
correspondingPropertySymbol = factory.buildProperty(property.symbol.descriptor) {
correspondingPropertySymbol = factory.buildProperty() {
name = property.name
updateFrom(property)
}.apply {
@@ -597,7 +597,8 @@ private class AddContinuationLowering(private val context: JvmBackendContext) :
if (function.body == null || !function.hasContinuation()) return result
if (flag.capturesCrossinline || function.isInline) {
result += context.irFactory.buildFun(view.descriptor) {
result += context.irFactory.buildFun {
containerSource = view.containerSource
name = Name.identifier(view.name.asString() + FOR_INLINE_SUFFIX)
returnType = view.returnType
modality = view.modality
@@ -665,7 +666,7 @@ internal fun IrFunction.suspendFunctionOriginal(): IrFunction =
private fun IrFunction.createSuspendFunctionStub(context: JvmBackendContext): IrFunction {
require(this.isSuspend && this is IrSimpleFunction)
return factory.buildFun(descriptor) {
return factory.buildFun {
updateFrom(this@createSuspendFunctionStub)
name = this@createSuspendFunctionStub.name
origin = this@createSuspendFunctionStub.origin
@@ -63,7 +63,7 @@ class JvmInnerClassesSupport(private val irFactory: IrFactory) : InnerClassesSup
}
private fun createInnerClassConstructorWithOuterThisParameter(oldConstructor: IrConstructor): IrConstructor =
irFactory.buildConstructor(oldConstructor.descriptor) {
irFactory.buildConstructor {
updateFrom(oldConstructor)
returnType = oldConstructor.returnType
}.apply {
@@ -117,7 +117,7 @@ private class JvmOverloadsAnnotationLowering(val context: JvmBackendContext) : C
private fun IrFactory.generateWrapperHeader(oldFunction: IrFunction, numDefaultParametersToExpect: Int): IrFunction {
val res = when (oldFunction) {
is IrConstructor -> {
buildConstructor(oldFunction.descriptor) {
buildConstructor {
origin = JvmLoweredDeclarationOrigin.JVM_OVERLOADS_WRAPPER
name = oldFunction.name
visibility = oldFunction.visibility
@@ -125,7 +125,7 @@ private class JvmOverloadsAnnotationLowering(val context: JvmBackendContext) : C
isInline = oldFunction.isInline
}
}
is IrSimpleFunction -> buildFun(oldFunction.descriptor) {
is IrSimpleFunction -> buildFun {
origin = JvmLoweredDeclarationOrigin.JVM_OVERLOADS_WRAPPER
name = oldFunction.name
visibility = oldFunction.visibility
@@ -192,7 +192,7 @@ private class MakeCallsStatic(
}
private fun IrSimpleFunction.copyRemovingDispatchReceiver(): IrSimpleFunction =
factory.buildFun(descriptor) {
factory.buildFun {
updateFrom(this@copyRemovingDispatchReceiver)
name = this@copyRemovingDispatchReceiver.name
returnType = this@copyRemovingDispatchReceiver.returnType
@@ -107,7 +107,7 @@ private class MoveOrCopyCompanionObjectFieldsLowering(val context: JvmBackendCon
}
private fun copyConstProperty(oldProperty: IrProperty, newParent: IrClass): IrProperty =
newParent.addProperty {
newParent.addProperty() {
updateFrom(oldProperty)
name = oldProperty.name
isConst = true
@@ -184,7 +184,7 @@ class MemoizedInlineClassReplacements(private val mangleReturnTypes: Boolean, pr
replacementOrigin: IrDeclarationOrigin,
noFakeOverride: Boolean = false,
body: IrFunction.() -> Unit
): IrSimpleFunction = irFactory.buildFun(function.descriptor) {
): IrSimpleFunction = irFactory.buildFun {
updateFrom(function)
if (function is IrConstructor) {
// The [updateFrom] call will set the modality to FINAL for constructors, while the JVM backend would use OPEN here.
@@ -216,7 +216,7 @@ class MemoizedInlineClassReplacements(private val mangleReturnTypes: Boolean, pr
val propertySymbol = function.correspondingPropertySymbol
if (propertySymbol != null) {
val property = propertyMap.getOrPut(propertySymbol) {
irFactory.buildProperty(propertySymbol.descriptor) {
irFactory.buildProperty() {
name = propertySymbol.owner.name
updateFrom(propertySymbol.owner)
}.apply {
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
class IrConstructorImpl(
override val startOffset: Int,
@@ -38,6 +39,7 @@ class IrConstructorImpl(
override val isExternal: Boolean,
override val isPrimary: Boolean,
override val isExpect: Boolean,
override val containerSource: DeserializedContainerSource? = null,
) : IrConstructor() {
init {
symbol.bind(this)
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.ir.expressions.impl.IrExpressionBodyImpl
import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
import org.jetbrains.kotlin.types.Variance
object IrFactoryImpl : IrFactory {
@@ -63,8 +64,12 @@ object IrFactoryImpl : IrFactory {
isExternal: Boolean,
isPrimary: Boolean,
isExpect: Boolean,
containerSource: DeserializedContainerSource?,
): IrConstructor =
IrConstructorImpl(startOffset, endOffset, origin, symbol, name, visibility, returnType, isInline, isExternal, isPrimary, isExpect)
IrConstructorImpl(
startOffset, endOffset, origin, symbol, name, visibility, returnType, isInline, isExternal, isPrimary, isExpect,
containerSource,
)
override fun createEnumEntry(
startOffset: Int,
@@ -113,10 +118,12 @@ object IrFactoryImpl : IrFactory {
isInfix: Boolean,
isExpect: Boolean,
isFakeOverride: Boolean,
containerSource: DeserializedContainerSource?,
): IrSimpleFunction =
IrFunctionImpl(
startOffset, endOffset, origin, symbol, name, visibility, modality, returnType,
isInline, isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect, isFakeOverride,
containerSource
)
override fun createFakeOverrideFunction(
@@ -166,10 +173,12 @@ object IrFactoryImpl : IrFactory {
isExternal: Boolean,
isExpect: Boolean,
isFakeOverride: Boolean,
containerSource: DeserializedContainerSource?,
): IrProperty =
IrPropertyImpl(
startOffset, endOffset, origin, symbol, name, visibility, modality,
isVar, isConst, isLateinit, isDelegated, isExternal, isExpect, isFakeOverride,
containerSource,
)
override fun createFakeOverrideProperty(
@@ -17,6 +17,7 @@ import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
abstract class IrFunctionCommonImpl(
override val startOffset: Int,
@@ -32,6 +33,7 @@ abstract class IrFunctionCommonImpl(
override val isOperator: Boolean,
override val isInfix: Boolean,
override val isExpect: Boolean,
override val containerSource: DeserializedContainerSource?,
) : IrSimpleFunction() {
override val factory: IrFactory
get() = IrFactoryImpl
@@ -82,9 +84,11 @@ class IrFunctionImpl(
isInfix: Boolean,
isExpect: Boolean,
override val isFakeOverride: Boolean = origin == IrDeclarationOrigin.FAKE_OVERRIDE,
containerSource: DeserializedContainerSource? = null,
) : IrFunctionCommonImpl(
startOffset, endOffset, origin, name, visibility, returnType, isInline,
isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect,
containerSource,
) {
@ObsoleteDescriptorBasedAPI
override val descriptor: FunctionDescriptor
@@ -113,6 +117,7 @@ class IrFakeOverrideFunctionImpl(
) : IrFunctionCommonImpl(
startOffset, endOffset, origin, name, visibility, returnType, isInline,
isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect,
containerSource = null,
), IrFakeOverrideFunction {
override val isFakeOverride: Boolean
get() = true
@@ -25,6 +25,7 @@ import org.jetbrains.kotlin.ir.descriptors.WrappedPropertyDescriptor
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
abstract class IrPropertyCommonImpl(
override val startOffset: Int,
@@ -38,6 +39,7 @@ abstract class IrPropertyCommonImpl(
override val isDelegated: Boolean,
override val isExternal: Boolean,
override val isExpect: Boolean,
override val containerSource: DeserializedContainerSource?,
) : IrProperty() {
override val factory: IrFactory
get() = IrFactoryImpl
@@ -69,8 +71,10 @@ class IrPropertyImpl(
isExternal: Boolean,
isExpect: Boolean = false,
override val isFakeOverride: Boolean = origin == IrDeclarationOrigin.FAKE_OVERRIDE,
containerSource: DeserializedContainerSource? = null,
) : IrPropertyCommonImpl(
startOffset, endOffset, origin, name, visibility, isVar, isConst, isLateinit, isDelegated, isExternal, isExpect,
containerSource
) {
init {
symbol.bind(this)
@@ -96,6 +100,7 @@ class IrFakeOverridePropertyImpl(
isExpect: Boolean,
) : IrPropertyCommonImpl(
startOffset, endOffset, origin, name, visibility, isVar, isConst, isLateinit, isDelegated, isExternal, isExpect,
containerSource = null,
), IrFakeOverrideProperty {
override val isFakeOverride: Boolean
get() = true
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.symbols.IrConstructorSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
internal class PersistentIrConstructor(
override val startOffset: Int,
@@ -39,7 +40,8 @@ internal class PersistentIrConstructor(
override val isInline: Boolean,
override val isExternal: Boolean,
override val isPrimary: Boolean,
override val isExpect: Boolean
override val isExpect: Boolean,
override val containerSource: DeserializedContainerSource?
) : IrConstructor(),
PersistentIrDeclarationBase<ConstructorCarrier>,
ConstructorCarrier {
@@ -16,6 +16,7 @@ import org.jetbrains.kotlin.ir.expressions.persistent.PersistentIrExpressionBody
import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
import org.jetbrains.kotlin.types.Variance
object PersistentIrFactory : IrFactory {
@@ -63,9 +64,11 @@ object PersistentIrFactory : IrFactory {
isExternal: Boolean,
isPrimary: Boolean,
isExpect: Boolean,
containerSource: DeserializedContainerSource?,
): IrConstructor =
PersistentIrConstructor(
startOffset, endOffset, origin, symbol, name, visibility, returnType, isInline, isExternal, isPrimary, isExpect
startOffset, endOffset, origin, symbol, name, visibility, returnType, isInline, isExternal, isPrimary, isExpect,
containerSource,
)
override fun createEnumEntry(
@@ -115,10 +118,12 @@ object PersistentIrFactory : IrFactory {
isInfix: Boolean,
isExpect: Boolean,
isFakeOverride: Boolean,
containerSource: DeserializedContainerSource?,
): IrSimpleFunction =
PersistentIrFunction(
startOffset, endOffset, origin, symbol, name, visibility, modality, returnType,
isInline, isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect, isFakeOverride,
containerSource
)
override fun createFakeOverrideFunction(
@@ -170,10 +175,12 @@ object PersistentIrFactory : IrFactory {
isExternal: Boolean,
isExpect: Boolean,
isFakeOverride: Boolean,
containerSource: DeserializedContainerSource?,
): IrProperty =
PersistentIrProperty(
startOffset, endOffset, origin, symbol, name, visibility, modality,
isVar, isConst, isLateinit, isDelegated, isExternal, isExpect, isFakeOverride,
containerSource
)
override fun createFakeOverrideProperty(
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
import org.jetbrains.kotlin.ir.symbols.IrSimpleFunctionSymbol
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
internal abstract class PersistentIrFunctionCommon(
override val startOffset: Int,
@@ -34,6 +35,7 @@ internal abstract class PersistentIrFunctionCommon(
override val isOperator: Boolean,
override val isInfix: Boolean,
override val isExpect: Boolean,
override val containerSource: DeserializedContainerSource? = null
) : IrSimpleFunction(),
PersistentIrDeclarationBase<FunctionCarrier>,
FunctionCarrier {
@@ -189,9 +191,11 @@ internal class PersistentIrFunction(
isInfix: Boolean,
isExpect: Boolean,
override val isFakeOverride: Boolean = origin == IrDeclarationOrigin.FAKE_OVERRIDE,
containerSource: DeserializedContainerSource?
) : PersistentIrFunctionCommon(
startOffset, endOffset, origin, name, visibility, returnType, isInline,
isExternal, isTailrec, isSuspend, isOperator, isInfix, isExpect,
containerSource
) {
@ObsoleteDescriptorBasedAPI
override val descriptor: FunctionDescriptor
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.ir.descriptors.WrappedPropertyDescriptor
import org.jetbrains.kotlin.ir.expressions.IrConstructorCall
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
internal abstract class PersistentIrPropertyCommon(
override val startOffset: Int,
@@ -40,6 +41,7 @@ internal abstract class PersistentIrPropertyCommon(
override val isDelegated: Boolean,
override val isExternal: Boolean,
override val isExpect: Boolean,
override val containerSource: DeserializedContainerSource?,
) : IrProperty(),
PersistentIrDeclarationBase<PropertyCarrier>,
PropertyCarrier {
@@ -110,8 +112,10 @@ internal class PersistentIrProperty(
isExternal: Boolean,
isExpect: Boolean = false,
override val isFakeOverride: Boolean = origin == IrDeclarationOrigin.FAKE_OVERRIDE,
containerSource: DeserializedContainerSource?,
) : PersistentIrPropertyCommon(
startOffset, endOffset, origin, name, visibility, isVar, isConst, isLateinit, isDelegated, isExternal, isExpect,
containerSource,
) {
init {
symbol.bind(this)
@@ -137,7 +141,8 @@ internal class PersistentIrFakeOverrideProperty(
isExpect: Boolean,
) : PersistentIrPropertyCommon(
startOffset, endOffset, origin, name, visibility, isVar, isConst, isLateinit,
isDelegated, isExternal, isExpect
isDelegated, isExternal, isExpect,
containerSource = null,
), IrFakeOverrideProperty {
override val isFakeOverride: Boolean
get() = true
@@ -11,6 +11,7 @@ import org.jetbrains.kotlin.ir.declarations.IrFunction
import org.jetbrains.kotlin.ir.declarations.IrSimpleFunction
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.types.impl.IrUninitializedType
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
class IrFunctionBuilder : IrDeclarationBuilder() {
@@ -30,9 +31,14 @@ class IrFunctionBuilder : IrDeclarationBuilder() {
var isFakeOverride: Boolean = false
var originalDeclaration: IrFunction? = null
var containerSource: DeserializedContainerSource? = null
fun updateFrom(from: IrFunction) {
super.updateFrom(from)
containerSource = from.containerSource
isInline = from.isInline
isExternal = from.isExternal
isExpect = from.isExpect
@@ -7,6 +7,7 @@ package org.jetbrains.kotlin.ir.builders.declarations
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.ir.declarations.IrProperty
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
class IrPropertyBuilder : IrDeclarationBuilder() {
var modality: Modality = Modality.FINAL
@@ -19,6 +20,9 @@ class IrPropertyBuilder : IrDeclarationBuilder() {
var isExpect: Boolean = false
var isFakeOverride: Boolean = false
var originalDeclaration: IrProperty? = null
var containerSource: DeserializedContainerSource? = null
fun updateFrom(from: IrProperty) {
super.updateFrom(from)
@@ -29,5 +33,8 @@ class IrPropertyBuilder : IrDeclarationBuilder() {
isExternal = from.isExternal
isExpect = from.isExpect
isFakeOverride = from.isFakeOverride
originalDeclaration = from
containerSource = from.containerSource
}
}
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.ir.expressions.IrExpressionBody
import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
import org.jetbrains.kotlin.types.Variance
interface IrFactory {
@@ -55,6 +56,7 @@ interface IrFactory {
isExternal: Boolean,
isPrimary: Boolean,
isExpect: Boolean,
containerSource: DeserializedContainerSource? = null
): IrConstructor
fun createEnumEntry(
@@ -101,6 +103,7 @@ interface IrFactory {
isInfix: Boolean,
isExpect: Boolean,
isFakeOverride: Boolean = origin == IrDeclarationOrigin.FAKE_OVERRIDE,
containerSource: DeserializedContainerSource? = null,
): IrSimpleFunction
fun createFakeOverrideFunction(
@@ -145,6 +148,7 @@ interface IrFactory {
isExternal: Boolean,
isExpect: Boolean = false,
isFakeOverride: Boolean = origin == IrDeclarationOrigin.FAKE_OVERRIDE,
containerSource: DeserializedContainerSource? = null
): IrProperty
fun createFakeOverrideProperty(
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.transformIfNeeded
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
abstract class IrFunction :
IrDeclarationBase(),
@@ -48,6 +49,8 @@ abstract class IrFunction :
abstract var body: IrBody?
abstract val containerSource: DeserializedContainerSource?
override fun <D> acceptChildren(visitor: IrElementVisitor<Unit, D>, data: D) {
typeParameters.forEach { it.accept(visitor, data) }
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.ir.ObsoleteDescriptorBasedAPI
import org.jetbrains.kotlin.ir.symbols.IrPropertySymbol
import org.jetbrains.kotlin.ir.visitors.IrElementTransformer
import org.jetbrains.kotlin.ir.visitors.IrElementVisitor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
abstract class IrProperty : IrDeclarationBase(), IrOverridableMember, IrMetadataSourceOwner {
@ObsoleteDescriptorBasedAPI
@@ -39,6 +40,8 @@ abstract class IrProperty : IrDeclarationBase(), IrOverridableMember, IrMetadata
abstract var getter: IrSimpleFunction?
abstract var setter: IrSimpleFunction?
abstract val containerSource: DeserializedContainerSource?
override fun <R, D> accept(visitor: IrElementVisitor<R, D>, data: D): R =
visitor.visitProperty(this, data)
@@ -17,6 +17,8 @@ import org.jetbrains.kotlin.ir.util.DeclarationStubGenerator
import org.jetbrains.kotlin.ir.util.TypeTranslator
import org.jetbrains.kotlin.ir.util.withScope
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DescriptorWithContainerSource
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
@OptIn(ObsoleteDescriptorBasedAPI::class)
class IrLazyConstructor(
@@ -66,6 +68,9 @@ class IrLazyConstructor(
}
}
override val containerSource: DeserializedContainerSource?
get() = (descriptor as? DescriptorWithContainerSource)?.containerSource
init {
symbol.bind(this)
}
@@ -20,6 +20,8 @@ import org.jetbrains.kotlin.ir.util.TypeTranslator
import org.jetbrains.kotlin.ir.util.withScope
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.descriptorUtil.propertyIfAccessor
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DescriptorWithContainerSource
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
@OptIn(ObsoleteDescriptorBasedAPI::class)
class IrLazyFunction(
@@ -88,6 +90,9 @@ class IrLazyFunction(
override var correspondingPropertySymbol: IrPropertySymbol? = null
override val containerSource: DeserializedContainerSource?
get() = (descriptor as? DescriptorWithContainerSource)?.containerSource
init {
symbol.bind(this)
}
@@ -17,6 +17,8 @@ import org.jetbrains.kotlin.ir.util.TypeTranslator
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.hasBackingField
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedPropertyDescriptor
class IrLazyProperty(
override val startOffset: Int,
@@ -70,6 +72,9 @@ class IrLazyProperty(
}
}
override val containerSource: DeserializedContainerSource?
get() = (descriptor as? DeserializedPropertyDescriptor)?.containerSource
override var metadata: MetadataSource?
get() = null
set(_) = error("We should never need to store metadata of external declarations.")
@@ -463,9 +463,10 @@ open class WrappedSimpleFunctionDescriptor(
}
@OptIn(ObsoleteDescriptorBasedAPI::class)
class WrappedFunctionDescriptorWithContainerSource(
override val containerSource: DeserializedContainerSource?
) : WrappedSimpleFunctionDescriptor(), DescriptorWithContainerSource
class WrappedFunctionDescriptorWithContainerSource : WrappedSimpleFunctionDescriptor(), DescriptorWithContainerSource {
override val containerSource
get() = owner.containerSource
}
@OptIn(ObsoleteDescriptorBasedAPI::class)
open class WrappedClassConstructorDescriptor(
@@ -883,9 +884,10 @@ open class WrappedPropertyDescriptor(
override fun <V : Any?> getUserData(key: CallableDescriptor.UserDataKey<V>?): V? = null
}
class WrappedPropertyDescriptorWithContainerSource(
override var containerSource: DeserializedContainerSource?
) : WrappedPropertyDescriptor(), DescriptorWithContainerSource
class WrappedPropertyDescriptorWithContainerSource : WrappedPropertyDescriptor(), DescriptorWithContainerSource {
override val containerSource: DeserializedContainerSource?
get() = owner.containerSource
}
@OptIn(ObsoleteDescriptorBasedAPI::class)
abstract class WrappedPropertyAccessorDescriptor(annotations: Annotations, sourceElement: SourceElement) :
@@ -163,10 +163,11 @@ open class DeepCopyIrTreeWithSymbols(
isExternal = declaration.isExternal,
isTailrec = declaration.isTailrec,
isSuspend = declaration.isSuspend,
isOperator = declaration.isOperator,
isInfix = declaration.isInfix,
isExpect = declaration.isExpect,
isFakeOverride = declaration.isFakeOverride,
isOperator = declaration.isOperator,
isInfix = declaration.isInfix
containerSource = declaration.containerSource,
).apply {
overriddenSymbols = declaration.overriddenSymbols.map {
symbolRemapper.getReferencedFunction(it) as IrSimpleFunctionSymbol
@@ -186,7 +187,8 @@ open class DeepCopyIrTreeWithSymbols(
isInline = declaration.isInline,
isExternal = declaration.isExternal,
isPrimary = declaration.isPrimary,
isExpect = declaration.isExpect
isExpect = declaration.isExpect,
containerSource = declaration.containerSource,
).apply {
transformFunctionChildren(declaration)
}
@@ -220,8 +222,9 @@ open class DeepCopyIrTreeWithSymbols(
isConst = declaration.isConst,
isLateinit = declaration.isLateinit,
isDelegated = declaration.isDelegated,
isExternal = declaration.isExternal,
isExpect = declaration.isExpect,
isExternal = declaration.isExternal
containerSource = declaration.containerSource,
).apply {
transformAnnotations(declaration)
this.backingField = declaration.backingField?.transform()?.also {
@@ -650,13 +650,13 @@ class SymbolTable(
isDelegated: Boolean = descriptor.isDelegated,
propertyFactory: (IrPropertySymbol) -> IrProperty = { symbol ->
irFactory.createProperty(
startOffset, endOffset, origin, symbol, isDelegated = isDelegated,
name = nameProvider.nameForDeclaration(descriptor),
startOffset, endOffset, origin, symbol, name = nameProvider.nameForDeclaration(descriptor),
visibility = descriptor.visibility,
modality = descriptor.modality,
isVar = descriptor.isVar,
isConst = descriptor.isConst,
isLateinit = descriptor.isLateInit,
isDelegated = isDelegated,
isExternal = descriptor.isEffectivelyExternal(),
isExpect = descriptor.isExpect
).apply {
@@ -130,7 +130,7 @@ class AndroidSymbols(
}
}.symbol
val kotlinKClassJava: IrPropertySymbol = irFactory.buildProperty {
val kotlinKClassJava: IrPropertySymbol = irFactory.buildProperty() {
name = Name.identifier("java")
}.apply {
parent = kotlinJvm