[FIR] Make Forced FakeOverrideTypeCalculator thread safe

This commit is contained in:
Dmitriy Novozhilov
2021-09-03 10:04:13 +03:00
committed by TeamCityServer
parent 4f99140c2d
commit 37a34e12d0
@@ -26,17 +26,23 @@ abstract class FakeOverrideTypeCalculator {
object Forced : FakeOverrideTypeCalculator() { object Forced : FakeOverrideTypeCalculator() {
override fun computeReturnType(declaration: FirTypedDeclaration): FirResolvedTypeRef { override fun computeReturnType(declaration: FirTypedDeclaration): FirResolvedTypeRef {
(declaration.returnTypeRef as? FirResolvedTypeRef)?.let { return it } val fakeOverrideSubstitution = declaration.attributes.fakeOverrideSubstitution
val (substitutor, baseSymbol) = declaration.attributes.fakeOverrideSubstitution ?: error("") ?: 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 baseDeclaration = baseSymbol.fir as FirTypedDeclaration
val baseReturnType = computeReturnType(baseDeclaration).type val baseReturnType = computeReturnType(baseDeclaration).type
declaration.attributes.fakeOverrideSubstitution = null
val coneType = substitutor.substituteOrSelf(baseReturnType) val coneType = substitutor.substituteOrSelf(baseReturnType)
val returnType = declaration.returnTypeRef.resolvedTypeFromPrototype(coneType) val returnType = declaration.returnTypeRef.resolvedTypeFromPrototype(coneType)
declaration.replaceReturnTypeRef(returnType) declaration.replaceReturnTypeRef(returnType)
return returnType return returnType
} }
} }
}
} }
// --------------------------------------------------------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------------------------------------------------------