[FIR] Make Forced FakeOverrideTypeCalculator thread safe
This commit is contained in:
committed by
TeamCityServer
parent
4f99140c2d
commit
37a34e12d0
+15
-9
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user