[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:
committed by
Space Team
parent
d4b0627640
commit
10ad526936
+12
-5
@@ -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 ------------------------------------
|
||||
|
||||
+17
-27
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user