From a700fdc312db6b5ec6c2508345b75858096f4329 Mon Sep 17 00:00:00 2001 From: "Denis.Zharkov" Date: Wed, 14 Apr 2021 10:51:33 +0300 Subject: [PATCH] FIR: Report diagnostics introduced during call completion --- ...irOldFrontendDiagnosticsTestGenerated.java | 6 ++++ ...DiagnosticsWithLightTreeTestGenerated.java | 6 ++++ ...rCallCompletionResultsWriterTransformer.kt | 30 ++++++++++++------- .../completion/errorAfterCompletion.fir.kt | 8 +++++ .../completion/errorAfterCompletion.kt | 8 +++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++ 6 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/inference/completion/errorAfterCompletion.fir.kt create mode 100644 compiler/testData/diagnostics/tests/inference/completion/errorAfterCompletion.kt 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 e2511ee2382..f2d63a38f67 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 @@ -13200,6 +13200,12 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti runTest("compiler/testData/diagnostics/tests/inference/completion/equalityConstraintUpstairs.kt"); } + @Test + @TestMetadata("errorAfterCompletion.kt") + public void testErrorAfterCompletion() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/completion/errorAfterCompletion.kt"); + } + @Test @TestMetadata("flexibleType.kt") public void testFlexibleType() 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 c7944c1ce15..1295850a285 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 @@ -13200,6 +13200,12 @@ public class FirOldFrontendDiagnosticsWithLightTreeTestGenerated extends Abstrac runTest("compiler/testData/diagnostics/tests/inference/completion/equalityConstraintUpstairs.kt"); } + @Test + @TestMetadata("errorAfterCompletion.kt") + public void testErrorAfterCompletion() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/completion/errorAfterCompletion.kt"); + } + @Test @TestMetadata("flexibleType.kt") public void testFlexibleType() throws Exception { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt index 600c9dded93..6d2c6f5e171 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/FirCallCompletionResultsWriterTransformer.kt @@ -11,12 +11,14 @@ import org.jetbrains.kotlin.fir.declarations.* import org.jetbrains.kotlin.fir.diagnostics.ConeSimpleDiagnostic import org.jetbrains.kotlin.fir.diagnostics.DiagnosticKind import org.jetbrains.kotlin.fir.expressions.* +import org.jetbrains.kotlin.fir.references.FirNamedReference import org.jetbrains.kotlin.fir.references.builder.buildErrorNamedReference import org.jetbrains.kotlin.fir.references.builder.buildResolvedCallableReference import org.jetbrains.kotlin.fir.references.builder.buildResolvedNamedReference import org.jetbrains.kotlin.fir.resolve.* import org.jetbrains.kotlin.fir.resolve.calls.* import org.jetbrains.kotlin.fir.resolve.dfa.FirDataFlowAnalyzer +import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeInapplicableCandidateError import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeTypeParameterInQualifiedAccess import org.jetbrains.kotlin.fir.resolve.inference.* import org.jetbrains.kotlin.fir.resolve.substitution.ConeSubstitutor @@ -734,17 +736,25 @@ class FirCallCompletionResultsWriterTransformer( return arrayOfCall } - private fun FirNamedReferenceWithCandidate.toResolvedReference() = if (this is FirErrorReferenceWithCandidate) { - buildErrorNamedReference { - source = this@toResolvedReference.source - diagnostic = this@toResolvedReference.diagnostic - candidateSymbol = this@toResolvedReference.candidateSymbol + private fun FirNamedReferenceWithCandidate.toResolvedReference(): FirNamedReference { + val errorDiagnostic = when { + this is FirErrorReferenceWithCandidate -> this.diagnostic + !candidate.isSuccessful -> ConeInapplicableCandidateError(candidate.currentApplicability, candidate) + else -> null } - } else { - buildResolvedNamedReference { - source = this@toResolvedReference.source - name = this@toResolvedReference.name - resolvedSymbol = this@toResolvedReference.candidateSymbol + + return if (errorDiagnostic != null) { + buildErrorNamedReference { + source = this@toResolvedReference.source + diagnostic = errorDiagnostic + candidateSymbol = this@toResolvedReference.candidateSymbol + } + } else { + buildResolvedNamedReference { + source = this@toResolvedReference.source + name = this@toResolvedReference.name + resolvedSymbol = this@toResolvedReference.candidateSymbol + } } } } diff --git a/compiler/testData/diagnostics/tests/inference/completion/errorAfterCompletion.fir.kt b/compiler/testData/diagnostics/tests/inference/completion/errorAfterCompletion.fir.kt new file mode 100644 index 00000000000..1c948e60ba8 --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/completion/errorAfterCompletion.fir.kt @@ -0,0 +1,8 @@ +// SKIP_TXT + +fun foo(x: () -> Int): Int = x() + +fun myRun(x: () -> R): R = x() + +private val a = foo { myRun { "OK" } } +private val b: Int = myRun { "OK" } diff --git a/compiler/testData/diagnostics/tests/inference/completion/errorAfterCompletion.kt b/compiler/testData/diagnostics/tests/inference/completion/errorAfterCompletion.kt new file mode 100644 index 00000000000..42e7d0e7d5e --- /dev/null +++ b/compiler/testData/diagnostics/tests/inference/completion/errorAfterCompletion.kt @@ -0,0 +1,8 @@ +// SKIP_TXT + +fun foo(x: () -> Int): Int = x() + +fun myRun(x: () -> R): R = x() + +private val a = foo { myRun { "OK" } } +private val b: Int = myRun { "OK" } 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 1a5326d7d4d..34899006032 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 @@ -13206,6 +13206,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/inference/completion/equalityConstraintUpstairs.kt"); } + @Test + @TestMetadata("errorAfterCompletion.kt") + public void testErrorAfterCompletion() throws Exception { + runTest("compiler/testData/diagnostics/tests/inference/completion/errorAfterCompletion.kt"); + } + @Test @TestMetadata("flexibleType.kt") public void testFlexibleType() throws Exception {