diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/CfaUtils.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/CfaUtils.kt index cd3c514ca57..c11c3c21fc8 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/CfaUtils.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/CfaUtils.kt @@ -123,16 +123,25 @@ class PropertyInitializationInfoCollector(private val localProperties: Set() - // before: { |-> { p1 |-> PI1 }, l1 |-> { p2 |-> PI2 } - for (label in dataForNode.keys) { - val dataPerLabel = dataForNode[label]!! - val existingKind = dataPerLabel[symbol] ?: EventOccurrencesRange.ZERO - val kind = existingKind + EventOccurrencesRange.EXACTLY_ONCE - resultMap = resultMap.put(label, dataPerLabel.put(symbol, kind)) - } - // after (if symbol is p1): - // { |-> { p1 |-> PI1 + 1 }, l1 |-> { p1 |-> [1, 1], p2 |-> PI2 } - return PathAwarePropertyInitializationInfo(resultMap) + return addRange(dataForNode, symbol, EventOccurrencesRange.EXACTLY_ONCE, ::PathAwarePropertyInitializationInfo) } -} \ No newline at end of file +} + +internal fun

, S : ControlFlowInfo, K : Any> addRange( + info: P, + key: K, + range: EventOccurrencesRange, + constructor: (PersistentMap) -> P +): P { + var resultMap = persistentMapOf() + // before: { |-> { p1 |-> PI1 }, l1 |-> { p2 |-> PI2 } } + for (label in info.keys) { + val dataPerLabel = info[label]!! + val existingKind = dataPerLabel[key] ?: EventOccurrencesRange.ZERO + val kind = existingKind + range + resultMap = resultMap.put(label, dataPerLabel.put(key, kind)) + } + // after (if key is p1): + // { |-> { p1 |-> PI1 + r }, l1 |-> { p1 |-> r, p2 |-> PI2 } } + return constructor(resultMap) +} 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 ef548a1d308..656fed1d504 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 @@ -289,17 +289,7 @@ object FirCallsEffectAnalyzer : FirControlFlowChecker() { ): PathAwareLambdaInvocationInfo { val symbol = referenceToSymbol(reference) return if (symbol != null) { - var resultMap = persistentMapOf() - // before: { |-> { p1 |-> PI1 }, l1 |-> { p2 |-> PI2 } - for (label in this.keys) { - val dataPerLabel = this[label]!! - val existingKind = dataPerLabel[symbol] ?: EventOccurrencesRange.ZERO - val kind = existingKind + range - resultMap = resultMap.put(label, dataPerLabel.put(symbol, kind)) - } - // after (if symbol is p1): - // { |-> { p1 |-> PI1 + r }, l1 |-> { p1 |-> r, p2 |-> PI2 } - PathAwareLambdaInvocationInfo(resultMap) + addRange(this, symbol, range, ::PathAwareLambdaInvocationInfo) } else this } }