From 584280bdd404b96083e3226f41ff44c709906fde Mon Sep 17 00:00:00 2001 From: Ivan Kochurkin Date: Tue, 13 Dec 2022 19:44:40 +0100 Subject: [PATCH] [FIR] Use lazy PropertyInitializationInfoData in FirPropertyInitializationChecker --- .../AbstractFirPropertyInitializationChecker.kt | 6 ++---- .../fir/analysis/cfa/FirControlFlowAnalyzer.kt | 16 +++++++++++++++- .../cfa/FirPropertyInitializationAnalyzer.kt | 4 ++-- .../checkers/extended/CanBeValChecker.kt | 6 +++--- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/AbstractFirPropertyInitializationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/AbstractFirPropertyInitializationChecker.kt index 47ad2b4be9a..7eac2525e6b 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/AbstractFirPropertyInitializationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/AbstractFirPropertyInitializationChecker.kt @@ -5,11 +5,9 @@ package org.jetbrains.kotlin.fir.analysis.cfa -import org.jetbrains.kotlin.fir.analysis.cfa.util.PathAwarePropertyInitializationInfo -import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment -import org.jetbrains.kotlin.fir.resolve.dfa.cfg.CFGNode import org.jetbrains.kotlin.fir.resolve.dfa.cfg.ControlFlowGraph import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol @@ -17,7 +15,7 @@ abstract class AbstractFirPropertyInitializationChecker { abstract fun analyze( graph: ControlFlowGraph, reporter: DiagnosticReporter, - data: Map, PathAwarePropertyInitializationInfo>, + data: PropertyInitializationInfoData, properties: Set, capturedWrites: Set, context: CheckerContext diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirControlFlowAnalyzer.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirControlFlowAnalyzer.kt index 52378048dc5..9926aa44723 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirControlFlowAnalyzer.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirControlFlowAnalyzer.kt @@ -12,11 +12,14 @@ import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.declaration.DeclarationCheckers import org.jetbrains.kotlin.fir.analysis.checkersComponent import org.jetbrains.kotlin.diagnostics.DiagnosticReporter +import org.jetbrains.kotlin.fir.analysis.cfa.util.PathAwarePropertyInitializationInfo import org.jetbrains.kotlin.fir.declarations.FirClass import org.jetbrains.kotlin.fir.declarations.FirFunction import org.jetbrains.kotlin.fir.declarations.FirProperty import org.jetbrains.kotlin.fir.declarations.FirPropertyAccessor +import org.jetbrains.kotlin.fir.resolve.dfa.cfg.CFGNode import org.jetbrains.kotlin.fir.resolve.dfa.cfg.ControlFlowGraph +import org.jetbrains.kotlin.fir.symbols.impl.FirPropertySymbol class FirControlFlowAnalyzer( session: FirSession, @@ -65,7 +68,18 @@ class FirControlFlowAnalyzer( private fun runAssignmentCfaCheckers(graph: ControlFlowGraph, reporter: DiagnosticReporter, context: CheckerContext) { val (properties, capturedWrites) = LocalPropertyAndCapturedWriteCollector.collect(graph) if (properties.isEmpty()) return - val data = PropertyInitializationInfoCollector(properties).getData(graph) + val data = PropertyInitializationInfoData(properties, graph) variableAssignmentCheckers.forEach { it.analyze(graph, reporter, data, properties, capturedWrites, context) } } } + +class PropertyInitializationInfoData(properties: Set, graph: ControlFlowGraph) { + private val data by lazy(LazyThreadSafetyMode.NONE) { + PropertyInitializationInfoCollector(properties).getData(graph) + } + + fun getValue(node: CFGNode<*>): PathAwarePropertyInitializationInfo { + return data.getValue(node) + } +} + diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirPropertyInitializationAnalyzer.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirPropertyInitializationAnalyzer.kt index 9802f2efa7c..c33eeb801b7 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirPropertyInitializationAnalyzer.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/cfa/FirPropertyInitializationAnalyzer.kt @@ -30,7 +30,7 @@ object FirPropertyInitializationAnalyzer : AbstractFirPropertyInitializationChec override fun analyze( graph: ControlFlowGraph, reporter: DiagnosticReporter, - data: Map, PathAwarePropertyInitializationInfo>, + data: PropertyInitializationInfoData, properties: Set, capturedWrites: Set, context: CheckerContext @@ -47,7 +47,7 @@ object FirPropertyInitializationAnalyzer : AbstractFirPropertyInitializationChec } private class PropertyReporter( - val data: Map, PathAwarePropertyInitializationInfo>, + val data: PropertyInitializationInfoData, val localProperties: Set, val capturedWrites: Set, val reporter: DiagnosticReporter, diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/CanBeValChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/CanBeValChecker.kt index 2c7997928ca..b8bb330e80d 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/CanBeValChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/extended/CanBeValChecker.kt @@ -12,12 +12,12 @@ import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.cfa.AbstractFirPropertyInitializationChecker -import org.jetbrains.kotlin.fir.analysis.cfa.util.PathAwarePropertyInitializationInfo import org.jetbrains.kotlin.fir.analysis.cfa.util.TraverseDirection import org.jetbrains.kotlin.fir.analysis.cfa.util.traverse import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.getChildren import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors +import org.jetbrains.kotlin.fir.analysis.cfa.PropertyInitializationInfoData import org.jetbrains.kotlin.fir.expressions.FirVariableAssignment import org.jetbrains.kotlin.fir.references.toResolvedPropertySymbol import org.jetbrains.kotlin.fir.resolve.dfa.cfg.* @@ -27,7 +27,7 @@ object CanBeValChecker : AbstractFirPropertyInitializationChecker() { override fun analyze( graph: ControlFlowGraph, reporter: DiagnosticReporter, - data: Map, PathAwarePropertyInitializationInfo>, + data: PropertyInitializationInfoData, properties: Set, capturedWrites: Set, context: CheckerContext @@ -77,7 +77,7 @@ object CanBeValChecker : AbstractFirPropertyInitializationChecker() { value in canBeValOccurrenceRanges && symbol.isVar private class UninitializedPropertyReporter( - val data: Map, PathAwarePropertyInitializationInfo>, + val data: PropertyInitializationInfoData, val localProperties: Set, val unprocessedProperties: MutableSet, val propertiesCharacteristics: MutableMap