From bc2aa20b86a4be5f8f402c371e20b96b15bc5168 Mon Sep 17 00:00:00 2001 From: Ilya Chernikov Date: Mon, 5 Dec 2022 10:28:29 +0100 Subject: [PATCH] Revert unrelated refactoring from "FIR: Fix interface delegation ABI" the refactoring is questionable at places and breaks FirScript support --- .../kotlin/fir/backend/Fir2IrConverter.kt | 59 ++++++++++--------- 1 file changed, 32 insertions(+), 27 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt index c260b481773..c72ee76b5b0 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt @@ -42,7 +42,6 @@ import org.jetbrains.kotlin.ir.interpreter.checker.IrConstTransformer import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.utils.addIfNotNull class Fir2IrConverter( private val moduleDescriptor: FirModuleDescriptor, @@ -183,7 +182,8 @@ class Fir2IrConverter( private fun processFileAndClassMembers(file: FirFile) { val irFile = declarationStorage.getIrFile(file) for (declaration in file.declarations) { - processMemberDeclaration(declaration, null, irFile) + val irDeclaration = processMemberDeclaration(declaration, null, irFile) ?: continue + irFile.declarations += irDeclaration } } @@ -202,7 +202,8 @@ class Fir2IrConverter( ) } for (declaration in syntheticPropertiesLast(anonymousObject.declarations)) { - processMemberDeclaration(declaration, anonymousObject, irClass) + val irDeclaration = processMemberDeclaration(declaration, anonymousObject, irClass) ?: continue + irClass.declarations += irDeclaration } // Add delegated members *before* fake override generations. // Otherwise, fake overrides for delegated members, which are redundant, will be added. @@ -234,7 +235,8 @@ class Fir2IrConverter( } // At least on enum entry creation we may need a default constructor, so ctors should be converted first for (declaration in syntheticPropertiesLast(allDeclarations)) { - processMemberDeclaration(declaration, regularClass, irClass) + val irDeclaration = processMemberDeclaration(declaration, regularClass, irClass) ?: continue + irClass.declarations += irDeclaration } // Add delegated members *before* fake override generations. // Otherwise, fake overrides for delegated members, which are redundant, will be added. @@ -342,60 +344,63 @@ class Fir2IrConverter( } } - // Process `declaration` and add the results to `parent`. private fun processMemberDeclaration( declaration: FirDeclaration, containingClass: FirClass?, - parent: IrDeclarationContainer - ) { + parent: IrDeclarationParent + ): IrDeclaration? { val isLocal = containingClass != null && (containingClass !is FirRegularClass || containingClass.isLocal) - when (declaration) { + return when (declaration) { is FirRegularClass -> { - parent.declarations += processClassMembers(declaration) + processClassMembers(declaration) } is FirScript -> { assert(parent is IrFile) declarationStorage.getOrCreateIrScript(declaration) } is FirSimpleFunction -> { - parent.declarations += declarationStorage.getOrCreateIrFunction( + declarationStorage.getOrCreateIrFunction( declaration, parent, isLocal = isLocal ) } is FirProperty -> { - if (declaration.source?.kind != KtFakeSourceElementKind.EnumGeneratedDeclaration || - declaration.name != StandardNames.ENUM_ENTRIES || - session.languageVersionSettings.supportsFeature(LanguageFeature.EnumEntries) + if (declaration.source?.kind == KtFakeSourceElementKind.EnumGeneratedDeclaration && + declaration.name == StandardNames.ENUM_ENTRIES && + !session.languageVersionSettings.supportsFeature(LanguageFeature.EnumEntries) ) { - parent.declarations += declarationStorage.getOrCreateIrProperty( + // Note: we have to do it, because backend without the feature + // cannot process Enum.entries properly + null + } else { + declarationStorage.getOrCreateIrProperty( declaration, parent, isLocal = isLocal ) } } is FirField -> { - require(declaration.isSynthetic) { - "Unexpected non-synthetic field: ${declaration::class}" - } - parent.declarations.addIfNotNull( + if (declaration.isSynthetic) { declarationStorage.createIrFieldAndDelegatedMembers(declaration, containingClass!!, parent as IrClass) - ) - } - is FirConstructor -> { - if (!declaration.isPrimary) { - parent.declarations += declarationStorage.getOrCreateIrConstructor( - declaration, parent as IrClass, isLocal = isLocal - ) + } else { + throw AssertionError("Unexpected non-synthetic field: ${declaration::class}") } } + is FirConstructor -> if (!declaration.isPrimary) { + declarationStorage.getOrCreateIrConstructor( + declaration, parent as IrClass, isLocal = isLocal + ) + } else { + null + } is FirEnumEntry -> { - parent.declarations += classifierStorage.createIrEnumEntry(declaration, parent as IrClass) + classifierStorage.createIrEnumEntry(declaration, parent as IrClass) } is FirAnonymousInitializer -> { - parent.declarations += declarationStorage.createIrAnonymousInitializer(declaration, parent as IrClass) + declarationStorage.createIrAnonymousInitializer(declaration, parent as IrClass) } is FirTypeAlias -> { // DO NOTHING + null } else -> { error("Unexpected member: ${declaration::class}")