[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.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