From 37a34e12d06fec8edbb6097b38c10ae52ce94447 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Fri, 3 Sep 2021 10:04:13 +0300 Subject: [PATCH] [FIR] Make Forced FakeOverrideTypeCalculator thread safe --- .../fir/scopes/FakeOverrideTypeCalculator.kt | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/FakeOverrideTypeCalculator.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/FakeOverrideTypeCalculator.kt index 4e5e9bff7e1..4ebad2bab99 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/FakeOverrideTypeCalculator.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/scopes/FakeOverrideTypeCalculator.kt @@ -26,15 +26,21 @@ abstract class FakeOverrideTypeCalculator { object Forced : FakeOverrideTypeCalculator() { override fun computeReturnType(declaration: FirTypedDeclaration): FirResolvedTypeRef { - (declaration.returnTypeRef as? FirResolvedTypeRef)?.let { return it } - val (substitutor, baseSymbol) = declaration.attributes.fakeOverrideSubstitution ?: error("") - val baseDeclaration = baseSymbol.fir as FirTypedDeclaration - val baseReturnType = computeReturnType(baseDeclaration).type - declaration.attributes.fakeOverrideSubstitution = null - val coneType = substitutor.substituteOrSelf(baseReturnType) - val returnType = declaration.returnTypeRef.resolvedTypeFromPrototype(coneType) - declaration.replaceReturnTypeRef(returnType) - return returnType + val fakeOverrideSubstitution = declaration.attributes.fakeOverrideSubstitution + ?: return declaration.returnTypeRef as FirResolvedTypeRef + synchronized(fakeOverrideSubstitution) { + if (declaration.attributes.fakeOverrideSubstitution == null) { + return declaration.returnTypeRef as FirResolvedTypeRef + } + declaration.attributes.fakeOverrideSubstitution = null + val (substitutor, baseSymbol) = fakeOverrideSubstitution + val baseDeclaration = baseSymbol.fir as FirTypedDeclaration + val baseReturnType = computeReturnType(baseDeclaration).type + val coneType = substitutor.substituteOrSelf(baseReturnType) + val returnType = declaration.returnTypeRef.resolvedTypeFromPrototype(coneType) + declaration.replaceReturnTypeRef(returnType) + return returnType + } } } }