From 834ba397ad371655d3a5a6305ae987ebbeef214a Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Fri, 12 May 2023 15:06:58 +0300 Subject: [PATCH] [FIR] KT-58284: Prevent missing diagnostics on for loops ^KT-58284 Fixed --- ...ticCompilerTestFE10TestdataTestGenerated.java | 6 ++++++ ...gnosticCompilerFE10TestDataTestGenerated.java | 6 ++++++ ...tTreeOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ ...irPsiOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ .../checkers/expression/FirForLoopChecker.kt | 16 +++++++++++----- .../diagnostics/tests/missingIteratorMissing.kt | 8 ++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++++ 7 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/missingIteratorMissing.kt 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 40cf8873b85..c6568d4cdce 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 @@ -627,6 +627,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/localInterfaces.kt"); } + @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 { 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 0fb6f544c5f..822391b2a39 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 @@ -627,6 +627,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/localInterfaces.kt"); } + @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 { 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 35899c54390..6d73e430e77 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 @@ -627,6 +627,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/localInterfaces.kt"); } + @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 { 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 2f9596eced8..953fd5c7731 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 @@ -627,6 +627,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/localInterfaces.kt"); } + @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 { 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 b7bfc012835..b98dedfd30d 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.NEXT_NONE_APPLICA 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.resolve.diagnostics.ConeUnresolvedNameError 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 @@ object FirForLoopChecker : FirBlockChecker() { 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 00000000000..9327b5a1632 --- /dev/null +++ b/compiler/testData/diagnostics/tests/missingIteratorMissing.kt @@ -0,0 +1,8 @@ +// FIR_IDENTICAL +// ISSUE: KT-58284 + +fun foo() { + for (i in 0) {} +} + +fun String.iterator(): Iterator = 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 3e04a634204..d0b27c0197f 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 @@ -627,6 +627,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/localInterfaces.kt"); } + @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 {