[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.ClassId
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.name.Name
|
import org.jetbrains.kotlin.name.Name
|
||||||
|
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||||
|
|
||||||
class Fir2IrDeclarationStorage(
|
class Fir2IrDeclarationStorage(
|
||||||
private val components: Fir2IrComponents,
|
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) {
|
if (signature == null) {
|
||||||
val descriptor = WrappedSimpleFunctionDescriptor()
|
val descriptor = WrappedSimpleFunctionDescriptor()
|
||||||
return symbolTable.declareSimpleFunction(descriptor, factory).apply { descriptor.bind(this) }
|
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(
|
fun createIrFunction(
|
||||||
@@ -465,7 +470,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
else simpleFunction?.isSuspend == true
|
else simpleFunction?.isSuspend == true
|
||||||
val signature = signatureComposer.composeSignature(function)
|
val signature = signatureComposer.composeSignature(function)
|
||||||
val created = function.convertWithOffsets { startOffset, endOffset ->
|
val created = function.convertWithOffsets { startOffset, endOffset ->
|
||||||
val result = declareIrSimpleFunction(signature) { symbol ->
|
val result = declareIrSimpleFunction(signature, simpleFunction?.containerSource) { symbol ->
|
||||||
IrFunctionImpl(
|
IrFunctionImpl(
|
||||||
startOffset, endOffset, updatedOrigin, symbol,
|
startOffset, endOffset, updatedOrigin, symbol,
|
||||||
name, visibility,
|
name, visibility,
|
||||||
@@ -561,6 +566,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
|
|
||||||
private fun declareIrAccessor(
|
private fun declareIrAccessor(
|
||||||
signature: IdSignature?,
|
signature: IdSignature?,
|
||||||
|
containerSource: DeserializedContainerSource?,
|
||||||
isGetter: Boolean,
|
isGetter: Boolean,
|
||||||
factory: (IrSimpleFunctionSymbol) -> IrSimpleFunction
|
factory: (IrSimpleFunctionSymbol) -> IrSimpleFunction
|
||||||
): IrSimpleFunction {
|
): IrSimpleFunction {
|
||||||
@@ -570,7 +576,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
else WrappedPropertySetterDescriptor(Annotations.EMPTY, SourceElement.NO_SOURCE)
|
else WrappedPropertySetterDescriptor(Annotations.EMPTY, SourceElement.NO_SOURCE)
|
||||||
return symbolTable.declareSimpleFunction(descriptor, factory).apply { descriptor.bind(this) }
|
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(
|
private fun createIrPropertyAccessor(
|
||||||
@@ -587,7 +593,11 @@ class Fir2IrDeclarationStorage(
|
|||||||
): IrSimpleFunction {
|
): IrSimpleFunction {
|
||||||
val prefix = if (isSetter) "set" else "get"
|
val prefix = if (isSetter) "set" else "get"
|
||||||
val signature = signatureComposer.composeAccessorSignature(property, isSetter)
|
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
|
val accessorReturnType = if (isSetter) irBuiltIns.unitType else propertyType
|
||||||
IrFunctionImpl(
|
IrFunctionImpl(
|
||||||
startOffset, endOffset, origin, symbol,
|
startOffset, endOffset, origin, symbol,
|
||||||
@@ -670,14 +680,18 @@ class Fir2IrDeclarationStorage(
|
|||||||
else -> Visibilities.PRIVATE
|
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) {
|
if (signature == null) {
|
||||||
val descriptor = WrappedPropertyDescriptor()
|
val descriptor = 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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return symbolTable.declareProperty(signature, { Fir2IrPropertySymbol(signature) }, factory)
|
return symbolTable.declareProperty(signature, { Fir2IrPropertySymbol(signature, containerSource) }, factory)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createIrProperty(
|
fun createIrProperty(
|
||||||
@@ -689,7 +703,7 @@ class Fir2IrDeclarationStorage(
|
|||||||
classifierStorage.preCacheTypeParameters(property)
|
classifierStorage.preCacheTypeParameters(property)
|
||||||
val signature = signatureComposer.composeSignature(property)
|
val signature = signatureComposer.composeSignature(property)
|
||||||
return property.convertWithOffsets { startOffset, endOffset ->
|
return property.convertWithOffsets { startOffset, endOffset ->
|
||||||
val result = declareIrProperty(signature) { symbol ->
|
val result = declareIrProperty(signature, property.containerSource) { symbol ->
|
||||||
IrPropertyImpl(
|
IrPropertyImpl(
|
||||||
startOffset, endOffset, origin, symbol,
|
startOffset, endOffset, origin, symbol,
|
||||||
property.name, property.visibility, property.modality!!,
|
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 IrClass -> WrappedClassDescriptor().apply { bind(owner) }
|
||||||
is IrConstructor -> WrappedClassConstructorDescriptor().apply { bind(owner) }
|
is IrConstructor -> WrappedClassConstructorDescriptor().apply { bind(owner) }
|
||||||
is IrSimpleFunction -> when {
|
is IrSimpleFunction -> when {
|
||||||
owner.name.isSpecial && owner.name.asString().startsWith("get") ->
|
containerSource != null ->
|
||||||
WrappedPropertyGetterDescriptor(Annotations.EMPTY, SourceElement.NO_SOURCE)
|
|
||||||
owner.name.isSpecial && owner.name.asString().startsWith("set") ->
|
|
||||||
WrappedPropertySetterDescriptor(Annotations.EMPTY, SourceElement.NO_SOURCE)
|
|
||||||
else -> if (containerSource != null) {
|
|
||||||
WrappedFunctionDescriptorWithContainerSource(containerSource)
|
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()
|
WrappedSimpleFunctionDescriptor()
|
||||||
}
|
|
||||||
}.apply { bind(owner) }
|
}.apply { bind(owner) }
|
||||||
is IrVariable -> WrappedVariableDescriptor().apply { bind(owner) }
|
is IrVariable -> WrappedVariableDescriptor().apply { bind(owner) }
|
||||||
is IrValueParameter -> WrappedValueParameterDescriptor().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")
|
else -> throw IllegalStateException("Unsupported owner in Fir2IrBindableSymbol: $owner")
|
||||||
} as D
|
} 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.declarations.*
|
||||||
import org.jetbrains.kotlin.ir.symbols.*
|
import org.jetbrains.kotlin.ir.symbols.*
|
||||||
import org.jetbrains.kotlin.ir.util.IdSignature
|
import org.jetbrains.kotlin.ir.util.IdSignature
|
||||||
|
import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource
|
||||||
|
|
||||||
class Fir2IrClassSymbol(signature: IdSignature) :
|
class Fir2IrClassSymbol(signature: IdSignature) :
|
||||||
Fir2IrBindableSymbol<ClassDescriptor, IrClass>(signature),
|
Fir2IrBindableSymbol<ClassDescriptor, IrClass>(signature),
|
||||||
@@ -34,15 +35,19 @@ class Fir2IrVariableSymbol(signature: IdSignature) :
|
|||||||
Fir2IrBindableSymbol<VariableDescriptor, IrVariable>(signature),
|
Fir2IrBindableSymbol<VariableDescriptor, IrVariable>(signature),
|
||||||
IrVariableSymbol
|
IrVariableSymbol
|
||||||
|
|
||||||
class Fir2IrSimpleFunctionSymbol(signature: IdSignature) :
|
class Fir2IrSimpleFunctionSymbol(
|
||||||
Fir2IrBindableSymbol<FunctionDescriptor, IrSimpleFunction>(signature),
|
signature: IdSignature,
|
||||||
|
containerSource: DeserializedContainerSource? = null
|
||||||
|
) : Fir2IrBindableSymbol<FunctionDescriptor, IrSimpleFunction>(signature, containerSource),
|
||||||
IrSimpleFunctionSymbol
|
IrSimpleFunctionSymbol
|
||||||
|
|
||||||
class Fir2IrConstructorSymbol(signature: IdSignature) :
|
class Fir2IrConstructorSymbol(signature: IdSignature) :
|
||||||
Fir2IrBindableSymbol<ClassConstructorDescriptor, IrConstructor>(signature),
|
Fir2IrBindableSymbol<ClassConstructorDescriptor, IrConstructor>(signature),
|
||||||
IrConstructorSymbol
|
IrConstructorSymbol
|
||||||
|
|
||||||
class Fir2IrPropertySymbol(signature: IdSignature) :
|
class Fir2IrPropertySymbol(
|
||||||
Fir2IrBindableSymbol<PropertyDescriptor, IrProperty>(signature),
|
signature: IdSignature,
|
||||||
|
containerSource: DeserializedContainerSource? = null
|
||||||
|
) : Fir2IrBindableSymbol<PropertyDescriptor, IrProperty>(signature, containerSource),
|
||||||
IrPropertySymbol
|
IrPropertySymbol
|
||||||
|
|
||||||
|
|||||||
@@ -271,7 +271,8 @@ val IrDeclarationWithName.fqNameWhenAvailable: FqName?
|
|||||||
}
|
}
|
||||||
|
|
||||||
val IrDeclaration.parentAsClass: IrClass
|
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 {
|
fun IrClass.isLocalClass(): Boolean {
|
||||||
var current: IrDeclarationParent? = this
|
var current: IrDeclarationParent? = this
|
||||||
|
|||||||
Reference in New Issue
Block a user