[FIR] Add function for getting ConeEffectDeclaration from FirEffectDeclaration and use it where needed
This commit is contained in:
+3
-2
@@ -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.DiagnosticReporter
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||||
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
|
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.description.ConeCallsEffectDeclaration
|
||||||
import org.jetbrains.kotlin.fir.contracts.effects
|
import org.jetbrains.kotlin.fir.contracts.effects
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
|
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
|
||||||
@@ -45,7 +46,7 @@ object FirCallsEffectAnalyzer : FirControlFlowChecker() {
|
|||||||
override fun analyze(graph: ControlFlowGraph, reporter: DiagnosticReporter) {
|
override fun analyze(graph: ControlFlowGraph, reporter: DiagnosticReporter) {
|
||||||
val function = (graph.declaration as? FirFunction<*>) ?: return
|
val function = (graph.declaration as? FirFunction<*>) ?: return
|
||||||
if (function !is FirContractDescriptionOwner) 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>()
|
val functionalTypeEffects = mutableMapOf<AbstractFirBasedSymbol<*>, ConeCallsEffectDeclaration>()
|
||||||
|
|
||||||
@@ -276,7 +277,7 @@ object FirCallsEffectAnalyzer : FirControlFlowChecker() {
|
|||||||
get() = (this as? FirContractDescriptionOwner)?.contractDescription
|
get() = (this as? FirContractDescriptionOwner)?.contractDescription
|
||||||
|
|
||||||
private fun FirContractDescription?.getParameterCallsEffectDeclaration(index: Int): ConeCallsEffectDeclaration? {
|
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 }
|
val callsEffect = effects?.find { it is ConeCallsEffectDeclaration && it.valueParameterReference.parameterIndex == index }
|
||||||
return callsEffect as? ConeCallsEffectDeclaration?
|
return callsEffect as? ConeCallsEffectDeclaration?
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-1
@@ -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.DiagnosticReporter
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors
|
||||||
import org.jetbrains.kotlin.fir.contracts.FirResolvedContractDescription
|
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.contracts.description.*
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirContractDescriptionOwner
|
import org.jetbrains.kotlin.fir.declarations.FirContractDescriptionOwner
|
||||||
import org.jetbrains.kotlin.fir.declarations.FirFunction
|
import org.jetbrains.kotlin.fir.declarations.FirFunction
|
||||||
@@ -36,7 +37,7 @@ object FirReturnsImpliesAnalyzer : FirControlFlowChecker() {
|
|||||||
val dataFlowInfo = graphRef.dataFlowInfo
|
val dataFlowInfo = graphRef.dataFlowInfo
|
||||||
if (function !is FirContractDescriptionOwner || dataFlowInfo == null) return
|
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 }
|
?.filter { it is ConeConditionalEffectDeclaration && it.effect is ConeReturnsEffectDeclaration }
|
||||||
|
|
||||||
if (effects.isNullOrEmpty()) return
|
if (effects.isNullOrEmpty()) return
|
||||||
|
|||||||
@@ -12,6 +12,9 @@ import org.jetbrains.kotlin.fir.contracts.description.ConeEffectDeclaration
|
|||||||
val FirContractDescription.effects: List<FirEffectDeclaration>?
|
val FirContractDescription.effects: List<FirEffectDeclaration>?
|
||||||
get() = (this as? FirResolvedContractDescription)?.effects
|
get() = (this as? FirResolvedContractDescription)?.effects
|
||||||
|
|
||||||
|
val FirContractDescription.coneEffects: List<ConeEffectDeclaration>?
|
||||||
|
get() = effects?.map { it.effect }
|
||||||
|
|
||||||
fun ConeEffectDeclaration.toFirEffectDeclaration(source: FirSourceElement? = null): FirEffectDeclaration =
|
fun ConeEffectDeclaration.toFirEffectDeclaration(source: FirSourceElement? = null): FirEffectDeclaration =
|
||||||
buildEffectDeclaration {
|
buildEffectDeclaration {
|
||||||
if (source != null) {
|
if (source != null) {
|
||||||
|
|||||||
Reference in New Issue
Block a user