[FIR] Use lazy PropertyInitializationInfoData in FirPropertyInitializationChecker

This commit is contained in:
Ivan Kochurkin
2022-12-13 19:44:40 +01:00
committed by Space Team
parent 6aca5e3037
commit 584280bdd4
4 changed files with 22 additions and 10 deletions
@@ -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<CFGNode<*>, PathAwarePropertyInitializationInfo>,
data: PropertyInitializationInfoData,
properties: Set<FirPropertySymbol>,
capturedWrites: Set<FirVariableAssignment>,
context: CheckerContext
@@ -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<FirPropertySymbol>, graph: ControlFlowGraph) {
private val data by lazy(LazyThreadSafetyMode.NONE) {
PropertyInitializationInfoCollector(properties).getData(graph)
}
fun getValue(node: CFGNode<*>): PathAwarePropertyInitializationInfo {
return data.getValue(node)
}
}
@@ -30,7 +30,7 @@ object FirPropertyInitializationAnalyzer : AbstractFirPropertyInitializationChec
override fun analyze(
graph: ControlFlowGraph,
reporter: DiagnosticReporter,
data: Map<CFGNode<*>, PathAwarePropertyInitializationInfo>,
data: PropertyInitializationInfoData,
properties: Set<FirPropertySymbol>,
capturedWrites: Set<FirVariableAssignment>,
context: CheckerContext
@@ -47,7 +47,7 @@ object FirPropertyInitializationAnalyzer : AbstractFirPropertyInitializationChec
}
private class PropertyReporter(
val data: Map<CFGNode<*>, PathAwarePropertyInitializationInfo>,
val data: PropertyInitializationInfoData,
val localProperties: Set<FirPropertySymbol>,
val capturedWrites: Set<FirVariableAssignment>,
val reporter: DiagnosticReporter,
@@ -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<CFGNode<*>, PathAwarePropertyInitializationInfo>,
data: PropertyInitializationInfoData,
properties: Set<FirPropertySymbol>,
capturedWrites: Set<FirVariableAssignment>,
context: CheckerContext
@@ -77,7 +77,7 @@ object CanBeValChecker : AbstractFirPropertyInitializationChecker() {
value in canBeValOccurrenceRanges && symbol.isVar
private class UninitializedPropertyReporter(
val data: Map<CFGNode<*>, PathAwarePropertyInitializationInfo>,
val data: PropertyInitializationInfoData,
val localProperties: Set<FirPropertySymbol>,
val unprocessedProperties: MutableSet<FirPropertySymbol>,
val propertiesCharacteristics: MutableMap<FirPropertySymbol, EventOccurrencesRange>