[FIR] FirForLoop - rebase FirForLoopChecker
diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/Main.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/Main.kt
index f62e2ba..b4972f6 100644
--- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/Main.kt
+++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/Main.kt
@@ -182,6 +182,7 @@
alias<FirCallableReferenceAccess>("CallableReferenceAccessChecker")
alias<FirThisReceiverExpression>("ThisReceiverExpressionChecker")
alias<FirWhileLoop>("WhileLoopChecker")
+ alias<FirForLoopWrapper>("FirForLoopChecker")
alias<FirThrowExpression>("ThrowExpressionChecker")
alias<FirDoWhileLoop>("DoWhileLoopChecker")
alias<FirArrayLiteral>("ArrayLiteralChecker")
diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ComposedExpressionCheckers.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ComposedExpressionCheckers.kt
index fe30bb9..9b0fc88 100644
--- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ComposedExpressionCheckers.kt
+++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ComposedExpressionCheckers.kt
@@ -75,6 +75,8 @@
get() = _thisReceiverExpressionCheckers
override val whileLoopCheckers: Set<FirWhileLoopChecker>
get() = _whileLoopCheckers
+ override val forLoopCheckers: Set<FirForLoopChecker>
+ get() = _forLoopCheckers
override val throwExpressionCheckers: Set<FirThrowExpressionChecker>
get() = _throwExpressionCheckers
override val doWhileLoopCheckers: Set<FirDoWhileLoopChecker>
@@ -115,6 +117,7 @@
private val _callableReferenceAccessCheckers: MutableSet<FirCallableReferenceAccessChecker> = mutableSetOf()
private val _thisReceiverExpressionCheckers: MutableSet<FirThisReceiverExpressionChecker> = mutableSetOf()
private val _whileLoopCheckers: MutableSet<FirWhileLoopChecker> = mutableSetOf()
+ private val _forLoopCheckers: MutableSet<FirForLoopChecker> = mutableSetOf()
private val _throwExpressionCheckers: MutableSet<FirThrowExpressionChecker> = mutableSetOf()
private val _doWhileLoopCheckers: MutableSet<FirDoWhileLoopChecker> = mutableSetOf()
private val _arrayLiteralCheckers: MutableSet<FirArrayLiteralChecker> = mutableSetOf()
@@ -152,6 +155,7 @@
checkers.callableReferenceAccessCheckers.filterTo(_callableReferenceAccessCheckers, predicate)
checkers.thisReceiverExpressionCheckers.filterTo(_thisReceiverExpressionCheckers, predicate)
checkers.whileLoopCheckers.filterTo(_whileLoopCheckers, predicate)
+ checkers.forLoopCheckers.filterTo(_forLoopCheckers, predicate)
checkers.throwExpressionCheckers.filterTo(_throwExpressionCheckers, predicate)
checkers.doWhileLoopCheckers.filterTo(_doWhileLoopCheckers, predicate)
checkers.arrayLiteralCheckers.filterTo(_arrayLiteralCheckers, predicate)
diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ExpressionCheckers.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ExpressionCheckers.kt
index e54879e..9be2a29 100644
--- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ExpressionCheckers.kt
+++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ExpressionCheckers.kt
@@ -46,6 +46,7 @@
open val callableReferenceAccessCheckers: Set<FirCallableReferenceAccessChecker> = emptySet()
open val thisReceiverExpressionCheckers: Set<FirThisReceiverExpressionChecker> = emptySet()
open val whileLoopCheckers: Set<FirWhileLoopChecker> = emptySet()
+ open val forLoopCheckers: Set<FirForLoopChecker> = emptySet()
open val throwExpressionCheckers: Set<FirThrowExpressionChecker> = emptySet()
open val doWhileLoopCheckers: Set<FirDoWhileLoopChecker> = emptySet()
open val arrayLiteralCheckers: Set<FirArrayLiteralChecker> = emptySet()
@@ -81,6 +82,7 @@
@CheckersComponentInternal internal val allCallableReferenceAccessCheckers: Array<FirCallableReferenceAccessChecker> by lazy { (callableReferenceAccessCheckers + qualifiedAccessExpressionCheckers + basicExpressionCheckers).toTypedArray() }
@CheckersComponentInternal internal val allThisReceiverExpressionCheckers: Array<FirThisReceiverExpressionChecker> by lazy { (thisReceiverExpressionCheckers + qualifiedAccessExpressionCheckers + basicExpressionCheckers).toTypedArray() }
@CheckersComponentInternal internal val allWhileLoopCheckers: Array<FirWhileLoopChecker> by lazy { (whileLoopCheckers + loopExpressionCheckers + basicExpressionCheckers).toTypedArray() }
+ @CheckersComponentInternal internal val allForLoopCheckers: Array<FirForLoopChecker> by lazy { (forLoopCheckers + basicExpressionCheckers).toTypedArray() }
@CheckersComponentInternal internal val allThrowExpressionCheckers: Array<FirThrowExpressionChecker> by lazy { (throwExpressionCheckers + basicExpressionCheckers).toTypedArray() }
@CheckersComponentInternal internal val allDoWhileLoopCheckers: Array<FirDoWhileLoopChecker> by lazy { (doWhileLoopCheckers + loopExpressionCheckers + basicExpressionCheckers).toTypedArray() }
@CheckersComponentInternal internal val allArrayLiteralCheckers: Array<FirArrayLiteralChecker> by lazy { (arrayLiteralCheckers + basicExpressionCheckers + callCheckers).toTypedArray() }
diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ExpressionCheckersDiagnosticComponent.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ExpressionCheckersDiagnosticComponent.kt
index a63da6b..13fbb8e 100644
--- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ExpressionCheckersDiagnosticComponent.kt
+++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/ExpressionCheckersDiagnosticComponent.kt
@@ -143,6 +143,10 @@
checkers.allWhileLoopCheckers.check(whileLoop, data)
}
+ override fun visitForLoopWrapper(forLoopWrapper: FirForLoopWrapper, data: CheckerContext) {
+ checkers.allForLoopCheckers.check(forLoopWrapper, data)
+ }
+
override fun visitThrowExpression(throwExpression: FirThrowExpression, data: CheckerContext) {
checkers.allThrowExpressionCheckers.check(throwExpression, data)
}
diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirExpressionCheckerAliases.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirExpressionCheckerAliases.kt
index d813145..946fdc4 100644
--- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirExpressionCheckerAliases.kt
+++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirExpressionCheckerAliases.kt
@@ -22,6 +22,7 @@
import org.jetbrains.kotlin.fir.expressions.FirDoWhileLoop
import org.jetbrains.kotlin.fir.expressions.FirElvisExpression
import org.jetbrains.kotlin.fir.expressions.FirEqualityOperatorCall
+import org.jetbrains.kotlin.fir.expressions.FirForLoopWrapper
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirGetClassCall
import org.jetbrains.kotlin.fir.expressions.FirInaccessibleReceiverExpression
@@ -74,6 +75,7 @@
typealias FirCallableReferenceAccessChecker = FirExpressionChecker<FirCallableReferenceAccess>
typealias FirThisReceiverExpressionChecker = FirExpressionChecker<FirThisReceiverExpression>
typealias FirWhileLoopChecker = FirExpressionChecker<FirWhileLoop>
+typealias FirForLoopChecker = FirExpressionChecker<FirForLoopWrapper>
typealias FirThrowExpressionChecker = FirExpressionChecker<FirThrowExpression>
typealias FirDoWhileLoopChecker = FirExpressionChecker<FirDoWhileLoop>
typealias FirArrayLiteralChecker = FirExpressionChecker<FirArrayLiteral>
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt
index c72c320..a176875 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/CommonExpressionCheckers.kt
@@ -131,11 +131,15 @@
override val blockCheckers: Set<FirBlockChecker>
get() = setOf(
- FirForLoopChecker,
FirConflictsExpressionChecker,
FirSingleNamedFunctionChecker,
)
+ override val forLoopCheckers: Set<FirForLoopChecker>
+ get() = setOf(
+ FirForLoopBasicChecker,
+ )
+
override val checkNotNullCallCheckers: Set<FirCheckNotNullCallChecker>
get() = setOf(
FirNotNullAssertionChecker,
diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirForLoopChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirForLoopChecker.kt
index 8d477bf..d0c31e0 100644
--- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirForLoopChecker.kt
+++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirForLoopChecker.kt
@@ -27,7 +27,7 @@
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.OPERATOR_MODIFIER_REQUIRED
import org.jetbrains.kotlin.fir.declarations.FirProperty
import org.jetbrains.kotlin.fir.declarations.utils.isOperator
-import org.jetbrains.kotlin.fir.expressions.FirBlock
+import org.jetbrains.kotlin.fir.expressions.FirForLoopWrapper
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirWhileLoop
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
@@ -39,14 +39,11 @@
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.util.OperatorNameConventions
-object FirForLoopChecker : FirBlockChecker(MppCheckerKind.Common) {
- override fun check(expression: FirBlock, context: CheckerContext, reporter: DiagnosticReporter) {
- if (expression.source?.kind != KtFakeSourceElementKind.DesugaredForLoop) return
-
+object FirForLoopBasicChecker : FirForLoopChecker(MppCheckerKind.Common) {
+ override fun check(expression: FirForLoopWrapper, context: CheckerContext, reporter: DiagnosticReporter) {
val statements = expression.statements
val iteratorDeclaration = statements[0] as? FirProperty ?: return
val whileLoop = statements[1] as? FirWhileLoop ?: return
- if (iteratorDeclaration.source?.kind != KtFakeSourceElementKind.DesugaredForLoop) return
val iteratorCall = iteratorDeclaration.initializer as FirFunctionCall
val source = iteratorCall.explicitReceiver?.source ?: iteratorCall.source
if (checkSpecialFunctionCall(
@@ -74,7 +71,6 @@
)
val loopParameter = whileLoop.block.statements.firstOrNull() as? FirProperty ?: return
- if (loopParameter.initializer?.source?.kind != KtFakeSourceElementKind.DesugaredForLoop) return
val nextCall = loopParameter.initializer as FirFunctionCall
checkSpecialFunctionCall(
nextCall,