[FIR] ReturnTypeCalculatorWithJump: use outer transformer instead of type calculator

This is a more flexible solution

^KT-63042
This commit is contained in:
Dmitrii Gridin
2023-12-01 12:28:57 +01:00
committed by Space Team
parent edb496f260
commit a7afd1fe01
2 changed files with 10 additions and 8 deletions
@@ -17,7 +17,6 @@ import org.jetbrains.kotlin.fir.declarations.*
import org.jetbrains.kotlin.fir.expressions.FirStatement
import org.jetbrains.kotlin.fir.resolve.ResolutionMode
import org.jetbrains.kotlin.fir.resolve.ScopeSession
import org.jetbrains.kotlin.fir.resolve.transformers.ReturnTypeCalculator
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirAbstractBodyResolveTransformerDispatcher
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirResolveContextCollector
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.ImplicitBodyResolveComputationSession
@@ -34,7 +33,7 @@ internal abstract class LLFirAbstractBodyTargetResolver(
) : LLFirTargetResolver(resolveTarget, lockProvider, resolvePhase, isJumpingPhase) {
protected fun createReturnTypeCalculator(
firResolveContextCollector: FirResolveContextCollector?,
): ReturnTypeCalculator = LLFirReturnTypeCalculatorWithJump(
): LLFirReturnTypeCalculatorWithJump = LLFirReturnTypeCalculatorWithJump(
scopeSession,
implicitBodyResolveComputationSession,
lockProvider,
@@ -88,7 +88,7 @@ fun <F : FirClassLikeDeclaration> F.runContractAndBodiesResolutionForLocalClass(
components.scopeSession,
implicitBodyResolveComputationSession,
designationMap,
nonLocalDeclarationResolver = currentReturnTypeCalculator,
outerTransformer = components.transformer,
)
val newContext = components.context.createSnapshotForLocalClasses(returnTypeCalculator, targetedClasses)
@@ -103,8 +103,9 @@ fun <F : FirClassLikeDeclaration> F.runContractAndBodiesResolutionForLocalClass(
implicitTypeOnly = false,
returnTypeCalculator,
outerBodyResolveContext = newContext,
firResolveContextCollector = firResolveContextCollector
firResolveContextCollector = firResolveContextCollector,
)
return this.transform(transformer, resolutionMode)
}
@@ -114,7 +115,7 @@ open class FirImplicitAwareBodyResolveTransformer(
private val implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession,
phase: FirResolvePhase,
implicitTypeOnly: Boolean,
returnTypeCalculator: ReturnTypeCalculator,
returnTypeCalculator: ReturnTypeCalculatorWithJump,
outerBodyResolveContext: BodyResolveContext? = null,
firResolveContextCollector: FirResolveContextCollector? = null,
) : FirBodyResolveTransformer(
@@ -183,7 +184,7 @@ open class ReturnTypeCalculatorWithJump(
protected val scopeSession: ScopeSession,
val implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession,
val designationMapForLocalClasses: Map<FirCallableDeclaration, List<FirClassLikeDeclaration>> = mapOf(),
private val nonLocalDeclarationResolver: ReturnTypeCalculatorWithJump? = null,
val outerTransformer: FirAbstractBodyResolveTransformerDispatcher? = null,
) : ReturnTypeCalculator() {
override val callableCopyTypeCalculator: CallableCopyTypeCalculator = CallableCopyTypeCalculatorWithJump()
@@ -292,7 +293,9 @@ open class ReturnTypeCalculatorWithJump(
val (designation, outerBodyResolveContext) = if (declaration in designationMapForLocalClasses) {
designationMapForLocalClasses.getValue(declaration) to outerBodyResolveContext
} else {
nonLocalDeclarationResolver?.let { return it.resolveDeclaration(declaration) }
(outerTransformer?.returnTypeCalculator as? ReturnTypeCalculatorWithJump)?.resolveDeclaration(declaration)?.let {
return it
}
val provider = session.firProvider
val file = provider.getFirCallableContainerFile(symbol)
@@ -349,7 +352,7 @@ open class FirDesignatedBodyResolveTransformerForReturnTypeCalculator(
session: FirSession,
scopeSession: ScopeSession,
implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession,
returnTypeCalculator: ReturnTypeCalculator,
returnTypeCalculator: ReturnTypeCalculatorWithJump,
outerBodyResolveContext: BodyResolveContext? = null
) : FirImplicitAwareBodyResolveTransformer(
session,