[FIR2IR] Manage typealias symbols in declaration storage instead of declaration generator

This is needed to be able to implement creation of unbound symbols
 for references of corresponding declarations (KT-62856)
This commit is contained in:
Dmitriy Novozhilov
2023-11-03 15:54:47 +02:00
committed by Space Team
parent d4b0627640
commit 10ad526936
2 changed files with 29 additions and 32 deletions
@@ -21,12 +21,10 @@ import org.jetbrains.kotlin.fir.symbols.impl.FirTypeParameterSymbol
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
import org.jetbrains.kotlin.ir.declarations.*
import org.jetbrains.kotlin.ir.symbols.IrClassSymbol
import org.jetbrains.kotlin.ir.symbols.IrClassifierSymbol
import org.jetbrains.kotlin.ir.symbols.IrSymbol
import org.jetbrains.kotlin.ir.symbols.IrTypeParameterSymbol
import org.jetbrains.kotlin.ir.symbols.*
import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrFieldSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrTypeAliasSymbolImpl
import org.jetbrains.kotlin.ir.symbols.impl.IrTypeParameterSymbolImpl
import org.jetbrains.kotlin.ir.types.IrType
import org.jetbrains.kotlin.ir.util.IdSignature
@@ -365,11 +363,20 @@ class Fir2IrClassifierStorage(
typeAlias: FirTypeAlias,
parent: IrDeclarationParent
): IrTypeAlias {
return classifiersGenerator.createIrTypeAlias(typeAlias, parent).also {
val symbol = createTypeAliasSymbol(typeAlias)
return classifiersGenerator.createIrTypeAlias(typeAlias, parent, symbol).also {
typeAliasCache[typeAlias] = it
}
}
private fun createTypeAliasSymbol(typeAlias: FirTypeAlias): IrTypeAliasSymbol {
val signature = signatureComposer.composeSignature(typeAlias)
return when {
signature != null -> symbolTable.referenceTypeAlias(signature)
else -> IrTypeAliasSymbolImpl()
}
}
internal fun getCachedTypeAlias(firTypeAlias: FirTypeAlias): IrTypeAlias? = typeAliasCache[firTypeAlias]
// ------------------------------------ code fragments ------------------------------------
@@ -279,36 +279,26 @@ class Fir2IrClassifiersGenerator(val components: Fir2IrComponents) : Fir2IrCompo
// ------------------------------------ typealiases ------------------------------------
private fun declareIrTypeAlias(signature: IdSignature?, factory: (IrTypeAliasSymbol) -> IrTypeAlias): IrTypeAlias {
return if (signature == null)
factory(IrTypeAliasSymbolImpl())
else
symbolTable.declareTypeAlias(signature, { IrTypeAliasPublicSymbolImpl(signature) }, factory)
}
fun createIrTypeAlias(
typeAlias: FirTypeAlias,
parent: IrDeclarationParent
parent: IrDeclarationParent,
symbol: IrTypeAliasSymbol,
): IrTypeAlias = typeAlias.convertWithOffsets { startOffset, endOffset ->
val signature = signatureComposer.composeSignature(typeAlias)
declareIrTypeAlias(signature) { symbol ->
classifierStorage.preCacheTypeParameters(typeAlias, symbol)
val irTypeAlias = irFactory.createTypeAlias(
startOffset = startOffset,
endOffset = endOffset,
origin = IrDeclarationOrigin.DEFINED,
name = typeAlias.name,
visibility = components.visibilityConverter.convertToDescriptorVisibility(typeAlias.visibility),
symbol = symbol,
isActual = typeAlias.isActual,
expandedType = typeAlias.expandedTypeRef.toIrType(),
).apply {
this.parent = parent
setTypeParameters(this, typeAlias)
setParent(parent)
addDeclarationToParent(this, parent)
}
irTypeAlias
classifierStorage.preCacheTypeParameters(typeAlias, symbol)
irFactory.createTypeAlias(
startOffset = startOffset,
endOffset = endOffset,
origin = IrDeclarationOrigin.DEFINED,
name = typeAlias.name,
visibility = components.visibilityConverter.convertToDescriptorVisibility(typeAlias.visibility),
symbol = symbol,
isActual = typeAlias.isActual,
expandedType = typeAlias.expandedTypeRef.toIrType(),
).apply {
this.parent = parent
setTypeParameters(this, typeAlias)
setParent(parent)
addDeclarationToParent(this, parent)
}
}