[FIR] Add function for getting ConeEffectDeclaration from FirEffectDeclaration and use it where needed

This commit is contained in:
Arsen Nagdalian
2020-08-14 14:38:14 +03:00
parent 991b18fec4
commit b83aa88eff
3 changed files with 8 additions and 3 deletions
@@ -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<AbstractFirBasedSymbol<*>, 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?
}
@@ -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
@@ -12,6 +12,9 @@ import org.jetbrains.kotlin.fir.contracts.description.ConeEffectDeclaration
val FirContractDescription.effects: List<FirEffectDeclaration>?
get() = (this as? FirResolvedContractDescription)?.effects
val FirContractDescription.coneEffects: List<ConeEffectDeclaration>?
get() = effects?.map { it.effect }
fun ConeEffectDeclaration.toFirEffectDeclaration(source: FirSourceElement? = null): FirEffectDeclaration =
buildEffectDeclaration {
if (source != null) {