[FIR2IR] Restore container source related logic
This commit is contained in:
+22
-8
@@ -43,6 +43,7 @@ import org.jetbrains.kotlin.ir.util.*
|
||||
import org.jetbrains.kotlin.name.ClassId
|
||||
import org.jetbrains.kotlin.name.FqName
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||
|
||||
class Fir2IrDeclarationStorage(
|
||||
private val components: Fir2IrComponents,
|
||||
@@ -434,12 +435,16 @@ class Fir2IrDeclarationStorage(
|
||||
}
|
||||
}
|
||||
|
||||
private fun declareIrSimpleFunction(signature: IdSignature?, factory: (IrSimpleFunctionSymbol) -> IrSimpleFunction): IrSimpleFunction {
|
||||
private fun declareIrSimpleFunction(
|
||||
signature: IdSignature?,
|
||||
containerSource: DeserializedContainerSource?,
|
||||
factory: (IrSimpleFunctionSymbol) -> IrSimpleFunction
|
||||
): IrSimpleFunction {
|
||||
if (signature == null) {
|
||||
val descriptor = WrappedSimpleFunctionDescriptor()
|
||||
return symbolTable.declareSimpleFunction(descriptor, factory).apply { descriptor.bind(this) }
|
||||
}
|
||||
return symbolTable.declareSimpleFunction(signature, { Fir2IrSimpleFunctionSymbol(signature) }, factory)
|
||||
return symbolTable.declareSimpleFunction(signature, { Fir2IrSimpleFunctionSymbol(signature, containerSource) }, factory)
|
||||
}
|
||||
|
||||
fun createIrFunction(
|
||||
@@ -465,7 +470,7 @@ class Fir2IrDeclarationStorage(
|
||||
else simpleFunction?.isSuspend == true
|
||||
val signature = signatureComposer.composeSignature(function)
|
||||
val created = function.convertWithOffsets { startOffset, endOffset ->
|
||||
val result = declareIrSimpleFunction(signature) { symbol ->
|
||||
val result = declareIrSimpleFunction(signature, simpleFunction?.containerSource) { symbol ->
|
||||
IrFunctionImpl(
|
||||
startOffset, endOffset, updatedOrigin, symbol,
|
||||
name, visibility,
|
||||
@@ -561,6 +566,7 @@ class Fir2IrDeclarationStorage(
|
||||
|
||||
private fun declareIrAccessor(
|
||||
signature: IdSignature?,
|
||||
containerSource: DeserializedContainerSource?,
|
||||
isGetter: Boolean,
|
||||
factory: (IrSimpleFunctionSymbol) -> IrSimpleFunction
|
||||
): IrSimpleFunction {
|
||||
@@ -570,7 +576,7 @@ class Fir2IrDeclarationStorage(
|
||||
else WrappedPropertySetterDescriptor(Annotations.EMPTY, SourceElement.NO_SOURCE)
|
||||
return symbolTable.declareSimpleFunction(descriptor, factory).apply { descriptor.bind(this) }
|
||||
}
|
||||
return symbolTable.declareSimpleFunction(signature, { Fir2IrSimpleFunctionSymbol(signature) }, factory)
|
||||
return symbolTable.declareSimpleFunction(signature, { Fir2IrSimpleFunctionSymbol(signature, containerSource) }, factory)
|
||||
}
|
||||
|
||||
private fun createIrPropertyAccessor(
|
||||
@@ -587,7 +593,11 @@ class Fir2IrDeclarationStorage(
|
||||
): IrSimpleFunction {
|
||||
val prefix = if (isSetter) "set" else "get"
|
||||
val signature = signatureComposer.composeAccessorSignature(property, isSetter)
|
||||
return declareIrAccessor(signature, isGetter = !isSetter) { symbol ->
|
||||
return declareIrAccessor(
|
||||
signature,
|
||||
(correspondingProperty.descriptor as? WrappedPropertyDescriptorWithContainerSource)?.containerSource,
|
||||
isGetter = !isSetter
|
||||
) { symbol ->
|
||||
val accessorReturnType = if (isSetter) irBuiltIns.unitType else propertyType
|
||||
IrFunctionImpl(
|
||||
startOffset, endOffset, origin, symbol,
|
||||
@@ -670,14 +680,18 @@ class Fir2IrDeclarationStorage(
|
||||
else -> Visibilities.PRIVATE
|
||||
}
|
||||
|
||||
private fun declareIrProperty(signature: IdSignature?, factory: (IrPropertySymbol) -> IrProperty): IrProperty {
|
||||
private fun declareIrProperty(
|
||||
signature: IdSignature?,
|
||||
containerSource: DeserializedContainerSource?,
|
||||
factory: (IrPropertySymbol) -> IrProperty
|
||||
): IrProperty {
|
||||
if (signature == null) {
|
||||
val descriptor = WrappedPropertyDescriptor()
|
||||
return symbolTable.declareProperty(0, 0, IrDeclarationOrigin.DEFINED, descriptor, isDelegated = false, factory).apply {
|
||||
descriptor.bind(this)
|
||||
}
|
||||
}
|
||||
return symbolTable.declareProperty(signature, { Fir2IrPropertySymbol(signature) }, factory)
|
||||
return symbolTable.declareProperty(signature, { Fir2IrPropertySymbol(signature, containerSource) }, factory)
|
||||
}
|
||||
|
||||
fun createIrProperty(
|
||||
@@ -689,7 +703,7 @@ class Fir2IrDeclarationStorage(
|
||||
classifierStorage.preCacheTypeParameters(property)
|
||||
val signature = signatureComposer.composeSignature(property)
|
||||
return property.convertWithOffsets { startOffset, endOffset ->
|
||||
val result = declareIrProperty(signature) { symbol ->
|
||||
val result = declareIrProperty(signature, property.containerSource) { symbol ->
|
||||
IrPropertyImpl(
|
||||
startOffset, endOffset, origin, symbol,
|
||||
property.name, property.visibility, property.modality!!,
|
||||
|
||||
@@ -42,15 +42,14 @@ abstract class Fir2IrBindableSymbol<out D : DeclarationDescriptor, B : IrSymbolO
|
||||
is IrClass -> WrappedClassDescriptor().apply { bind(owner) }
|
||||
is IrConstructor -> WrappedClassConstructorDescriptor().apply { bind(owner) }
|
||||
is IrSimpleFunction -> when {
|
||||
owner.name.isSpecial && owner.name.asString().startsWith("get") ->
|
||||
WrappedPropertyGetterDescriptor(Annotations.EMPTY, SourceElement.NO_SOURCE)
|
||||
owner.name.isSpecial && owner.name.asString().startsWith("set") ->
|
||||
WrappedPropertySetterDescriptor(Annotations.EMPTY, SourceElement.NO_SOURCE)
|
||||
else -> if (containerSource != null) {
|
||||
containerSource != null ->
|
||||
WrappedFunctionDescriptorWithContainerSource(containerSource)
|
||||
} else {
|
||||
owner.name.isSpecial && owner.name.asString().startsWith(GETTER_PREFIX) ->
|
||||
WrappedPropertyGetterDescriptor(Annotations.EMPTY, SourceElement.NO_SOURCE)
|
||||
owner.name.isSpecial && owner.name.asString().startsWith(SETTER_PREFIX) ->
|
||||
WrappedPropertySetterDescriptor(Annotations.EMPTY, SourceElement.NO_SOURCE)
|
||||
else ->
|
||||
WrappedSimpleFunctionDescriptor()
|
||||
}
|
||||
}.apply { bind(owner) }
|
||||
is IrVariable -> WrappedVariableDescriptor().apply { bind(owner) }
|
||||
is IrValueParameter -> WrappedValueParameterDescriptor().apply { bind(owner) }
|
||||
@@ -64,4 +63,9 @@ abstract class Fir2IrBindableSymbol<out D : DeclarationDescriptor, B : IrSymbolO
|
||||
else -> throw IllegalStateException("Unsupported owner in Fir2IrBindableSymbol: $owner")
|
||||
} as D
|
||||
}
|
||||
|
||||
companion object {
|
||||
private const val GETTER_PREFIX = "<get"
|
||||
private const val SETTER_PREFIX = "<set"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.descriptors.*
|
||||
import org.jetbrains.kotlin.ir.declarations.*
|
||||
import org.jetbrains.kotlin.ir.symbols.*
|
||||
import org.jetbrains.kotlin.ir.util.IdSignature
|
||||
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||
|
||||
class Fir2IrClassSymbol(signature: IdSignature) :
|
||||
Fir2IrBindableSymbol<ClassDescriptor, IrClass>(signature),
|
||||
@@ -34,15 +35,19 @@ class Fir2IrVariableSymbol(signature: IdSignature) :
|
||||
Fir2IrBindableSymbol<VariableDescriptor, IrVariable>(signature),
|
||||
IrVariableSymbol
|
||||
|
||||
class Fir2IrSimpleFunctionSymbol(signature: IdSignature) :
|
||||
Fir2IrBindableSymbol<FunctionDescriptor, IrSimpleFunction>(signature),
|
||||
class Fir2IrSimpleFunctionSymbol(
|
||||
signature: IdSignature,
|
||||
containerSource: DeserializedContainerSource? = null
|
||||
) : Fir2IrBindableSymbol<FunctionDescriptor, IrSimpleFunction>(signature, containerSource),
|
||||
IrSimpleFunctionSymbol
|
||||
|
||||
class Fir2IrConstructorSymbol(signature: IdSignature) :
|
||||
Fir2IrBindableSymbol<ClassConstructorDescriptor, IrConstructor>(signature),
|
||||
IrConstructorSymbol
|
||||
|
||||
class Fir2IrPropertySymbol(signature: IdSignature) :
|
||||
Fir2IrBindableSymbol<PropertyDescriptor, IrProperty>(signature),
|
||||
class Fir2IrPropertySymbol(
|
||||
signature: IdSignature,
|
||||
containerSource: DeserializedContainerSource? = null
|
||||
) : Fir2IrBindableSymbol<PropertyDescriptor, IrProperty>(signature, containerSource),
|
||||
IrPropertySymbol
|
||||
|
||||
|
||||
@@ -271,7 +271,8 @@ val IrDeclarationWithName.fqNameWhenAvailable: FqName?
|
||||
}
|
||||
|
||||
val IrDeclaration.parentAsClass: IrClass
|
||||
get() = parent as? IrClass ?: error("Parent of this declaration is not a class: ${render()}")
|
||||
get() = parent as? IrClass
|
||||
?: error("Parent of this declaration is not a class: ${render()}")
|
||||
|
||||
fun IrClass.isLocalClass(): Boolean {
|
||||
var current: IrDeclarationParent? = this
|
||||
|
||||
Reference in New Issue
Block a user