From f1623347d83a5674febf0a0039bfcc02a6730da0 Mon Sep 17 00:00:00 2001 From: Mark Punzalan Date: Tue, 8 Feb 2022 08:08:39 +0000 Subject: [PATCH] Analysis API: Use stub FirDataFlowAnalyzer when getting candidates. --- .../level/api/fir/resolver/resolverUtils.kt | 33 ++++++++++++++++++- .../kotlin/fir/resolve/ResolveUtils.kt | 5 --- .../fir/resolve/dfa/FirDataFlowAnalyzer.kt | 2 +- .../FirAbstractBodyResolveTransformer.kt | 2 +- 4 files changed, 34 insertions(+), 8 deletions(-) diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/resolver/resolverUtils.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/resolver/resolverUtils.kt index 707c6a81911..336e200ea04 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/resolver/resolverUtils.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/resolver/resolverUtils.kt @@ -7,9 +7,17 @@ package org.jetbrains.kotlin.analysis.low.level.api.fir.resolver import org.jetbrains.kotlin.fir.FirSession import org.jetbrains.kotlin.fir.declarations.FirResolvePhase +import org.jetbrains.kotlin.fir.expressions.FirExpression import org.jetbrains.kotlin.fir.resolve.ScopeSession +import org.jetbrains.kotlin.fir.resolve.dfa.FirDataFlowAnalyzer +import org.jetbrains.kotlin.fir.resolve.dfa.LogicSystem +import org.jetbrains.kotlin.fir.resolve.dfa.PersistentFlow +import org.jetbrains.kotlin.fir.resolve.dfa.PropertyStability +import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.BodyResolveContext import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirAbstractBodyResolveTransformer import org.jetbrains.kotlin.fir.resolve.transformers.body.resolve.FirBodyResolveTransformer +import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol +import org.jetbrains.kotlin.fir.types.ConeKotlinType internal fun createStubBodyResolveComponents(firSession: FirSession): FirAbstractBodyResolveTransformer.BodyResolveTransformerComponents { val scopeSession = ScopeSession() @@ -22,10 +30,33 @@ internal fun createStubBodyResolveComponents(firSession: FirSession): FirAbstrac scopeSession = scopeSession, ) - return FirAbstractBodyResolveTransformer.BodyResolveTransformerComponents( + return StubBodyResolveTransformerComponents( firSession, scopeSession, stubBodyResolveTransformer, stubBodyResolveTransformer.context, ) +} + +private class StubBodyResolveTransformerComponents( + session: FirSession, + scopeSession: ScopeSession, + transformer: FirBodyResolveTransformer, + context: BodyResolveContext +) : FirAbstractBodyResolveTransformer.BodyResolveTransformerComponents( + session, + scopeSession, + transformer, + context, +) { + override val dataFlowAnalyzer: FirDataFlowAnalyzer<*> + get() = object : FirDataFlowAnalyzer(this@StubBodyResolveTransformerComponents, context.dataFlowAnalyzerContext) { + override val logicSystem: LogicSystem + get() = error("Should not be called") + + override fun getTypeUsingSmartcastInfo( + symbol: FirBasedSymbol<*>, + expression: FirExpression + ): Pair>? = null + } } \ No newline at end of file diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt index 4bacf943e92..03b73198cc6 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/ResolveUtils.kt @@ -322,11 +322,6 @@ private inline fun BodyResolveComponents.transformExpression smartcastBuilder: () -> FirWrappedExpressionWithSmartcastBuilder, smartcastToNullBuilder: () -> FirWrappedExpressionWithSmartcastToNullBuilder ): FirWrappedExpressionWithSmartcastBuilder? { - // No need to check for smartcast if the expression was already resolved. - containingDeclarations.lastOrNull()?.let { closestDeclaration -> - if (closestDeclaration.resolvePhase >= FirResolvePhase.BODY_RESOLVE) return null - } - val (stability, typesFromSmartCast) = smartcastExtractor(expression) ?: return null val smartcastStability = stability.impliedSmartcastStability ?: if (dataFlowAnalyzer.isAccessToUnstableLocalVariable(expression)) { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt index 8fdf62a8823..17f564865d0 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt @@ -193,7 +193,7 @@ abstract class FirDataFlowAnalyzer( return getTypeUsingSmartcastInfo(symbol, qualifiedAccessExpression) } - private fun getTypeUsingSmartcastInfo( + protected open fun getTypeUsingSmartcastInfo( symbol: FirBasedSymbol<*>, expression: FirExpression ): Pair>? { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt index 01dc1417bad..8c85bf80787 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirAbstractBodyResolveTransformer.kt @@ -73,7 +73,7 @@ abstract class FirAbstractBodyResolveTransformer(phase: FirResolvePhase) : FirAb val ResolutionMode.expectedType: FirTypeRef? get() = expectedType(components) - class BodyResolveTransformerComponents( + open class BodyResolveTransformerComponents( override val session: FirSession, override val scopeSession: ScopeSession, val transformer: FirBodyResolveTransformer,