[FIR2IR] Restore container source related logic

This commit is contained in:
Mikhail Glukhikh
2020-06-01 18:14:20 +03:00
parent 0c41fcba6a
commit 7bd872b264
4 changed files with 44 additions and 20 deletions
@@ -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