From b765cf3f994986f2237300ec0f35f1eb62ae91a2 Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Thu, 7 Mar 2024 23:06:37 +0100 Subject: [PATCH] KT-66411 [AA] Add fake source kind for single expression block around array assignments A wrapper block was introduced as a part of fixing KT-59748, but was assigned a real source, which had `getOrBuildFir` confused because of the incorrectly built `KtToFirMapping` It is relevant for: - `if`, `when` expressions with an assignment as a single expression - Kotlin code fragments, when the assignment is being analysed as a single expression in the fragment ^KT-66411 Fixed --- .../referenceResolve/arrayAccess/set.descriptors.txt | 8 -------- .../testData/referenceResolve/arrayAccess/set.txt | 4 ++-- .../expressionCodeFragment/ArrayAssignmentOperator.txt | 2 +- .../ArrayPlusAssignmentOperator.txt | 2 +- .../calls/arrayAssignOperatorAsSingleExpressionInIf.txt | 7 ++----- .../calls/arrayAssignOperatorAsSingleExpressionInWhen.txt | 7 ++----- .../jetbrains/kotlin/fir/builder/AbstractRawFirBuilder.kt | 6 +++--- .../src/org/jetbrains/kotlin/KtSourceElement.kt | 4 ++++ 8 files changed, 15 insertions(+), 25 deletions(-) delete mode 100644 analysis/analysis-api/testData/referenceResolve/arrayAccess/set.descriptors.txt diff --git a/analysis/analysis-api/testData/referenceResolve/arrayAccess/set.descriptors.txt b/analysis/analysis-api/testData/referenceResolve/arrayAccess/set.descriptors.txt deleted file mode 100644 index 5dbec09f509..00000000000 --- a/analysis/analysis-api/testData/referenceResolve/arrayAccess/set.descriptors.txt +++ /dev/null @@ -1,8 +0,0 @@ - resolved to: -0: (in kotlin.collections.MutableList) operator fun set(index: kotlin.Int, element: E): E - - resolved to: -0: (in kotlin.collections.MutableList) operator fun set(index: kotlin.Int, element: E): E - - resolved to: -0: (in kotlin.collections.MutableList) operator fun set(index: kotlin.Int, element: E): E \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/arrayAccess/set.txt b/analysis/analysis-api/testData/referenceResolve/arrayAccess/set.txt index a4f4dbd0f21..5dbec09f509 100644 --- a/analysis/analysis-api/testData/referenceResolve/arrayAccess/set.txt +++ b/analysis/analysis-api/testData/referenceResolve/arrayAccess/set.txt @@ -2,7 +2,7 @@ 0: (in kotlin.collections.MutableList) operator fun set(index: kotlin.Int, element: E): E resolved to: -Nothing (Unresolved reference) +0: (in kotlin.collections.MutableList) operator fun set(index: kotlin.Int, element: E): E resolved to: -Nothing (Unresolved reference) \ No newline at end of file +0: (in kotlin.collections.MutableList) operator fun set(index: kotlin.Int, element: E): E \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/codeFragment/expressionCodeFragment/ArrayAssignmentOperator.txt b/analysis/analysis-api/testData/referenceResolve/codeFragment/expressionCodeFragment/ArrayAssignmentOperator.txt index db4fc56233f..976030a8ebb 100644 --- a/analysis/analysis-api/testData/referenceResolve/codeFragment/expressionCodeFragment/ArrayAssignmentOperator.txt +++ b/analysis/analysis-api/testData/referenceResolve/codeFragment/expressionCodeFragment/ArrayAssignmentOperator.txt @@ -1,2 +1,2 @@ Resolved to: -Nothing (Unresolved reference) \ No newline at end of file +0: (in MyList) operator fun set(index: kotlin.Int, value: kotlin.String) \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/codeFragment/expressionCodeFragment/ArrayPlusAssignmentOperator.txt b/analysis/analysis-api/testData/referenceResolve/codeFragment/expressionCodeFragment/ArrayPlusAssignmentOperator.txt index db4fc56233f..976030a8ebb 100644 --- a/analysis/analysis-api/testData/referenceResolve/codeFragment/expressionCodeFragment/ArrayPlusAssignmentOperator.txt +++ b/analysis/analysis-api/testData/referenceResolve/codeFragment/expressionCodeFragment/ArrayPlusAssignmentOperator.txt @@ -1,2 +1,2 @@ Resolved to: -Nothing (Unresolved reference) \ No newline at end of file +0: (in MyList) operator fun set(index: kotlin.Int, value: kotlin.String) \ No newline at end of file diff --git a/analysis/low-level-api-fir/testData/getOrBuildFir/calls/arrayAssignOperatorAsSingleExpressionInIf.txt b/analysis/low-level-api-fir/testData/getOrBuildFir/calls/arrayAssignOperatorAsSingleExpressionInIf.txt index f1f13c5eaf4..06ff43e9d8e 100644 --- a/analysis/low-level-api-fir/testData/getOrBuildFir/calls/arrayAssignOperatorAsSingleExpressionInIf.txt +++ b/analysis/low-level-api-fir/testData/getOrBuildFir/calls/arrayAssignOperatorAsSingleExpressionInIf.txt @@ -1,12 +1,9 @@ KT element: KtBinaryExpression -FIR element: FirBlockImpl +FIR element: FirFunctionCallImpl FIR source kind: KtRealSourceElementKind FIR element rendered: - { - R|/foo|.R|/Foo.set|(Int(10), String()) - Unit -} +R|/foo|.R|/Foo.set|(Int(10), String()) FIR FILE: FILE: [ResolvedTo(IMPORTS)] arrayAssignOperatorAsSingleExpressionInIf.kt diff --git a/analysis/low-level-api-fir/testData/getOrBuildFir/calls/arrayAssignOperatorAsSingleExpressionInWhen.txt b/analysis/low-level-api-fir/testData/getOrBuildFir/calls/arrayAssignOperatorAsSingleExpressionInWhen.txt index 01c3a3565f4..b51898fcecc 100644 --- a/analysis/low-level-api-fir/testData/getOrBuildFir/calls/arrayAssignOperatorAsSingleExpressionInWhen.txt +++ b/analysis/low-level-api-fir/testData/getOrBuildFir/calls/arrayAssignOperatorAsSingleExpressionInWhen.txt @@ -1,12 +1,9 @@ KT element: KtBinaryExpression -FIR element: FirBlockImpl +FIR element: FirFunctionCallImpl FIR source kind: KtRealSourceElementKind FIR element rendered: - { - R|/foo|.R|/Foo.set|(Int(10), String()) - Unit -} +R|/foo|.R|/Foo.set|(Int(10), String()) FIR FILE: FILE: [ResolvedTo(IMPORTS)] arrayAssignOperatorAsSingleExpressionInWhen.kt diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilder.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilder.kt index 5f6cae35296..f27415bf7e0 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilder.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/AbstractRawFirBuilder.kt @@ -835,7 +835,7 @@ abstract class AbstractRawFirBuilder(val baseSession: FirSession, val context if (operation == FirOperation.ASSIGN) { val result = unwrappedLhs.convert() result.replaceAnnotations(result.annotations.smartPlus(annotations)) - source = result.source + source = result.source?.fakeElement(KtFakeSourceElementKind.IndexedAssignmentCoercionBlock) statements += result.pullUpSafeCallIfNecessary() } else { val receiver = unwrappedLhs.convert() @@ -846,13 +846,13 @@ abstract class AbstractRawFirBuilder(val baseSession: FirSession, val context receiver.selector as FirExpression, baseSource, arrayAccessSource, operation, annotations, rhsAST, convert ) ) - source = receiver.source + source = receiver.source?.fakeElement(KtFakeSourceElementKind.IndexedAssignmentCoercionBlock) statements += receiver } else { val augmentedArraySetCall = generateAugmentedArraySetCall( receiver, baseSource, arrayAccessSource, operation, annotations, rhsAST, convert ) - source = augmentedArraySetCall.source + source = augmentedArraySetCall.source?.fakeElement(KtFakeSourceElementKind.IndexedAssignmentCoercionBlock) statements += augmentedArraySetCall } } diff --git a/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt b/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt index ce4db589d87..7968914e411 100644 --- a/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt +++ b/compiler/frontend.common/src/org/jetbrains/kotlin/KtSourceElement.kt @@ -144,6 +144,10 @@ sealed class KtFakeSourceElementKind(final override val shouldSkipErrorTypeRepor // with a fake sources for the block which refers to the wrapped expression object SingleExpressionBlock : KtFakeSourceElementKind() + // this source is used for a single fake block created for indexed assignments expression, + // see ImplicitUnit.IndexedAssignmentCoercion + object IndexedAssignmentCoercionBlock : KtFakeSourceElementKind() + // Contract statements are wrapped in a special block to be reused between a contract FIR and a function body. object ContractBlock : KtFakeSourceElementKind()