From b83aa88eff81e9b4ad093aaafb897ea40adb5735 Mon Sep 17 00:00:00 2001 From: Arsen Nagdalian Date: Fri, 14 Aug 2020 14:38:14 +0300 Subject: [PATCH] [FIR] Add function for getting ConeEffectDeclaration from FirEffectDeclaration and use it where needed --- .../kotlin/fir/analysis/cfa/FirCallsEffectAnalyzer.kt | 5 +++-- .../kotlin/fir/analysis/cfa/FirReturnsImpliesAnalyzer.kt | 3 ++- .../src/org/jetbrains/kotlin/fir/contracts/ContractUtils.kt | 3 +++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirCallsEffectAnalyzer.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirCallsEffectAnalyzer.kt index 8e39373505f..cc585a6e447 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirCallsEffectAnalyzer.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirCallsEffectAnalyzer.kt @@ -14,6 +14,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.cfa.FirControlFlowChecker import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.contracts.FirContractDescription +import org.jetbrains.kotlin.fir.contracts.coneEffects import org.jetbrains.kotlin.fir.contracts.description.ConeCallsEffectDeclaration import org.jetbrains.kotlin.fir.contracts.effects import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction @@ -45,7 +46,7 @@ object FirCallsEffectAnalyzer : FirControlFlowChecker() { override fun analyze(graph: ControlFlowGraph, reporter: DiagnosticReporter) { val function = (graph.declaration as? FirFunction<*>) ?: return if (function !is FirContractDescriptionOwner) return - if (function.contractDescription.effects?.any { it is ConeCallsEffectDeclaration } != true) return + if (function.contractDescription.coneEffects?.any { it is ConeCallsEffectDeclaration } != true) return val functionalTypeEffects = mutableMapOf, ConeCallsEffectDeclaration>() @@ -276,7 +277,7 @@ object FirCallsEffectAnalyzer : FirControlFlowChecker() { get() = (this as? FirContractDescriptionOwner)?.contractDescription private fun FirContractDescription?.getParameterCallsEffectDeclaration(index: Int): ConeCallsEffectDeclaration? { - val effects = this?.effects + val effects = this?.coneEffects val callsEffect = effects?.find { it is ConeCallsEffectDeclaration && it.valueParameterReference.parameterIndex == index } return callsEffect as? ConeCallsEffectDeclaration? } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirReturnsImpliesAnalyzer.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirReturnsImpliesAnalyzer.kt index 04905a1ded1..8756a7f30bc 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirReturnsImpliesAnalyzer.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirReturnsImpliesAnalyzer.kt @@ -11,6 +11,7 @@ import org.jetbrains.kotlin.fir.analysis.checkers.cfa.FirControlFlowChecker import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription +import org.jetbrains.kotlin.fir.contracts.coneEffects import org.jetbrains.kotlin.fir.contracts.description.* import org.jetbrains.kotlin.fir.declarations.FirContractDescriptionOwner import org.jetbrains.kotlin.fir.declarations.FirFunction @@ -36,7 +37,7 @@ object FirReturnsImpliesAnalyzer : FirControlFlowChecker() { val dataFlowInfo = graphRef.dataFlowInfo if (function !is FirContractDescriptionOwner || dataFlowInfo == null) return - val effects = (function.contractDescription as? FirResolvedContractDescription)?.effects + val effects = (function.contractDescription as? FirResolvedContractDescription)?.coneEffects ?.filter { it is ConeConditionalEffectDeclaration && it.effect is ConeReturnsEffectDeclaration } if (effects.isNullOrEmpty()) return diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/ContractUtils.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/ContractUtils.kt index 37960de9adc..d9dce0bf8a8 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/ContractUtils.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/contracts/ContractUtils.kt @@ -12,6 +12,9 @@ import org.jetbrains.kotlin.fir.contracts.description.ConeEffectDeclaration val FirContractDescription.effects: List? get() = (this as? FirResolvedContractDescription)?.effects +val FirContractDescription.coneEffects: List? + get() = effects?.map { it.effect } + fun ConeEffectDeclaration.toFirEffectDeclaration(source: FirSourceElement? = null): FirEffectDeclaration = buildEffectDeclaration { if (source != null) {