[FIR] Don't recreate transformer in FirImplicitTypeBodyResolveTransformerAdapter

This commit is contained in:
Dmitriy Novozhilov
2020-05-19 11:44:20 +03:00
parent c4407d6d63
commit 4e07f8180b
2 changed files with 13 additions and 12 deletions
@@ -29,7 +29,7 @@ fun FirResolvePhase.createTransformerByPhase(session: FirSession, scopeSession:
TYPES -> FirTypeResolveTransformer(session, scopeSession) TYPES -> FirTypeResolveTransformer(session, scopeSession)
STATUS -> FirStatusResolveTransformer(session) STATUS -> FirStatusResolveTransformer(session)
CONTRACTS -> FirContractResolveTransformerAdapter(session, scopeSession) CONTRACTS -> FirContractResolveTransformerAdapter(session, scopeSession)
IMPLICIT_TYPES_BODY_RESOLVE -> FirImplicitTypeBodyResolveTransformerAdapter(scopeSession) IMPLICIT_TYPES_BODY_RESOLVE -> FirImplicitTypeBodyResolveTransformerAdapter(session, scopeSession)
BODY_RESOLVE -> FirBodyResolveTransformerAdapter(scopeSession) BODY_RESOLVE -> FirBodyResolveTransformerAdapter(scopeSession)
} }
} }
@@ -31,24 +31,25 @@ import org.jetbrains.kotlin.fir.visitors.FirTransformer
import org.jetbrains.kotlin.fir.visitors.compose import org.jetbrains.kotlin.fir.visitors.compose
@AdapterForResolvePhase @AdapterForResolvePhase
class FirImplicitTypeBodyResolveTransformerAdapter(private val scopeSession: ScopeSession) : FirTransformer<Nothing?>() { class FirImplicitTypeBodyResolveTransformerAdapter(session: FirSession, scopeSession: ScopeSession) : FirTransformer<Nothing?>() {
private val implicitBodyResolveComputationSession = ImplicitBodyResolveComputationSession() private val implicitBodyResolveComputationSession = ImplicitBodyResolveComputationSession()
private val returnTypeCalculator = ReturnTypeCalculatorWithJump(session, scopeSession, implicitBodyResolveComputationSession).also {
scopeSession.returnTypeCalculator = it
}
private val transformer = FirImplicitAwareBodyResolveTransformer(
session,
scopeSession,
implicitBodyResolveComputationSession,
FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, implicitTypeOnly = true,
returnTypeCalculator
)
override fun <E : FirElement> transformElement(element: E, data: Nothing?): CompositeTransformResult<E> { override fun <E : FirElement> transformElement(element: E, data: Nothing?): CompositeTransformResult<E> {
return element.compose() return element.compose()
} }
override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult<FirFile> { override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult<FirFile> {
val session = file.session
val returnTypeCalculator = ReturnTypeCalculatorWithJump(session, scopeSession, implicitBodyResolveComputationSession)
scopeSession.returnTypeCalculator = returnTypeCalculator
val transformer = FirImplicitAwareBodyResolveTransformer(
session,
scopeSession,
implicitBodyResolveComputationSession,
FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, implicitTypeOnly = true,
returnTypeCalculator
)
return file.transform(transformer, ResolutionMode.ContextIndependent) return file.transform(transformer, ResolutionMode.ContextIndependent)
} }
} }