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()