[FIR] KT-58284: Prevent missing diagnostics on for loops

^KT-58284 Fixed
This commit is contained in:
Nikolay Lunyak
2023-05-12 15:06:58 +03:00
committed by Space Team
parent 606ffa7273
commit 834ba397ad
7 changed files with 49 additions and 5 deletions
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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 {
@@ -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) {
@@ -0,0 +1,8 @@
// FIR_IDENTICAL
// ISSUE: KT-58284
fun foo() {
for (i in <!ITERATOR_MISSING!>0<!>) {}
}
fun String.iterator(): Iterator<Int> = TODO()
@@ -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 {