diff --git a/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/fir/Fe10ResolveCallTestGenerated.java b/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/fir/Fe10ResolveCallTestGenerated.java index b192b5a39d6..6ea7bf9a419 100644 --- a/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/fir/Fe10ResolveCallTestGenerated.java +++ b/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/fir/Fe10ResolveCallTestGenerated.java @@ -771,4 +771,20 @@ public class Fe10ResolveCallTestGenerated extends AbstractResolveCallTest { public void testVariableWithMemberInvoke() throws Exception { runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/variableWithMemberInvoke.kt"); } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/callResolver/resolveCall/assignments") + @TestDataPath("$PROJECT_ROOT") + public class Assignments { + @Test + public void testAllFilesPresentInAssignments() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/callResolver/resolveCall/assignments"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("insidePlusAssignTarget.kt") + public void testInsidePlusAssignTarget() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/assignments/insidePlusAssignTarget.kt"); + } + } } diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/fir/FirResolveCallTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/fir/FirResolveCallTestGenerated.java index f25b386ceb7..c96f82e56c4 100644 --- a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/fir/FirResolveCallTestGenerated.java +++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/fir/FirResolveCallTestGenerated.java @@ -771,4 +771,20 @@ public class FirResolveCallTestGenerated extends AbstractResolveCallTest { public void testVariableWithMemberInvoke() throws Exception { runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/variableWithMemberInvoke.kt"); } + + @Nested + @TestMetadata("analysis/analysis-api/testData/components/callResolver/resolveCall/assignments") + @TestDataPath("$PROJECT_ROOT") + public class Assignments { + @Test + public void testAllFilesPresentInAssignments() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/callResolver/resolveCall/assignments"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("insidePlusAssignTarget.kt") + public void testInsidePlusAssignTarget() throws Exception { + runTest("analysis/analysis-api/testData/components/callResolver/resolveCall/assignments/insidePlusAssignTarget.kt"); + } + } } diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/assignments/insidePlusAssignTarget.kt b/analysis/analysis-api/testData/components/callResolver/resolveCall/assignments/insidePlusAssignTarget.kt new file mode 100644 index 00000000000..5e74003d1d2 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/assignments/insidePlusAssignTarget.kt @@ -0,0 +1,5 @@ +// WITH_STDLIB + +fun foo(x: MutableMap>) { + x.getOrPut(1) { mutableListOf() } += "str" +} \ No newline at end of file diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/assignments/insidePlusAssignTarget.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/assignments/insidePlusAssignTarget.txt new file mode 100644 index 00000000000..e4b61fe9768 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/assignments/insidePlusAssignTarget.txt @@ -0,0 +1,12 @@ +KtSuccessCallInfo: + call = KtSimpleFunctionCall: + isImplicitInvoke = false + partiallyAppliedSymbol = KtPartiallyAppliedSymbol: + dispatchReceiver = null + extensionReceiver = null + signature = KtFunctionLikeSignature: + receiverType = null + returnType = kotlin.collections.MutableList + symbol = kotlin/collections/mutableListOf(): kotlin.collections.MutableList + valueParameters = [] + argumentMapping = {} \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/compoundAssignOnVal_lhs.txt b/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/compoundAssignOnVal_lhs.txt index ca1986c810c..a099458b9e2 100644 --- a/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/compoundAssignOnVal_lhs.txt +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/calls/compoundAssignOnVal_lhs.txt @@ -1,6 +1,6 @@ KT element: KtNameReferenceExpression FIR element: FirPropertyAccessExpressionImpl -FIR source kind: DesugaredCompoundAssignment +FIR source kind: KtRealSourceElementKind FIR element rendered: R|/l| \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/insidePlusAssignTarget.kt b/analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/insidePlusAssignTarget.kt new file mode 100644 index 00000000000..45389aff27d --- /dev/null +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/insidePlusAssignTarget.kt @@ -0,0 +1,6 @@ +// WITH_STDLIB +// LOOK_UP_FOR_ELEMENT_OF_TYPE: org.jetbrains.kotlin.psi.KtCallExpression + +fun foo(x: MutableMap>) { + x.getOrPut(1) { mutableListOf() } += "str" +} \ No newline at end of file diff --git a/analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/insidePlusAssignTarget.txt b/analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/insidePlusAssignTarget.txt new file mode 100644 index 00000000000..eb59acd336a --- /dev/null +++ b/analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/insidePlusAssignTarget.txt @@ -0,0 +1,6 @@ +KT element: KtCallExpression +FIR element: FirFunctionCallImpl +FIR source kind: KtRealSourceElementKind + +FIR element rendered: +R|kotlin/collections/mutableListOf|() \ No newline at end of file diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/GetOrBuildFirTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/GetOrBuildFirTestGenerated.java index da80c66189f..c6162ab22c3 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/GetOrBuildFirTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/GetOrBuildFirTestGenerated.java @@ -279,6 +279,12 @@ public class GetOrBuildFirTestGenerated extends AbstractGetOrBuildFirTest { runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/ifExpression.kt"); } + @Test + @TestMetadata("insidePlusAssignTarget.kt") + public void testInsidePlusAssignTarget() throws Exception { + runTest("analysis/low-level-api-fir/testdata/getOrBuildFir/expressions/insidePlusAssignTarget.kt"); + } + @Test @TestMetadata("intLiteral.kt") public void testIntLiteral() throws Exception { diff --git a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt index 056468b50dc..0fb4448ff81 100644 --- a/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt +++ b/compiler/fir/raw-fir/raw-fir.common/src/org/jetbrains/kotlin/fir/builder/BaseFirBuilder.kt @@ -8,7 +8,6 @@ package org.jetbrains.kotlin.fir.builder import com.intellij.psi.tree.IElementType import org.jetbrains.kotlin.* import org.jetbrains.kotlin.KtNodeTypes.* -import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Visibilities import org.jetbrains.kotlin.fir.* @@ -919,14 +918,13 @@ abstract class BaseFirBuilder(val baseSession: FirSession, val context: Conte return buildAssignmentOperatorStatement { source = baseSource this.operation = operation - leftArgument = withDefaultSourceElementKind(KtFakeSourceElementKind.DesugaredCompoundAssignment) { - this@generateAssignment?.convert() - } ?: buildErrorExpression { - source = null - diagnostic = ConeSimpleDiagnostic( - "Unsupported left value of assignment: ${baseSource?.psi?.text}", DiagnosticKind.ExpressionExpected - ) - } + leftArgument = this@generateAssignment?.convert() + ?: buildErrorExpression { + source = null + diagnostic = ConeSimpleDiagnostic( + "Unsupported left value of assignment: ${baseSource?.psi?.text}", DiagnosticKind.ExpressionExpected + ) + } rightArgument = value this.annotations += annotations }