From 1bb6f869a201ad3e340ce65a4a40443d67f61ccd Mon Sep 17 00:00:00 2001 From: "Anastasia.Nekrasova" Date: Wed, 6 Mar 2024 22:34:40 +0200 Subject: [PATCH] [K2]: Compiler crashes when array literal is used in delegate expression FirCallResolver tries to find a candidate for the delegate's getValue and cannot parse an arrayLiteral with a nullable coneType.Running FirCallCompletionResultsWriterTransformer.transformArrayLiteral is required to find the result type. Therefore, completeCall should not be invoked with the ResolutionMode from the 'data' param, but rather in ResolutionMode.ContextIndependent. #KT-65022 Fixed --- .../DiagnosticCompilerTestFirTestdataTestGenerated.java | 6 ++++++ ...dReversedDiagnosticCompilerFirTestDataTestGenerated.java | 6 ++++++ .../testData/resolve/delegateByArrayLiteral.fir.txt | 5 +++++ .../testData/resolve/delegateByArrayLiteral.kt | 3 +++ .../test/runners/FirLightTreeDiagnosticsTestGenerated.java | 6 ++++++ .../kotlin/test/runners/FirPsiDiagnosticTestGenerated.java | 6 ++++++ .../body/resolve/FirExpressionsResolveTransformer.kt | 2 +- 7 files changed, 33 insertions(+), 1 deletion(-) create mode 100644 compiler/fir/analysis-tests/testData/resolve/delegateByArrayLiteral.fir.txt create mode 100644 compiler/fir/analysis-tests/testData/resolve/delegateByArrayLiteral.kt diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFirTestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFirTestdataTestGenerated.java index 8fbc3e0bd8f..3d2a32decc7 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFirTestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFirTestdataTestGenerated.java @@ -176,6 +176,12 @@ public class DiagnosticCompilerTestFirTestdataTestGenerated extends AbstractDiag runTest("compiler/fir/analysis-tests/testData/resolve/definitelyNotNullAmbiguity.kt"); } + @Test + @TestMetadata("delegateByArrayLiteral.kt") + public void testDelegateByArrayLiteral() { + runTest("compiler/fir/analysis-tests/testData/resolve/delegateByArrayLiteral.kt"); + } + @Test @TestMetadata("delegatedSuperType.kt") public void testDelegatedSuperType() { diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated.java index e85c8d1fb44..6b0db25b6c3 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated.java @@ -176,6 +176,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFirTestDataTestGenerated runTest("compiler/fir/analysis-tests/testData/resolve/definitelyNotNullAmbiguity.kt"); } + @Test + @TestMetadata("delegateByArrayLiteral.kt") + public void testDelegateByArrayLiteral() { + runTest("compiler/fir/analysis-tests/testData/resolve/delegateByArrayLiteral.kt"); + } + @Test @TestMetadata("delegatedSuperType.kt") public void testDelegatedSuperType() { diff --git a/compiler/fir/analysis-tests/testData/resolve/delegateByArrayLiteral.fir.txt b/compiler/fir/analysis-tests/testData/resolve/delegateByArrayLiteral.fir.txt new file mode 100644 index 00000000000..2d3df64a0ba --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/delegateByArrayLiteral.fir.txt @@ -0,0 +1,5 @@ +FILE: delegateByArrayLiteral.kt + public final val d: by () + public get(): { + ^ D|/d|.#(Null(null), ::R|/d|) + } diff --git a/compiler/fir/analysis-tests/testData/resolve/delegateByArrayLiteral.kt b/compiler/fir/analysis-tests/testData/resolve/delegateByArrayLiteral.kt new file mode 100644 index 00000000000..f8cd8645021 --- /dev/null +++ b/compiler/fir/analysis-tests/testData/resolve/delegateByArrayLiteral.kt @@ -0,0 +1,3 @@ +// ISSUE: KT-65022 + +val d by [] diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsTestGenerated.java index da6b7392e1f..eb8599145d9 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeDiagnosticsTestGenerated.java @@ -176,6 +176,12 @@ public class FirLightTreeDiagnosticsTestGenerated extends AbstractFirLightTreeDi runTest("compiler/fir/analysis-tests/testData/resolve/definitelyNotNullAmbiguity.kt"); } + @Test + @TestMetadata("delegateByArrayLiteral.kt") + public void testDelegateByArrayLiteral() { + runTest("compiler/fir/analysis-tests/testData/resolve/delegateByArrayLiteral.kt"); + } + @Test @TestMetadata("delegatedSuperType.kt") public void testDelegatedSuperType() { diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiDiagnosticTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiDiagnosticTestGenerated.java index 116f72b60bf..bc91c1017a8 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiDiagnosticTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiDiagnosticTestGenerated.java @@ -176,6 +176,12 @@ public class FirPsiDiagnosticTestGenerated extends AbstractFirPsiDiagnosticTest runTest("compiler/fir/analysis-tests/testData/resolve/definitelyNotNullAmbiguity.kt"); } + @Test + @TestMetadata("delegateByArrayLiteral.kt") + public void testDelegateByArrayLiteral() { + runTest("compiler/fir/analysis-tests/testData/resolve/delegateByArrayLiteral.kt"); + } + @Test @TestMetadata("delegatedSuperType.kt") public void testDelegatedSuperType() { diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt index 15078ae69b0..b242fd9e745 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirExpressionsResolveTransformer.kt @@ -1704,7 +1704,7 @@ open class FirExpressionsResolveTransformer(transformer: FirAbstractBodyResolveT data, ) arrayLiteral.transformChildren(transformer, ResolutionMode.ContextDependent) - callCompleter.completeCall(syntheticIdCall, data) + callCompleter.completeCall(syntheticIdCall, ResolutionMode.ContextIndependent) arrayLiteral } }