[FIR] KT-58284: Prevent missing diagnostics on for loops
^KT-58284 Fixed
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java
index 4a96659..de7b301 100644
--- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java
+++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java
@@ -628,6 +628,12 @@
}
@Test
+ @TestMetadata("missingIteratorMissing.kt")
+ public void testMissingIteratorMissing() throws Exception {
+ runTest("compiler/testData/diagnostics/tests/missingIteratorMissing.kt");
+ }
+
+ @Test
@TestMetadata("MultilineStringTemplates.kt")
public void testMultilineStringTemplates() throws Exception {
runTest("compiler/testData/diagnostics/tests/MultilineStringTemplates.kt");
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java
index 8fe1708..89d66a9 100644
--- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java
+++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java
@@ -628,6 +628,12 @@
}
@Test
+ @TestMetadata("missingIteratorMissing.kt")
+ public void testMissingIteratorMissing() throws Exception {
+ runTest("compiler/testData/diagnostics/tests/missingIteratorMissing.kt");
+ }
+
+ @Test
@TestMetadata("MultilineStringTemplates.kt")
public void testMultilineStringTemplates() throws Exception {
runTest("compiler/testData/diagnostics/tests/MultilineStringTemplates.kt");
diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java
index 46992b6..965fbbb 100644
--- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java
+++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java
@@ -628,6 +628,12 @@
}
@Test
+ @TestMetadata("missingIteratorMissing.kt")
+ public void testMissingIteratorMissing() throws Exception {
+ runTest("compiler/testData/diagnostics/tests/missingIteratorMissing.kt");
+ }
+
+ @Test
@TestMetadata("MultilineStringTemplates.kt")
public void testMultilineStringTemplates() throws Exception {
runTest("compiler/testData/diagnostics/tests/MultilineStringTemplates.kt");
diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java
index 9e78460..972a771 100644
--- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java
+++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java
@@ -628,6 +628,12 @@
}
@Test
+ @TestMetadata("missingIteratorMissing.kt")
+ public void testMissingIteratorMissing() throws Exception {
+ runTest("compiler/testData/diagnostics/tests/missingIteratorMissing.kt");
+ }
+
+ @Test
@TestMetadata("MultilineStringTemplates.kt")
public void testMultilineStringTemplates() throws Exception {
runTest("compiler/testData/diagnostics/tests/MultilineStringTemplates.kt");
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 b7bfc01..b98dedf 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
@@ -26,12 +26,9 @@
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.diagnostics.FirDiagnosticHolder
import org.jetbrains.kotlin.fir.expressions.FirBlock
import org.jetbrains.kotlin.fir.expressions.FirFunctionCall
import org.jetbrains.kotlin.fir.expressions.FirWhileLoop
-import org.jetbrains.kotlin.fir.references.FirErrorNamedReference
-import org.jetbrains.kotlin.fir.references.FirResolvedErrorReference
import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference
import org.jetbrains.kotlin.fir.references.isError
import org.jetbrains.kotlin.fir.resolve.calls.UnsafeCall
@@ -42,6 +39,7 @@
import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol
import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol
import org.jetbrains.kotlin.resolve.calls.tower.isSuccess
+import org.jetbrains.kotlin.util.OperatorNameConventions
object FirForLoopChecker : FirBlockChecker() {
override fun check(expression: FirBlock, context: CheckerContext, reporter: DiagnosticReporter) {
@@ -118,8 +116,16 @@
is ConeUnresolvedNameError -> {
reporter.reportOn(reportSource, missingFactory, context)
}
- is ConeInapplicableWrongReceiver -> noneApplicableFactory?.let {
- reporter.reportOn(reportSource, it, diagnostic.candidateSymbols, context)
+ is ConeInapplicableWrongReceiver -> when {
+ noneApplicableFactory != null -> {
+ reporter.reportOn(reportSource, noneApplicableFactory, diagnostic.candidateSymbols, context)
+ }
+ calleeReference.name == OperatorNameConventions.ITERATOR -> {
+ reporter.reportOn(reportSource, missingFactory, context)
+ }
+ else -> {
+ error("ConeInapplicableWrongReceiver, but no diagnostic reported")
+ }
}
is ConeInapplicableCandidateError -> {
if (unsafeCallFactory != null || noneApplicableFactory != null) {
diff --git a/compiler/testData/diagnostics/tests/missingIteratorMissing.kt b/compiler/testData/diagnostics/tests/missingIteratorMissing.kt
new file mode 100644
index 0000000..9327b5a
--- /dev/null
+++ b/compiler/testData/diagnostics/tests/missingIteratorMissing.kt
@@ -0,0 +1,8 @@
+// FIR_IDENTICAL
+// ISSUE: KT-58284
+
+fun foo() {
+ for (i in <!ITERATOR_MISSING!>0<!>) {}
+}
+
+fun String.iterator(): Iterator<Int> = TODO()
diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java
index b051291..a72e792 100644
--- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java
+++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java
@@ -628,6 +628,12 @@
}
@Test
+ @TestMetadata("missingIteratorMissing.kt")
+ public void testMissingIteratorMissing() throws Exception {
+ runTest("compiler/testData/diagnostics/tests/missingIteratorMissing.kt");
+ }
+
+ @Test
@TestMetadata("MultilineStringTemplates.kt")
public void testMultilineStringTemplates() throws Exception {
runTest("compiler/testData/diagnostics/tests/MultilineStringTemplates.kt");