From ff2f6fe5e5d563f92080f36d0f85564deaa9d067 Mon Sep 17 00:00:00 2001 From: Georgy Bronnikov Date: Thu, 17 Feb 2022 14:38:21 +0300 Subject: [PATCH] Fir2Ir: handle enum entries in Fir2IrProvider NB: only the easy path works for sure. Need to have a look at: - enum entry members - Java enum entries --- .../org/jetbrains/kotlin/fir/backend/FirIrProvider.kt | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/FirIrProvider.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/FirIrProvider.kt index 1870fb0278b..6861e689259 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/FirIrProvider.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/FirIrProvider.kt @@ -93,6 +93,12 @@ class FirIrProvider(val fir2IrComponents: Fir2IrComponents) : IrProvider { firCandidates = listOf(firClass) parent = firParentClass?.let { classifierStorage.getIrClassSymbol(it.symbol).owner } ?: packageFragment } + SymbolKind.ENUM_ENTRY_SYMBOL -> { + val lastName = Name.guessByFirstCharacter(nameSegments.last()) + val firCandidate = firClass.declarations.singleOrNull { (it as? FirEnumEntry)?.name == lastName } + firCandidates = firCandidate?.let { listOf(it) } ?: return null + parent = classifierStorage.getIrClassSymbol(firClass.symbol).owner + } SymbolKind.CONSTRUCTOR_SYMBOL -> { val constructors = mutableListOf() scope.processDeclaredConstructors { constructors.add(it.fir) } @@ -139,6 +145,7 @@ class FirIrProvider(val fir2IrComponents: Fir2IrComponents) : IrProvider { return when (kind) { SymbolKind.CLASS_SYMBOL -> classifierStorage.getIrClassSymbol((firDeclaration as FirRegularClass).symbol).owner + SymbolKind.ENUM_ENTRY_SYMBOL -> classifierStorage.createIrEnumEntry(firDeclaration as FirEnumEntry, parent as IrClass) SymbolKind.CONSTRUCTOR_SYMBOL -> { val firConstructor = firDeclaration as FirConstructor declarationStorage.getOrCreateIrConstructor(firConstructor, parent as IrClass) @@ -163,7 +170,7 @@ class FirIrProvider(val fir2IrComponents: Fir2IrComponents) : IrProvider { candidates.firstOrNull { candidate -> if (hash == null) { // We don't compute id for type aliases and classes. - candidate is FirClass || candidate is FirTypeAlias + candidate is FirClass || candidate is FirEnumEntry || candidate is FirTypeAlias } else { // The next line should have singleOrNull, but in some cases we get multiple references to the same FIR declaration. with(fir2IrComponents.signatureComposer.mangler) { candidate.signatureMangle(compatibleMode = false) == hash }