From 5163e578aa871699b0e88e1c65f166cd1406d325 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 29 Aug 2023 11:36:21 +0300 Subject: [PATCH] [FIR2IR] Extract logic of IR declarations generation into separate component. Part 10 Restore old behavior of forced creation of fake-overrides This behavior semantically is not fully correct, because it ignores existed f/o in storages and overwrites them, but replacing `createIr...` with `getOrCreate...` leads to problems with f/o in actual classes ^KT-61513 --- .../kotlin/fir/backend/Fir2IrDeclarationStorage.kt | 7 +++++-- .../kotlin/fir/backend/generators/FakeOverrideGenerator.kt | 6 ++++-- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt index 039f181080b..bccea24edec 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrDeclarationStorage.kt @@ -52,6 +52,7 @@ import org.jetbrains.kotlin.serialization.deserialization.descriptors.Deserializ import org.jetbrains.kotlin.utils.threadLocal import java.util.concurrent.ConcurrentHashMap +@OptIn(LeakedDeclarationCaches::class) class Fir2IrDeclarationStorage( private val components: Fir2IrComponents, private val moduleDescriptor: FirModuleDescriptor, @@ -440,7 +441,8 @@ class Fir2IrDeclarationStorage( return createAndCacheIrFunction(function, irParent, predefinedOrigin, isLocal, fakeOverrideOwnerLookupTag) } - private fun createAndCacheIrFunction( + @LeakedDeclarationCaches + fun createAndCacheIrFunction( function: FirFunction, irParent: IrDeclarationParent?, predefinedOrigin: IrDeclarationOrigin? = null, @@ -543,7 +545,8 @@ class Fir2IrDeclarationStorage( } } - private fun createAndCacheIrProperty( + @LeakedDeclarationCaches + fun createAndCacheIrProperty( property: FirProperty, irParent: IrDeclarationParent?, predefinedOrigin: IrDeclarationOrigin? = null, diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt index 791712bc786..fd1a5a6d80b 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/generators/FakeOverrideGenerator.kt @@ -119,10 +119,11 @@ class FakeOverrideGenerator( ) { val isLocal = firClass !is FirRegularClass || firClass.isLocal useSiteOrStaticScope.processFunctionsByName(name) { functionSymbol -> + @OptIn(LeakedDeclarationCaches::class) createFakeOverriddenIfNeeded( firClass, irClass, isLocal, functionSymbol, declarationStorage::getCachedIrFunction, - declarationStorage::getOrCreateIrFunction, + declarationStorage::createAndCacheIrFunction, createFakeOverrideSymbol = { firFunction, callableSymbol -> val symbol = FirFakeOverrideGenerator.createSymbolForSubstitutionOverride(callableSymbol, firClass.symbol.classId) FirFakeOverrideGenerator.createSubstitutionOverrideFunction( @@ -147,10 +148,11 @@ class FakeOverrideGenerator( useSiteOrStaticScope.processPropertiesByName(name) { propertyOrFieldSymbol -> when (propertyOrFieldSymbol) { is FirPropertySymbol -> { + @OptIn(LeakedDeclarationCaches::class) createFakeOverriddenIfNeeded( firClass, irClass, isLocal, propertyOrFieldSymbol, declarationStorage::getCachedIrProperty, - declarationStorage::getOrCreateIrProperty, + declarationStorage::createAndCacheIrProperty, createFakeOverrideSymbol = { firProperty, callableSymbol -> val symbolForOverride = FirFakeOverrideGenerator.createSymbolForSubstitutionOverride(callableSymbol, firClass.symbol.classId)