From faf212ca0413c2b922348c57646966a31d542f30 Mon Sep 17 00:00:00 2001 From: Dmitriy Novozhilov Date: Tue, 18 Apr 2023 14:19:33 +0300 Subject: [PATCH] [FIR] Don't extract contracts in DFA during non-body resolution stages --- .../kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt | 2 ++ .../resolve/transformers/FirAbstractPhaseTransformer.kt | 3 +-- .../jetbrains/kotlin/fir/declarations/FirResolvePhase.kt | 7 +++++++ 3 files changed, 10 insertions(+), 2 deletions(-) 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 3e62542dfbf..805cfcf4c4b 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 @@ -822,6 +822,8 @@ abstract class FirDataFlowAnalyzer( } private fun processConditionalContract(flow: MutableFlow, qualifiedAccess: FirStatement) { + // contracts has no effect on non-body resolve stages + if (!components.transformer.baseTransformerPhase.isBodyResolve) return val callee = when (qualifiedAccess) { is FirFunctionCall -> qualifiedAccess.toResolvedCallableSymbol()?.fir as? FirSimpleFunction is FirQualifiedAccessExpression -> qualifiedAccess.calleeReference.toResolvedPropertySymbol()?.fir?.getter diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractPhaseTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractPhaseTransformer.kt index 18b1d34ed52..1626f3485f8 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractPhaseTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirAbstractPhaseTransformer.kt @@ -6,14 +6,13 @@ package org.jetbrains.kotlin.fir.resolve.transformers import org.jetbrains.kotlin.fir.FirSession -import org.jetbrains.kotlin.fir.declarations.FirDeclaration import org.jetbrains.kotlin.fir.declarations.FirFile import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.visitors.FirDefaultTransformer import org.jetbrains.kotlin.fir.withFileAnalysisExceptionWrapping abstract class FirAbstractPhaseTransformer( - protected val baseTransformerPhase: FirResolvePhase + val baseTransformerPhase: FirResolvePhase ) : FirDefaultTransformer() { open val transformerPhase get() = baseTransformerPhase diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirResolvePhase.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirResolvePhase.kt index 21b7d12e216..1ba9d4c0aa2 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirResolvePhase.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/declarations/FirResolvePhase.kt @@ -39,3 +39,10 @@ enum class FirResolvePhase(val noProcessor: Boolean = false) { val ANALYZED_DEPENDENCIES = BODY_RESOLVE } } + +val FirResolvePhase.isBodyResolve: Boolean + get() = when (this) { + FirResolvePhase.BODY_RESOLVE, + FirResolvePhase.IMPLICIT_TYPES_BODY_RESOLVE -> true + else -> false + }