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