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, phase: FirResolvePhase,
override var implicitTypeOnly: Boolean, override var implicitTypeOnly: Boolean,
scopeSession: ScopeSession, scopeSession: ScopeSession,
val returnTypeCalculator: ReturnTypeCalculator = ReturnTypeCalculatorForFullBodyResolve() val returnTypeCalculator: ReturnTypeCalculator = ReturnTypeCalculatorForFullBodyResolve(),
outerBodyResolveContext: BodyResolveContext? = null
) : FirAbstractBodyResolveTransformer(phase) { ) : FirAbstractBodyResolveTransformer(phase) {
private var packageFqName = FqName.ROOT 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 = final override val components: BodyResolveTransformerComponents =
BodyResolveTransformerComponents(session, scopeSession, this, context) BodyResolveTransformerComponents(session, scopeSession, this, context)
@@ -38,11 +38,14 @@ class FirImplicitTypeBodyResolveTransformerAdapter(private val scopeSession: Sco
override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult<FirFile> { override fun transformFile(file: FirFile, data: Nothing?): CompositeTransformResult<FirFile> {
val session = file.session val session = file.session
scopeSession.returnTypeCalculator = ReturnTypeCalculatorWithJump(session, scopeSession, implicitBodyResolveComputationSession) val returnTypeCalculator = ReturnTypeCalculatorWithJump(session, scopeSession, implicitBodyResolveComputationSession)
val transformer = FirImplicitBodyResolveTransformer( scopeSession.returnTypeCalculator = returnTypeCalculator
val transformer = FirImplicitAwareBodyResolveTransformer(
session, session,
scopeSession, scopeSession,
implicitBodyResolveComputationSession implicitBodyResolveComputationSession,
FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, implicitTypeOnly = true,
returnTypeCalculator
) )
return file.transform(transformer, ResolutionMode.ContextIndependent) return file.transform(transformer, ResolutionMode.ContextIndependent)
} }
@@ -51,16 +54,21 @@ class FirImplicitTypeBodyResolveTransformerAdapter(private val scopeSession: Sco
fun createReturnTypeCalculatorForIDE(session: FirSession, scopeSession: ScopeSession): ReturnTypeCalculator = fun createReturnTypeCalculatorForIDE(session: FirSession, scopeSession: ScopeSession): ReturnTypeCalculator =
ReturnTypeCalculatorWithJump(session, scopeSession, ImplicitBodyResolveComputationSession()) ReturnTypeCalculatorWithJump(session, scopeSession, ImplicitBodyResolveComputationSession())
private open class FirImplicitBodyResolveTransformer( private open class FirImplicitAwareBodyResolveTransformer(
session: FirSession, session: FirSession,
scopeSession: ScopeSession, scopeSession: ScopeSession,
private val implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession private val implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession,
phase: FirResolvePhase,
implicitTypeOnly: Boolean,
returnTypeCalculator: ReturnTypeCalculator,
outerBodyResolveContext: BodyResolveContext? = null
) : FirBodyResolveTransformer( ) : FirBodyResolveTransformer(
session, session,
phase = FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE, phase,
implicitTypeOnly = true, implicitTypeOnly,
scopeSession = scopeSession, scopeSession,
returnTypeCalculator = ReturnTypeCalculatorWithJump(session, scopeSession, implicitBodyResolveComputationSession) returnTypeCalculator,
outerBodyResolveContext
) { ) {
override fun transformSimpleFunction( override fun transformSimpleFunction(
simpleFunction: FirSimpleFunction, simpleFunction: FirSimpleFunction,
@@ -179,11 +187,17 @@ private class FirDesignatedBodyResolveTransformerForReturnTypeCalculator(
private val designation: Iterator<FirElement>, private val designation: Iterator<FirElement>,
session: FirSession, session: FirSession,
scopeSession: ScopeSession, scopeSession: ScopeSession,
implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession implicitBodyResolveComputationSession: ImplicitBodyResolveComputationSession,
) : FirImplicitBodyResolveTransformer( returnTypeCalculator: ReturnTypeCalculator,
outerBodyResolveContext: BodyResolveContext? = null
) : FirImplicitAwareBodyResolveTransformer(
session, session,
scopeSession, scopeSession,
implicitBodyResolveComputationSession implicitBodyResolveComputationSession,
FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE,
implicitTypeOnly = true,
returnTypeCalculator,
outerBodyResolveContext
) { ) {
var lastResult: FirElement? = null var lastResult: FirElement? = null