From 9ac9bef20fe917d3ff826ebaf1da713b29220ca9 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Fri, 30 Sep 2022 00:49:00 +0200 Subject: [PATCH] [FIR] fix nested access to FirCache it's forbidden by the contract and causes ISE "Recursive update" or deadlock in the IDE --- .../java/enhancement/SignatureEnhancement.kt | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt index 29da016c0e1..e09770bd8c3 100644 --- a/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt +++ b/compiler/fir/java/src/org/jetbrains/kotlin/fir/java/enhancement/SignatureEnhancement.kt @@ -189,12 +189,7 @@ class FirSignatureEnhancement( return original } enhanceTypeParameterBounds(firMethod.typeParameters) - return enhanceMethod(firMethod, original.callableId, name).also { enhancedVersion -> - val enhancedVersionFir = enhancedVersion.fir - (enhancedVersionFir.initialSignatureAttr as? FirSimpleFunction)?.let { - enhancedVersionFir.initialSignatureAttr = enhancedFunction(it.symbol, it.name).fir - } - } + return enhanceMethod(firMethod, original.callableId, name) } private fun enhanceMethod( @@ -563,9 +558,17 @@ class FirEnhancedSymbolsStorage(val session: FirSession) : FirSessionComponent { class EnhancementSymbolsCache(cachesFactory: FirCachesFactory) { @OptIn(PrivateForInline::class) val enhancedFunctions: FirCache, FirFunctionSymbol<*>, Pair> = - cachesFactory.createCache { original, (enhancement, name) -> - enhancement.enhance(original, name) - } + cachesFactory.createCacheWithPostCompute( + createValue = { original, (enhancement, name) -> + enhancement.enhance(original, name) to enhancement + }, + postCompute = { _, enhancedVersion, enhancement -> + val enhancedVersionFir = enhancedVersion.fir + (enhancedVersionFir.initialSignatureAttr as? FirSimpleFunction)?.let { + enhancedVersionFir.initialSignatureAttr = enhancement.enhancedFunction(it.symbol, it.name).fir + } + } + ) @OptIn(PrivateForInline::class) val enhancedVariables: FirCache, FirVariableSymbol<*>, Pair> =