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