diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirReferenceShortener.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirReferenceShortener.kt
index 13d2fe6ac74..cfb88768c0d 100644
--- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirReferenceShortener.kt
+++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/components/KtFirReferenceShortener.kt
@@ -973,7 +973,7 @@ private class ElementsToShortenCollector(
val scopes = shorteningContext.findScopesAtPosition(qualifiedProperty, getNamesToImport(), towerContextProvider) ?: return
val availableCallables = shorteningContext.findPropertiesInScopes(scopes, callableSymbol.name)
- val firPropertyAccess = qualifiedProperty.getOrBuildFir(firResolveSession) as? FirQualifiedAccessExpression ?: return
+ val firPropertyAccess = qualifiedProperty.getCorrespondingPropertyAccessExpression() ?: return
// if explicit receiver is a property access or a function call, we cannot shorten it
if (firPropertyAccess.explicitReceiver !is FirResolvedQualifier) return
@@ -992,6 +992,15 @@ private class ElementsToShortenCollector(
)
}
+ private fun KtDotQualifiedExpression.getCorrespondingPropertyAccessExpression(): FirPropertyAccessExpression? {
+ val accessExpression = when (val fir = getOrBuildFir(firResolveSession)) {
+ is FirVariableAssignment -> fir.unwrapLValue()
+ else -> fir
+ }
+
+ return accessExpression as? FirPropertyAccessExpression
+ }
+
private fun processFunctionCall(functionCall: FirFunctionCall) {
if (!canBePossibleToDropReceiver(functionCall)) return
diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated.java
index 3b86b86826e..448f425f8ea 100644
--- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated.java
+++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated.java
@@ -430,6 +430,24 @@ public class FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated ext
runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variable2.kt");
}
+ @Test
+ @TestMetadata("variableAssignment.kt")
+ public void testVariableAssignment() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variableAssignment.kt");
+ }
+
+ @Test
+ @TestMetadata("variableAssignment_plusAssignOperator.kt")
+ public void testVariableAssignment_plusAssignOperator() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variableAssignment_plusAssignOperator.kt");
+ }
+
+ @Test
+ @TestMetadata("variableAssignment_plusOperator.kt")
+ public void testVariableAssignment_plusOperator() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variableAssignment_plusOperator.kt");
+ }
+
@Nested
@TestMetadata("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses")
@TestDataPath("$PROJECT_ROOT")
diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenerated.java
index ee07f2beceb..a716706c64a 100644
--- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenerated.java
+++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenerated.java
@@ -430,6 +430,24 @@ public class FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenera
runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variable2.kt");
}
+ @Test
+ @TestMetadata("variableAssignment.kt")
+ public void testVariableAssignment() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variableAssignment.kt");
+ }
+
+ @Test
+ @TestMetadata("variableAssignment_plusAssignOperator.kt")
+ public void testVariableAssignment_plusAssignOperator() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variableAssignment_plusAssignOperator.kt");
+ }
+
+ @Test
+ @TestMetadata("variableAssignment_plusOperator.kt")
+ public void testVariableAssignment_plusOperator() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variableAssignment_plusOperator.kt");
+ }
+
@Nested
@TestMetadata("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/nestedClasses")
@TestDataPath("$PROJECT_ROOT")
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variableAssignment.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variableAssignment.kt
new file mode 100644
index 00000000000..30f46a45a6d
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variableAssignment.kt
@@ -0,0 +1,11 @@
+// FILE: main.kt
+package test
+
+fun usage() {
+ dependency.foo = 20
+}
+
+// FILE: dependency.kt
+package dependency
+
+var foo: Int = 10
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variableAssignment.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variableAssignment.txt
new file mode 100644
index 00000000000..3bdee8c2315
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variableAssignment.txt
@@ -0,0 +1,7 @@
+Before shortening: dependency.foo = 20
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+with SHORTEN_AND_IMPORT:
+[qualifier] dependency.foo
+with SHORTEN_AND_STAR_IMPORT:
+[qualifier] dependency.foo
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variableAssignment_plusAssignOperator.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variableAssignment_plusAssignOperator.kt
new file mode 100644
index 00000000000..f61b08e5bb9
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variableAssignment_plusAssignOperator.kt
@@ -0,0 +1,15 @@
+// FILE: main.kt
+package test
+
+fun usage() {
+ dependency.foo += 20
+}
+
+// FILE: dependency.kt
+package dependency
+
+val foo: Foo = Foo()
+
+class Foo {
+ operator fun plusAssign(i: Int) {}
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variableAssignment_plusAssignOperator.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variableAssignment_plusAssignOperator.txt
new file mode 100644
index 00000000000..b0e2074d4da
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variableAssignment_plusAssignOperator.txt
@@ -0,0 +1,7 @@
+Before shortening: dependency.foo += 20
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+with SHORTEN_AND_IMPORT:
+[qualifier] dependency.foo
+with SHORTEN_AND_STAR_IMPORT:
+[qualifier] dependency.foo
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variableAssignment_plusOperator.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variableAssignment_plusOperator.kt
new file mode 100644
index 00000000000..e4c3ee9326b
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variableAssignment_plusOperator.kt
@@ -0,0 +1,15 @@
+// FILE: main.kt
+package test
+
+fun usage() {
+ dependency.foo += 20
+}
+
+// FILE: dependency.kt
+package dependency
+
+var foo: Foo = Foo()
+
+class Foo {
+ operator fun plus(i: Int): Foo = this
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variableAssignment_plusOperator.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variableAssignment_plusOperator.txt
new file mode 100644
index 00000000000..b0e2074d4da
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/variableAssignment_plusOperator.txt
@@ -0,0 +1,7 @@
+Before shortening: dependency.foo += 20
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+with SHORTEN_AND_IMPORT:
+[qualifier] dependency.foo
+with SHORTEN_AND_STAR_IMPORT:
+[qualifier] dependency.foo