From a454d42e6526805ed33829d52e267aeb6ec453f2 Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Fri, 25 Nov 2022 10:19:58 +0000 Subject: [PATCH] [FIR] KT-54587: Report the missing diagnostics ^KT-54587 Fixed Merge-request: KT-MR-7791 Merged-by: Nikolay Lunyak --- ...CompilerTestFE10TestdataTestGenerated.java | 12 +++++++++ ...irOldFrontendDiagnosticsTestGenerated.java | 12 +++++++++ ...DiagnosticsWithLightTreeTestGenerated.java | 12 +++++++++ .../FirDestructuringDeclarationChecker.kt | 9 +++++++ .../checkers/expression/FirForLoopChecker.kt | 4 +++ .../testData/diagnostics/tests/kt54587_1.kt | 12 +++++++++ .../testData/diagnostics/tests/kt54587_1.txt | 19 ++++++++++++++ .../testData/diagnostics/tests/kt54587_2.kt | 17 ++++++++++++ .../testData/diagnostics/tests/kt54587_2.txt | 26 +++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 12 +++++++++ 10 files changed, 135 insertions(+) create mode 100644 compiler/testData/diagnostics/tests/kt54587_1.kt create mode 100644 compiler/testData/diagnostics/tests/kt54587_1.txt create mode 100644 compiler/testData/diagnostics/tests/kt54587_2.kt create mode 100644 compiler/testData/diagnostics/tests/kt54587_2.txt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java index 4ecc61438d5..d3f8e22499a 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java @@ -453,6 +453,18 @@ public class DiagnosisCompilerTestFE10TestdataTestGenerated extends AbstractDiag runTest("compiler/testData/diagnostics/tests/kt53988.kt"); } + @Test + @TestMetadata("kt54587_1.kt") + public void testKt54587_1() throws Exception { + runTest("compiler/testData/diagnostics/tests/kt54587_1.kt"); + } + + @Test + @TestMetadata("kt54587_2.kt") + public void testKt54587_2() throws Exception { + runTest("compiler/testData/diagnostics/tests/kt54587_2.kt"); + } + @Test @TestMetadata("LValueAssignment.kt") public void testLValueAssignment() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index 39a2eef07e4..6e52a790a60 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -453,6 +453,18 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/kt53988.kt"); } + @Test + @TestMetadata("kt54587_1.kt") + public void testKt54587_1() throws Exception { + runTest("compiler/testData/diagnostics/tests/kt54587_1.kt"); + } + + @Test + @TestMetadata("kt54587_2.kt") + public void testKt54587_2() throws Exception { + runTest("compiler/testData/diagnostics/tests/kt54587_2.kt"); + } + @Test @TestMetadata("LValueAssignment.kt") public void testLValueAssignment() throws Exception { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java index e07a87533a2..8907478e602 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java @@ -453,6 +453,18 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/kt53988.kt"); } + @Test + @TestMetadata("kt54587_1.kt") + public void testKt54587_1() throws Exception { + runTest("compiler/testData/diagnostics/tests/kt54587_1.kt"); + } + + @Test + @TestMetadata("kt54587_2.kt") + public void testKt54587_2() throws Exception { + runTest("compiler/testData/diagnostics/tests/kt54587_2.kt"); + } + @Test @TestMetadata("LValueAssignment.kt") public void testLValueAssignment() throws Exception { diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDestructuringDeclarationChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDestructuringDeclarationChecker.kt index b75c7c943aa..e2992cd7830 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDestructuringDeclarationChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirDestructuringDeclarationChecker.kt @@ -122,6 +122,15 @@ object FirDestructuringDeclarationChecker : FirPropertyChecker() { context ) } + is ConeInapplicableWrongReceiver -> { + reporter.reportOn( + source, + FirErrors.COMPONENT_FUNCTION_MISSING, + diagnostic.candidates.first().callInfo.name, + destructuringDeclarationType, + context + ) + } is ConeAmbiguityError -> { reporter.reportOn( source, 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 6268c2a9de0..e73960108c8 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 @@ -34,6 +34,7 @@ import org.jetbrains.kotlin.fir.references.FirResolvedNamedReference import org.jetbrains.kotlin.fir.resolve.calls.UnsafeCall import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeAmbiguityError import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeInapplicableCandidateError +import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeInapplicableWrongReceiver import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeUnresolvedNameError import org.jetbrains.kotlin.fir.symbols.FirBasedSymbol import org.jetbrains.kotlin.fir.symbols.impl.FirNamedFunctionSymbol @@ -113,6 +114,9 @@ object FirForLoopChecker : FirBlockChecker() { is ConeUnresolvedNameError -> { reporter.reportOn(reportSource, missingFactory, context) } + is ConeInapplicableWrongReceiver -> noneApplicableFactory?.let { + reporter.reportOn(reportSource, it, diagnostic.candidateSymbols, context) + } is ConeInapplicableCandidateError -> { if (unsafeCallFactory != null || noneApplicableFactory != null) { diagnostic.candidate.diagnostics.filter { it.applicability == diagnostic.applicability }.forEach { diff --git a/compiler/testData/diagnostics/tests/kt54587_1.kt b/compiler/testData/diagnostics/tests/kt54587_1.kt new file mode 100644 index 00000000000..6c955767c78 --- /dev/null +++ b/compiler/testData/diagnostics/tests/kt54587_1.kt @@ -0,0 +1,12 @@ +// FIR_IDENTICAL +class MyClass +class SomeClass + +operator fun SomeClass.component1() {} +operator fun SomeClass.component2() {} + +fun test() { + val (o, o2) = SomeClass() + val (o3, o4) = MyClass() // [COMPONENT_FUNCTION_MISSING] expected as in K1 + +} diff --git a/compiler/testData/diagnostics/tests/kt54587_1.txt b/compiler/testData/diagnostics/tests/kt54587_1.txt new file mode 100644 index 00000000000..d40b840a8cd --- /dev/null +++ b/compiler/testData/diagnostics/tests/kt54587_1.txt @@ -0,0 +1,19 @@ +package + +public fun test(): kotlin.Unit +public operator fun SomeClass.component1(): kotlin.Unit +public operator fun SomeClass.component2(): kotlin.Unit + +public final class MyClass { + public constructor MyClass() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} + +public final class SomeClass { + public constructor SomeClass() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String +} diff --git a/compiler/testData/diagnostics/tests/kt54587_2.kt b/compiler/testData/diagnostics/tests/kt54587_2.kt new file mode 100644 index 00000000000..f54c40aa10d --- /dev/null +++ b/compiler/testData/diagnostics/tests/kt54587_2.kt @@ -0,0 +1,17 @@ +// FIR_IDENTICAL +package one + +fun test(f: NextMissing) { + for(i in f) {} //[NEXT_NONE_APPLICABLE] is expected as in K1 +} + +interface Doo +operator fun Doo.next() {} + +interface NextMissing { + operator fun iterator(): NextMissing2 +} + +interface NextMissing2 { + operator fun hasNext(): Boolean +} diff --git a/compiler/testData/diagnostics/tests/kt54587_2.txt b/compiler/testData/diagnostics/tests/kt54587_2.txt new file mode 100644 index 00000000000..d48abc6e6ed --- /dev/null +++ b/compiler/testData/diagnostics/tests/kt54587_2.txt @@ -0,0 +1,26 @@ +package + +package one { + public fun test(/*0*/ f: one.NextMissing): kotlin.Unit + public operator fun one.Doo.next(): kotlin.Unit + + public interface Doo { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + public interface NextMissing { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public abstract operator fun iterator(): one.NextMissing2 + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } + + public interface NextMissing2 { + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public abstract operator fun hasNext(): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + } +} 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 b21cb9f08e8..f43d22f8e5f 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 @@ -453,6 +453,18 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/kt53988.kt"); } + @Test + @TestMetadata("kt54587_1.kt") + public void testKt54587_1() throws Exception { + runTest("compiler/testData/diagnostics/tests/kt54587_1.kt"); + } + + @Test + @TestMetadata("kt54587_2.kt") + public void testKt54587_2() throws Exception { + runTest("compiler/testData/diagnostics/tests/kt54587_2.kt"); + } + @Test @TestMetadata("LValueAssignment.kt") public void testLValueAssignment() throws Exception {