[FIR] Add checkerContext parameter to ControlFlowAnalyserCheckers
This commit is contained in:
+2
-2
@@ -11,12 +11,12 @@ import org.jetbrains.kotlin.contracts.description.EventOccurrencesRange
|
|||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.FirSourceElement
|
import org.jetbrains.kotlin.fir.FirSourceElement
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.cfa.FirControlFlowChecker
|
import org.jetbrains.kotlin.fir.analysis.checkers.cfa.FirControlFlowChecker
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||||
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.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.declarations.FirAnonymousFunction
|
import org.jetbrains.kotlin.fir.declarations.FirAnonymousFunction
|
||||||
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
|
||||||
@@ -43,7 +43,7 @@ import kotlin.contracts.contract
|
|||||||
|
|
||||||
object FirCallsEffectAnalyzer : FirControlFlowChecker() {
|
object FirCallsEffectAnalyzer : FirControlFlowChecker() {
|
||||||
|
|
||||||
override fun analyze(graph: ControlFlowGraph, reporter: DiagnosticReporter) {
|
override fun analyze(graph: ControlFlowGraph, reporter: DiagnosticReporter, checkerContext: CheckerContext) {
|
||||||
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.coneEffects?.any { it is ConeCallsEffectDeclaration } != true) return
|
if (function.contractDescription.coneEffects?.any { it is ConeCallsEffectDeclaration } != true) return
|
||||||
|
|||||||
+4
-4
@@ -21,13 +21,13 @@ class FirControlFlowAnalyzer(session: FirSession) {
|
|||||||
|
|
||||||
fun analyzeClassInitializer(klass: FirClass<*>, graph: ControlFlowGraph, context: CheckerContext, reporter: DiagnosticReporter) {
|
fun analyzeClassInitializer(klass: FirClass<*>, graph: ControlFlowGraph, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||||
if (graph.owner != null) return
|
if (graph.owner != null) return
|
||||||
cfaCheckers.forEach { it.analyze(graph, reporter) }
|
cfaCheckers.forEach { it.analyze(graph, reporter, context) }
|
||||||
}
|
}
|
||||||
|
|
||||||
fun analyzeFunction(function: FirFunction<*>, graph: ControlFlowGraph, context: CheckerContext, reporter: DiagnosticReporter) {
|
fun analyzeFunction(function: FirFunction<*>, graph: ControlFlowGraph, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||||
if (graph.owner != null) return
|
if (graph.owner != null) return
|
||||||
|
|
||||||
cfaCheckers.forEach { it.analyze(graph, reporter) }
|
cfaCheckers.forEach { it.analyze(graph, reporter, context) }
|
||||||
if (context.containingDeclarations.any { it is FirProperty || it is FirFunction<*> }) return
|
if (context.containingDeclarations.any { it is FirProperty || it is FirFunction<*> }) return
|
||||||
runAssignmentCfaCheckers(graph, reporter)
|
runAssignmentCfaCheckers(graph, reporter)
|
||||||
}
|
}
|
||||||
@@ -35,14 +35,14 @@ class FirControlFlowAnalyzer(session: FirSession) {
|
|||||||
fun analyzePropertyInitializer(property: FirProperty, graph: ControlFlowGraph, context: CheckerContext, reporter: DiagnosticReporter) {
|
fun analyzePropertyInitializer(property: FirProperty, graph: ControlFlowGraph, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||||
if (graph.owner != null) return
|
if (graph.owner != null) return
|
||||||
|
|
||||||
cfaCheckers.forEach { it.analyze(graph, reporter) }
|
cfaCheckers.forEach { it.analyze(graph, reporter, context) }
|
||||||
runAssignmentCfaCheckers(graph, reporter)
|
runAssignmentCfaCheckers(graph, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun analyzePropertyAccessor(accessor: FirPropertyAccessor, graph: ControlFlowGraph, context: CheckerContext, reporter: DiagnosticReporter) {
|
fun analyzePropertyAccessor(accessor: FirPropertyAccessor, graph: ControlFlowGraph, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||||
if (graph.owner != null) return
|
if (graph.owner != null) return
|
||||||
|
|
||||||
cfaCheckers.forEach { it.analyze(graph, reporter) }
|
cfaCheckers.forEach { it.analyze(graph, reporter, context) }
|
||||||
runAssignmentCfaCheckers(graph, reporter)
|
runAssignmentCfaCheckers(graph, reporter)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+6
-2
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.analysis.cfa
|
|||||||
import org.jetbrains.kotlin.fir.BuiltinTypes
|
import org.jetbrains.kotlin.fir.BuiltinTypes
|
||||||
import org.jetbrains.kotlin.fir.FirSession
|
import org.jetbrains.kotlin.fir.FirSession
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.cfa.FirControlFlowChecker
|
import org.jetbrains.kotlin.fir.analysis.checkers.cfa.FirControlFlowChecker
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||||
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
|
||||||
@@ -23,7 +24,10 @@ import org.jetbrains.kotlin.fir.resolve.dfa.cfg.ControlFlowGraph
|
|||||||
import org.jetbrains.kotlin.fir.resolve.dfa.cfg.JumpNode
|
import org.jetbrains.kotlin.fir.resolve.dfa.cfg.JumpNode
|
||||||
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
import org.jetbrains.kotlin.fir.symbols.AbstractFirBasedSymbol
|
||||||
import org.jetbrains.kotlin.fir.typeContext
|
import org.jetbrains.kotlin.fir.typeContext
|
||||||
import org.jetbrains.kotlin.fir.types.*
|
import org.jetbrains.kotlin.fir.types.ConeKotlinType
|
||||||
|
import org.jetbrains.kotlin.fir.types.coneType
|
||||||
|
import org.jetbrains.kotlin.fir.types.intersectTypesOrNull
|
||||||
|
import org.jetbrains.kotlin.fir.types.isNullable
|
||||||
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
||||||
import org.jetbrains.kotlin.types.model.KotlinTypeMarker
|
import org.jetbrains.kotlin.types.model.KotlinTypeMarker
|
||||||
import org.jetbrains.kotlin.types.model.TypeCheckerProviderContext
|
import org.jetbrains.kotlin.types.model.TypeCheckerProviderContext
|
||||||
@@ -31,7 +35,7 @@ import org.jetbrains.kotlin.utils.addIfNotNull
|
|||||||
|
|
||||||
object FirReturnsImpliesAnalyzer : FirControlFlowChecker() {
|
object FirReturnsImpliesAnalyzer : FirControlFlowChecker() {
|
||||||
|
|
||||||
override fun analyze(graph: ControlFlowGraph, reporter: DiagnosticReporter) {
|
override fun analyze(graph: ControlFlowGraph, reporter: DiagnosticReporter, checkerContext: CheckerContext) {
|
||||||
val function = graph.declaration as? FirFunction<*> ?: return
|
val function = graph.declaration as? FirFunction<*> ?: return
|
||||||
val graphRef = function.controlFlowGraphReference as FirControlFlowGraphReferenceImpl
|
val graphRef = function.controlFlowGraphReference as FirControlFlowGraphReferenceImpl
|
||||||
val dataFlowInfo = graphRef.dataFlowInfo
|
val dataFlowInfo = graphRef.dataFlowInfo
|
||||||
|
|||||||
+2
-1
@@ -5,9 +5,10 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.fir.analysis.checkers.cfa
|
package org.jetbrains.kotlin.fir.analysis.checkers.cfa
|
||||||
|
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext
|
||||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
import org.jetbrains.kotlin.fir.analysis.diagnostics.DiagnosticReporter
|
||||||
import org.jetbrains.kotlin.fir.resolve.dfa.cfg.ControlFlowGraph
|
import org.jetbrains.kotlin.fir.resolve.dfa.cfg.ControlFlowGraph
|
||||||
|
|
||||||
abstract class FirControlFlowChecker {
|
abstract class FirControlFlowChecker {
|
||||||
abstract fun analyze(graph: ControlFlowGraph, reporter: DiagnosticReporter)
|
abstract fun analyze(graph: ControlFlowGraph, reporter: DiagnosticReporter, checkerContext: CheckerContext)
|
||||||
}
|
}
|
||||||
+5
-1
@@ -6,6 +6,7 @@
|
|||||||
package org.jetbrains.kotlin.fir.analysis.checkers.declaration
|
package org.jetbrains.kotlin.fir.analysis.checkers.declaration
|
||||||
|
|
||||||
import org.jetbrains.kotlin.fir.analysis.cfa.AbstractFirPropertyInitializationChecker
|
import org.jetbrains.kotlin.fir.analysis.cfa.AbstractFirPropertyInitializationChecker
|
||||||
|
import org.jetbrains.kotlin.fir.analysis.checkers.cfa.FirControlFlowChecker
|
||||||
import org.jetbrains.kotlin.fir.analysis.checkers.extended.*
|
import org.jetbrains.kotlin.fir.analysis.checkers.extended.*
|
||||||
|
|
||||||
object ExtendedDeclarationCheckers : DeclarationCheckers() {
|
object ExtendedDeclarationCheckers : DeclarationCheckers() {
|
||||||
@@ -21,6 +22,9 @@ object ExtendedDeclarationCheckers : DeclarationCheckers() {
|
|||||||
)
|
)
|
||||||
|
|
||||||
override val variableAssignmentCfaBasedCheckers: List<AbstractFirPropertyInitializationChecker> = listOf(
|
override val variableAssignmentCfaBasedCheckers: List<AbstractFirPropertyInitializationChecker> = listOf(
|
||||||
VariableAssignmentChecker
|
CanBeValChecker,
|
||||||
|
)
|
||||||
|
override val controlFlowAnalyserCheckers: List<FirControlFlowChecker> = listOf(
|
||||||
|
UnusedChecker
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user