[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:
committed by
Space Team
parent
10ad526936
commit
740dcfe3c5
+10
-4
@@ -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 ------------------------------------
|
||||||
|
|
||||||
|
|||||||
+21
-30
@@ -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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user