From 183c263c55f0a90a0c5dd3ed006ba3b888303cdf Mon Sep 17 00:00:00 2001 From: Nikolay Lunyak Date: Fri, 2 Feb 2024 12:54:54 +0200 Subject: [PATCH] [FIR] Create proper error name references for invoke receivers In this example, when processing the `jso` property candidate form the `dynamic` scope we get `DslScopeViolation`. When we later create the receiver for the invoke call (since we still call `jso {}` as a function), we create a non-error named reference which fails at `toResolvedReference()`. The included test should not fail with exception. ^KT-65255 Fixed --- .../tower/FirInvokeResolveTowerExtension.kt | 12 ++++++----- ...andidateNotSuccessfulButNoContradiction.kt | 21 +++++++++++++++++++ ...JsOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ ...JsOldFrontendDiagnosticsTestGenerated.java | 6 ++++++ .../DiagnosticsWithJsStdLibTestGenerated.java | 6 ++++++ 5 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 compiler/testData/diagnostics/testsWithJsStdLib/candidateNotSuccessfulButNoContradiction.kt diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirInvokeResolveTowerExtension.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirInvokeResolveTowerExtension.kt index 4919596f4f0..f0515c5489b 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirInvokeResolveTowerExtension.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/calls/tower/FirInvokeResolveTowerExtension.kt @@ -317,11 +317,13 @@ private fun BodyResolveComponents.createExplicitReceiverForInvokeByCallable( ): FirExpression { return FirPropertyAccessExpressionBuilder().apply { val fakeSource = info.fakeSourceForImplicitInvokeCallReceiver - calleeReference = FirNamedReferenceWithCandidate( - fakeSource, - symbol.callableId.callableName, - candidate - ) + calleeReference = when { + candidate.isSuccessful -> FirNamedReferenceWithCandidate(fakeSource, symbol.callableId.callableName, candidate) + else -> FirErrorReferenceWithCandidate( + fakeSource, symbol.callableId.callableName, candidate, + createConeDiagnosticForCandidateWithError(candidate.applicability, candidate), + ) + } dispatchReceiver = candidate.dispatchReceiverExpression() coneTypeOrNull = returnTypeCalculator.tryCalculateReturnType(symbol.fir).type diff --git a/compiler/testData/diagnostics/testsWithJsStdLib/candidateNotSuccessfulButNoContradiction.kt b/compiler/testData/diagnostics/testsWithJsStdLib/candidateNotSuccessfulButNoContradiction.kt new file mode 100644 index 00000000000..0d92a83b2f5 --- /dev/null +++ b/compiler/testData/diagnostics/testsWithJsStdLib/candidateNotSuccessfulButNoContradiction.kt @@ -0,0 +1,21 @@ +// FIR_IDENTICAL +// ISSUE: KT-65255 +// DIAGNOSTICS: -NOTHING_TO_INLINE -UNUSED_ANONYMOUS_PARAMETER + +@DslMarker +@Target(AnnotationTarget.CLASS, AnnotationTarget.TYPE) +@Retention(AnnotationRetention.BINARY) +annotation class JsoDsl + +inline fun jso(): T = js("({})") +inline fun jso(block: @JsoDsl T.() -> Unit): T = jso().apply(block) + +val value = { int: Int? -> + jso { + foo = jso { + bar = jso { // line 7 + + } + } + } +} diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsOldFrontendDiagnosticsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsOldFrontendDiagnosticsTestGenerated.java index 34fd50f6da7..9d79c9210e4 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsOldFrontendDiagnosticsTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirLightTreeJsOldFrontendDiagnosticsTestGenerated.java @@ -25,6 +25,12 @@ public class FirLightTreeJsOldFrontendDiagnosticsTestGenerated extends AbstractF KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithJsStdLib"), Pattern.compile("^([^_](.+))\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), TargetBackend.JS_IR, true); } + @Test + @TestMetadata("candidateNotSuccessfulButNoContradiction.kt") + public void testCandidateNotSuccessfulButNoContradiction() throws Exception { + runTest("compiler/testData/diagnostics/testsWithJsStdLib/candidateNotSuccessfulButNoContradiction.kt"); + } + @Test @TestMetadata("dynamicUnresolved.kt") public void testDynamicUnresolved() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsOldFrontendDiagnosticsTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsOldFrontendDiagnosticsTestGenerated.java index 6a623b76447..6baae4474f3 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsOldFrontendDiagnosticsTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/fir/FirPsiJsOldFrontendDiagnosticsTestGenerated.java @@ -25,6 +25,12 @@ public class FirPsiJsOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiJ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithJsStdLib"), Pattern.compile("^([^_](.+))\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), TargetBackend.JS_IR, true); } + @Test + @TestMetadata("candidateNotSuccessfulButNoContradiction.kt") + public void testCandidateNotSuccessfulButNoContradiction() throws Exception { + runTest("compiler/testData/diagnostics/testsWithJsStdLib/candidateNotSuccessfulButNoContradiction.kt"); + } + @Test @TestMetadata("dynamicUnresolved.kt") public void testDynamicUnresolved() throws Exception { diff --git a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/DiagnosticsWithJsStdLibTestGenerated.java b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/DiagnosticsWithJsStdLibTestGenerated.java index 65bab7ce858..d2cebbc7a60 100644 --- a/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/DiagnosticsWithJsStdLibTestGenerated.java +++ b/js/js.tests/tests-gen/org/jetbrains/kotlin/js/test/ir/DiagnosticsWithJsStdLibTestGenerated.java @@ -25,6 +25,12 @@ public class DiagnosticsWithJsStdLibTestGenerated extends AbstractDiagnosticsTes KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/testsWithJsStdLib"), Pattern.compile("^([^_](.+))\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), TargetBackend.JS_IR, true); } + @Test + @TestMetadata("candidateNotSuccessfulButNoContradiction.kt") + public void testCandidateNotSuccessfulButNoContradiction() throws Exception { + runTest("compiler/testData/diagnostics/testsWithJsStdLib/candidateNotSuccessfulButNoContradiction.kt"); + } + @Test @TestMetadata("dynamicUnresolved.kt") public void testDynamicUnresolved() throws Exception {