[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,15 +26,21 @@ 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
val baseDeclaration = baseSymbol.fir as FirTypedDeclaration synchronized(fakeOverrideSubstitution) {
val baseReturnType = computeReturnType(baseDeclaration).type if (declaration.attributes.fakeOverrideSubstitution == null) {
declaration.attributes.fakeOverrideSubstitution = null return declaration.returnTypeRef as FirResolvedTypeRef
val coneType = substitutor.substituteOrSelf(baseReturnType) }
val returnType = declaration.returnTypeRef.resolvedTypeFromPrototype(coneType) declaration.attributes.fakeOverrideSubstitution = null
declaration.replaceReturnTypeRef(returnType) val (substitutor, baseSymbol) = fakeOverrideSubstitution
return returnType 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
}
} }
} }
} }