[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:
+2
-2
@@ -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
|
||||
|
||||
+2
-2
@@ -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)
|
||||
|
||||
+5
-5
@@ -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
|
||||
|
||||
+1
-1
@@ -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(
|
||||
|
||||
+4
-5
@@ -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,
|
||||
|
||||
+3
-3
@@ -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
|
||||
+2
-2
@@ -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
|
||||
}
|
||||
|
||||
+1
-2
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user