FIR: Prepare body transformers for local classes resolution

- Add outerBodyResolveContext
- Rename FirImplicitBodyResolveTransformer and generalize because it will be used for full body
resolution on local classes
This commit is contained in:
Denis Zharkov
2020-03-19 12:02:34 +03:00
parent 7927ef9f66
commit d21437e29d
2 changed files with 29 additions and 14 deletions
@@ -26,11 +26,12 @@ open class FirBodyResolveTransformer(
phase: FirResolvePhase,
override var implicitTypeOnly: Boolean,
scopeSession: ScopeSession,
val returnTypeCalculator: ReturnTypeCalculator = ReturnTypeCalculatorForFullBodyResolve()
val returnTypeCalculator: ReturnTypeCalculator = ReturnTypeCalculatorForFullBodyResolve(),
outerBodyResolveContext: BodyResolveContext? = null
) : FirAbstractBodyResolveTransformer(phase) {
private var packageFqName = FqName.ROOT
final override val context: BodyResolveContext = BodyResolveContext(returnTypeCalculator)
final override val context: BodyResolveContext = outerBodyResolveContext ?: BodyResolveContext(returnTypeCalculator)
final override val components: BodyResolveTransformerComponents =
BodyResolveTransformerComponents(session, scopeSession, this, context)
@@ -38,11 +38,14 @@ class FirImplicitTypeBodyResolveTransformerAdapter(private val scopeSession: Sco
override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult<FirFile> {
val session = file.session
scopeSession.returnTypeCalculator = ReturnTypeCalculatorWithJump(session, scopeSession, implicitBodyResolveComputationSession)
val transformer = FirImplicitBodyResolveTransformer(
val returnTypeCalculator = ReturnTypeCalculatorWithJump(session, scopeSession, implicitBodyResolveComputationSession)
scopeSession.returnTypeCalculator = returnTypeCalculator
val transformer = FirImplicitAwareBodyResolveTransformer(
session,
scopeSession,
implicitBodyResolveComputationSession
implicitBodyResolveComputationSession,
FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, implicitTypeOnly = true,
returnTypeCalculator
)
return file.transform(transformer, ResolutionMode.ContextIndependent)
}
@@ -51,16 +54,21 @@ class FirImplicitTypeBodyResolveTransformerAdapter(private val scopeSession: Sco
fun createReturnTypeCalculatorForIDE(session: FirSession, scopeSession: ScopeSession): ReturnTypeCalculator =
ReturnTypeCalculatorWithJump(session, scopeSession, ImplicitBodyResolveComputationSession())
private open class FirImplicitBodyResolveTransformer(
private open class FirImplicitAwareBodyResolveTransformer(
session: FirSession,
scopeSession: ScopeSession,
private val implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession
private val implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession,
phase: FirResolvePhase,
implicitTypeOnly: Boolean,
returnTypeCalculator: ReturnTypeCalculator,
outerBodyResolveContext: BodyResolveContext? = null
) : FirBodyResolveTransformer(
session,
phase = FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE,
implicitTypeOnly = true,
scopeSession = scopeSession,
returnTypeCalculator = ReturnTypeCalculatorWithJump(session, scopeSession, implicitBodyResolveComputationSession)
phase,
implicitTypeOnly,
scopeSession,
returnTypeCalculator,
outerBodyResolveContext
) {
override fun transformSimpleFunction(
simpleFunction: FirSimpleFunction,
@@ -179,11 +187,17 @@ private class FirDesignatedBodyResolveTransformerForReturnTypeCalculator(
private val designation: Iterator<FirElement>,
session: FirSession,
scopeSession: ScopeSession,
implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession
) : FirImplicitBodyResolveTransformer(
implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession,
returnTypeCalculator: ReturnTypeCalculator,
outerBodyResolveContext: BodyResolveContext? = null
) : FirImplicitAwareBodyResolveTransformer(
session,
scopeSession,
implicitBodyResolveComputationSession
implicitBodyResolveComputationSession,
FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE,
implicitTypeOnly = true,
returnTypeCalculator,
outerBodyResolveContext
) {
var lastResult: FirElement? = null