[FIR] Pass the whole body context to the resolve context collector

Collector for the 'FirCodeFragment' analysis needs to capture also
data-flow information.
This commit is contained in:
Yan Zhulanow
2023-06-21 20:04:20 +09:00
parent b43fcae708
commit 7e075ec64a
27 changed files with 75 additions and 82 deletions
@@ -30,7 +30,7 @@ abstract class FirAbstractBodyResolveTransformerDispatcher(
scopeSession: ScopeSession,
val returnTypeCalculator: ReturnTypeCalculator = ReturnTypeCalculatorForFullBodyResolve,
outerBodyResolveContext: BodyResolveContext? = null,
val firTowerDataContextCollector: FirTowerDataContextCollector? = null,
val firResolveContextCollector: FirResolveContextCollector? = null,
) : FirAbstractBodyResolveTransformer(phase) {
open val preserveCFGForClasses: Boolean get() = !implicitTypeOnly
@@ -52,7 +52,7 @@ abstract class FirAbstractBodyResolveTransformerDispatcher(
checkSessionConsistency(file)
return context.withFile(file, components) {
withFileAnalysisExceptionWrapping(file) {
firTowerDataContextCollector?.addFileContext(file, context.towerDataContext)
firResolveContextCollector?.addFileContext(file, context.towerDataContext)
@Suppress("UNCHECKED_CAST")
transformDeclarationContent(file, data) as FirFile
@@ -18,7 +18,7 @@ open class FirBodyResolveTransformer(
scopeSession: ScopeSession,
returnTypeCalculator: ReturnTypeCalculator = ReturnTypeCalculatorForFullBodyResolve,
outerBodyResolveContext: BodyResolveContext? = null,
firTowerDataContextCollector: FirTowerDataContextCollector? = null
firResolveContextCollector: FirResolveContextCollector? = null
) : FirAbstractBodyResolveTransformerDispatcher(
session,
phase,
@@ -26,7 +26,7 @@ open class FirBodyResolveTransformer(
scopeSession,
returnTypeCalculator,
outerBodyResolveContext,
firTowerDataContextCollector
firResolveContextCollector
) {
final override val expressionsTransformer = FirExpressionsResolveTransformer(this)
final override val declarationsTransformer = FirDeclarationsResolveTransformer(this)
@@ -69,7 +69,7 @@ open class FirDeclarationsResolveTransformer(
}
protected fun transformDeclarationContent(declaration: FirDeclaration, data: ResolutionMode): FirDeclaration {
transformer.firTowerDataContextCollector?.addDeclarationContext(declaration, context.towerDataContext)
transformer.firResolveContextCollector?.addDeclarationContext(declaration, context)
return transformer.transformDeclarationContent(declaration, data)
}
@@ -526,7 +526,7 @@ open class FirDeclarationsResolveTransformer(
whileAnalysing(session, regularClass) {
return context.withContainingClass(regularClass) {
if (regularClass.isLocal && regularClass !in context.targetedLocalClasses) {
return regularClass.runAllPhasesForLocalClass(transformer, components, data, transformer.firTowerDataContextCollector)
return regularClass.runAllPhasesForLocalClass(transformer, components, data, transformer.firResolveContextCollector)
}
doTransformTypeParameters(regularClass)
@@ -554,11 +554,11 @@ open class FirDeclarationsResolveTransformer(
override fun transformTypeAlias(typeAlias: FirTypeAlias, data: ResolutionMode): FirTypeAlias = whileAnalysing(session, typeAlias) {
if (typeAlias.isLocal && typeAlias !in context.targetedLocalClasses) {
return typeAlias.runAllPhasesForLocalClass(transformer, components, data, transformer.firTowerDataContextCollector)
return typeAlias.runAllPhasesForLocalClass(transformer, components, data, transformer.firResolveContextCollector)
}
doTransformTypeParameters(typeAlias)
typeAlias.transformAnnotations(transformer, data)
transformer.firTowerDataContextCollector?.addDeclarationContext(typeAlias, context.towerDataContext)
transformer.firResolveContextCollector?.addDeclarationContext(typeAlias, context)
typeAlias.transformExpandedTypeRef(transformer, data)
return typeAlias
}
@@ -592,7 +592,7 @@ open class FirDeclarationsResolveTransformer(
data: ResolutionMode
): FirStatement = whileAnalysing(session, anonymousObject) {
if (anonymousObject !in context.targetedLocalClasses) {
return anonymousObject.runAllPhasesForLocalClass(transformer, components, data, transformer.firTowerDataContextCollector)
return anonymousObject.runAllPhasesForLocalClass(transformer, components, data, transformer.firResolveContextCollector)
}
require(anonymousObject.controlFlowGraphReference == null)
val buildGraph = !implicitTypeOnly
@@ -560,7 +560,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT
}
private fun collectStatementContext(statement: FirStatement) {
transformer.firTowerDataContextCollector?.addStatementContext(statement, context.towerDataContext)
transformer.firResolveContextCollector?.addStatementContext(statement, context)
}
override fun transformThisReceiverExpression(
@@ -29,7 +29,6 @@ import org.jetbrains.kotlin.fir.scopes.impl.originalForWrappedIntegerOperator
import org.jetbrains.kotlin.fir.symbols.impl.FirCallableSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirSyntheticPropertySymbol
import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase
import org.jetbrains.kotlin.fir.types.FirErrorTypeRef
import org.jetbrains.kotlin.fir.types.FirImplicitTypeRef
import org.jetbrains.kotlin.fir.types.FirResolvedTypeRef
import org.jetbrains.kotlin.fir.types.builder.buildErrorTypeRef
@@ -71,7 +70,7 @@ fun <F : FirClassLikeDeclaration> F.runContractAndBodiesResolutionForLocalClass(
components: FirAbstractBodyResolveTransformer.BodyResolveTransformerComponents,
resolutionMode: ResolutionMode,
localClassesNavigationInfo: LocalClassesNavigationInfo,
firTowerDataContextCollector: FirTowerDataContextCollector? = null
firResolveContextCollector: FirResolveContextCollector? = null
): F {
val currentReturnTypeCalculator = components.context.returnTypeCalculator as? ReturnTypeCalculatorWithJump
val prevDesignation = currentReturnTypeCalculator?.designationMapForLocalClasses ?: emptyMap()
@@ -103,7 +102,7 @@ fun <F : FirClassLikeDeclaration> F.runContractAndBodiesResolutionForLocalClass(
implicitTypeOnly = false,
returnTypeCalculator,
outerBodyResolveContext = newContext,
firTowerDataContextCollector = firTowerDataContextCollector
firResolveContextCollector = firResolveContextCollector
)
return this.transform(transformer, resolutionMode)
}
@@ -116,7 +115,7 @@ open class FirImplicitAwareBodyResolveTransformer(
implicitTypeOnly: Boolean,
returnTypeCalculator: ReturnTypeCalculator,
outerBodyResolveContext: BodyResolveContext? = null,
firTowerDataContextCollector: FirTowerDataContextCollector? = null,
firResolveContextCollector: FirResolveContextCollector? = null,
) : FirBodyResolveTransformer(
session,
phase,
@@ -124,7 +123,7 @@ open class FirImplicitAwareBodyResolveTransformer(
scopeSession,
returnTypeCalculator,
outerBodyResolveContext,
firTowerDataContextCollector
firResolveContextCollector
) {
override fun transformSimpleFunction(
simpleFunction: FirSimpleFunction,
@@ -14,10 +14,10 @@ import org.jetbrains.kotlin.fir.expressions.FirStatement
/**
* Collector needed to collect TowerDataContext in IDE for in-air resolved fir elements.
*/
interface FirTowerDataContextCollector {
interface FirResolveContextCollector {
fun addFileContext(file: FirFile, context: FirTowerDataContext)
fun addStatementContext(statement: FirStatement, context: FirTowerDataContext)
fun addDeclarationContext(declaration: FirDeclaration, context: FirTowerDataContext)
fun addStatementContext(statement: FirStatement, context: BodyResolveContext)
fun addDeclarationContext(declaration: FirDeclaration, context: BodyResolveContext)
/**
* Here by "header" we understand the parts of the class declaration which resolution is not affected
@@ -18,7 +18,7 @@ fun <F : FirClassLikeDeclaration> F.runAllPhasesForLocalClass(
transformer: FirAbstractBodyResolveTransformer,
components: FirAbstractBodyResolveTransformer.BodyResolveTransformerComponents,
resolutionMode: ResolutionMode,
firTowerDataContextCollector: FirTowerDataContextCollector?
firResolveContextCollector: FirResolveContextCollector?
): F {
if (status is FirResolvedDeclarationStatus) return this
if (this is FirRegularClass) {
@@ -65,7 +65,7 @@ fun <F : FirClassLikeDeclaration> F.runAllPhasesForLocalClass(
components,
resolutionMode,
localClassesNavigationInfo,
firTowerDataContextCollector
firResolveContextCollector
)
return this
}
@@ -19,7 +19,6 @@ import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.BodyResolveCon
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirAbstractBodyResolveTransformerDispatcher
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirDeclarationsResolveTransformer
import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirExpressionsResolveTransformer
import org.jetbrains.kotlin.fir.types.FirTypeRef
import org.jetbrains.kotlin.fir.visitors.transformSingle
open class FirAnnotationArgumentsMappingTransformer(
@@ -221,7 +220,7 @@ private class FirDeclarationsResolveTransformerForAnnotationArgumentsMapping(
override fun transformTypeAlias(typeAlias: FirTypeAlias, data: ResolutionMode): FirTypeAlias {
doTransformTypeParameters(typeAlias)
typeAlias.transformAnnotations(transformer, data)
transformer.firTowerDataContextCollector?.addDeclarationContext(typeAlias, context.towerDataContext)
transformer.firResolveContextCollector?.addDeclarationContext(typeAlias, context)
typeAlias.expandedTypeRef.transformSingle(transformer, data)
return typeAlias
}