[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,