[FIR2IR] Manage enum entry 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 16:12:34 +02:00
committed by Space Team
parent 10ad526936
commit 740dcfe3c5
2 changed files with 31 additions and 34 deletions
@@ -22,10 +22,7 @@ import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET
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.symbols.impl.IrClassSymbolImpl import org.jetbrains.kotlin.ir.symbols.impl.*
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.types.IrType
import org.jetbrains.kotlin.ir.util.IdSignature import org.jetbrains.kotlin.ir.util.IdSignature
import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.name.Name
@@ -347,15 +344,24 @@ class Fir2IrClassifierStorage(
} else { } else {
irParent.origin irParent.origin
} }
val symbol = createEnumEntrySymbol(enumEntry)
return classifiersGenerator.createIrEnumEntry( return classifiersGenerator.createIrEnumEntry(
enumEntry, enumEntry,
irParent = irParent, irParent = irParent,
symbol,
predefinedOrigin = predefinedOrigin predefinedOrigin = predefinedOrigin
).also { ).also {
enumEntryCache[enumEntry] = it enumEntryCache[enumEntry] = it
} }
} }
private fun createEnumEntrySymbol(enumEntry: FirEnumEntry): IrEnumEntrySymbol {
val signature = signatureComposer.composeSignature(enumEntry)
return when {
signature != null -> symbolTable.referenceEnumEntry(signature)
else -> IrEnumEntrySymbolImpl()
}
}
// ------------------------------------ typealiases ------------------------------------ // ------------------------------------ typealiases ------------------------------------
@@ -342,43 +342,34 @@ class Fir2IrClassifiersGenerator(val components: Fir2IrComponents) : Fir2IrCompo
// ------------------------------------ enum entries ------------------------------------ // ------------------------------------ enum entries ------------------------------------
private fun declareIrEnumEntry(signature: IdSignature?, factory: (IrEnumEntrySymbol) -> IrEnumEntry): IrEnumEntry {
return if (signature == null)
factory(IrEnumEntrySymbolImpl())
else
symbolTable.declareEnumEntry(signature, { IrEnumEntryPublicSymbolImpl(signature) }, factory)
}
fun createIrEnumEntry( fun createIrEnumEntry(
enumEntry: FirEnumEntry, enumEntry: FirEnumEntry,
irParent: IrClass, irParent: IrClass,
symbol: IrEnumEntrySymbol,
predefinedOrigin: IrDeclarationOrigin? = null, predefinedOrigin: IrDeclarationOrigin? = null,
): IrEnumEntry { ): IrEnumEntry {
return enumEntry.convertWithOffsets { startOffset, endOffset -> return enumEntry.convertWithOffsets { startOffset, endOffset ->
val signature = signatureComposer.composeSignature(enumEntry) val origin = enumEntry.computeIrOrigin(predefinedOrigin)
declareIrEnumEntry(signature) { symbol -> irFactory.createEnumEntry(
val origin = enumEntry.computeIrOrigin(predefinedOrigin) startOffset = startOffset,
irFactory.createEnumEntry( endOffset = endOffset,
startOffset = startOffset, origin = origin,
endOffset = endOffset, name = enumEntry.name,
origin = origin, symbol = symbol,
name = enumEntry.name, ).apply {
symbol = symbol, declarationStorage.enterScope(this.symbol)
).apply { setParent(irParent)
declarationStorage.enterScope(this.symbol) addDeclarationToParent(this, irParent)
setParent(irParent) if (isEnumEntryWhichRequiresSubclass(enumEntry)) {
addDeclarationToParent(this, irParent) // An enum entry with its own members requires an anonymous object generated.
if (isEnumEntryWhichRequiresSubclass(enumEntry)) { // Otherwise, this is a default-ish enum entry whose initializer would be a delegating constructor call,
// An enum entry with its own members requires an anonymous object generated. // which will be translated via visitor later.
// Otherwise, this is a default-ish enum entry whose initializer would be a delegating constructor call, val klass = classifierStorage.getIrAnonymousObjectForEnumEntry(
// which will be translated via visitor later. (enumEntry.initializer as FirAnonymousObjectExpression).anonymousObject, enumEntry.name, irParent
val klass = classifierStorage.getIrAnonymousObjectForEnumEntry( )
(enumEntry.initializer as FirAnonymousObjectExpression).anonymousObject, enumEntry.name, irParent this.correspondingClass = klass
)
this.correspondingClass = klass
}
declarationStorage.leaveScope(this.symbol)
} }
declarationStorage.leaveScope(this.symbol)
} }
} }
} }