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 9260e2f6bf6..df091bd5208 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
@@ -468,9 +468,11 @@ private class ElementsToShortenCollector(
private fun processTypeRef(resolvedTypeRef: FirResolvedTypeRef) {
val typeElement = resolvedTypeRef.correspondingTypePsi ?: return
- if (typeElement.referenceExpression?.textRange?.intersects(selection) != true) return
if (typeElement.qualifier == null) return
+ val typeReferenceTextRange = typeElement.referenceExpression?.textRange
+ if (typeReferenceTextRange?.intersects(selection) != true) return
+
val classifierId = resolvedTypeRef.type.lowerBoundIfFlexible().candidateClassId ?: return
findTypeQualifierToShorten(classifierId, typeElement)?.let(::addElementToShorten)
@@ -535,13 +537,16 @@ private class ElementsToShortenCollector(
val wholeClassQualifier = resolvedQualifier.classId ?: return
val qualifierPsi = resolvedQualifier.psi ?: return
- if (!qualifierPsi.textRange.intersects(selection)) return
+
val wholeQualifierElement = when (qualifierPsi) {
is KtDotQualifiedExpression -> qualifierPsi
is KtNameReferenceExpression -> qualifierPsi.getDotQualifiedExpressionForSelector() ?: return
else -> return
}
+ val typeReferenceTextRange = wholeQualifierElement.selectorExpression?.textRange
+ if (typeReferenceTextRange?.intersects(selection) != true) return
+
findTypeQualifierToShorten(wholeClassQualifier, wholeQualifierElement)?.let(::addElementToShorten)
}
@@ -1028,9 +1033,11 @@ private class ElementsToShortenCollector(
if (!canBePossibleToDropReceiver(firPropertyAccess)) return
val propertyReferenceExpression = firPropertyAccess.correspondingNameReference ?: return
- if (!propertyReferenceExpression.textRange.intersects(selection)) return
-
val qualifiedProperty = propertyReferenceExpression.getQualifiedElement() as? KtDotQualifiedExpression ?: return
+
+ val propertyReferenceTextRange = propertyReferenceExpression.textRange
+ if (!propertyReferenceTextRange.intersects(selection)) return
+
val propertySymbol = firPropertyAccess.referencedSymbol ?: return
val option = callableShortenOption(propertySymbol)
@@ -1075,8 +1082,7 @@ private class ElementsToShortenCollector(
val callExpression = qualifiedCallExpression.selectorExpression as? KtCallExpression ?: return
val calleeTextRange = callExpression.calleeExpression?.textRange
- val qualifierTextRange = qualifiedCallExpression.receiverExpression.textRange
- if (calleeTextRange?.intersects(selection) != true && !qualifierTextRange.intersects(selection)) return
+ if (calleeTextRange?.intersects(selection) != true) return
val calleeReference = functionCall.calleeReference
val calledSymbol = findUnambiguousReferencedCallableId(calleeReference) ?: 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 7b1eb97af68..ea778944908 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
@@ -340,6 +340,54 @@ public class FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated ext
runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/parameterTypeTopLevelTypeLoses.kt");
}
+ @Test
+ @TestMetadata("partiallySelectedQualifiedCall1.kt")
+ public void testPartiallySelectedQualifiedCall1() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall1.kt");
+ }
+
+ @Test
+ @TestMetadata("partiallySelectedQualifiedCall2.kt")
+ public void testPartiallySelectedQualifiedCall2() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall2.kt");
+ }
+
+ @Test
+ @TestMetadata("partiallySelectedQualifiedCall3.kt")
+ public void testPartiallySelectedQualifiedCall3() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall3.kt");
+ }
+
+ @Test
+ @TestMetadata("partiallySelectedQualifiedCall4.kt")
+ public void testPartiallySelectedQualifiedCall4() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall4.kt");
+ }
+
+ @Test
+ @TestMetadata("partiallySelectedType1.kt")
+ public void testPartiallySelectedType1() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedType1.kt");
+ }
+
+ @Test
+ @TestMetadata("partiallySelectedType2.kt")
+ public void testPartiallySelectedType2() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedType2.kt");
+ }
+
+ @Test
+ @TestMetadata("partiallySelectedTypeQualifier1.kt")
+ public void testPartiallySelectedTypeQualifier1() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedTypeQualifier1.kt");
+ }
+
+ @Test
+ @TestMetadata("partiallySelectedTypeQualifier2.kt")
+ public void testPartiallySelectedTypeQualifier2() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedTypeQualifier2.kt");
+ }
+
@Test
@TestMetadata("qualifierOfUnresolvedReference.kt")
public void testQualifierOfUnresolvedReference() throws Exception {
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 c7734164a98..ab996f39ded 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
@@ -340,6 +340,54 @@ public class FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenera
runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/parameterTypeTopLevelTypeLoses.kt");
}
+ @Test
+ @TestMetadata("partiallySelectedQualifiedCall1.kt")
+ public void testPartiallySelectedQualifiedCall1() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall1.kt");
+ }
+
+ @Test
+ @TestMetadata("partiallySelectedQualifiedCall2.kt")
+ public void testPartiallySelectedQualifiedCall2() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall2.kt");
+ }
+
+ @Test
+ @TestMetadata("partiallySelectedQualifiedCall3.kt")
+ public void testPartiallySelectedQualifiedCall3() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall3.kt");
+ }
+
+ @Test
+ @TestMetadata("partiallySelectedQualifiedCall4.kt")
+ public void testPartiallySelectedQualifiedCall4() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall4.kt");
+ }
+
+ @Test
+ @TestMetadata("partiallySelectedType1.kt")
+ public void testPartiallySelectedType1() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedType1.kt");
+ }
+
+ @Test
+ @TestMetadata("partiallySelectedType2.kt")
+ public void testPartiallySelectedType2() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedType2.kt");
+ }
+
+ @Test
+ @TestMetadata("partiallySelectedTypeQualifier1.kt")
+ public void testPartiallySelectedTypeQualifier1() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedTypeQualifier1.kt");
+ }
+
+ @Test
+ @TestMetadata("partiallySelectedTypeQualifier2.kt")
+ public void testPartiallySelectedTypeQualifier2() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedTypeQualifier2.kt");
+ }
+
@Test
@TestMetadata("qualifierOfUnresolvedReference.kt")
public void testQualifierOfUnresolvedReference() throws Exception {
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall1.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall1.kt
new file mode 100644
index 00000000000..4f8a39401ee
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall1.kt
@@ -0,0 +1,11 @@
+// FILE: main.kt
+package test
+
+fun usage() {
+ dependency.foo()
+}
+
+// FILE: dependency.kt
+package dependency
+
+fun foo() {}
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall1.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall1.txt
new file mode 100644
index 00000000000..fe73dd48498
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall1.txt
@@ -0,0 +1,5 @@
+Before shortening: dependency
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+with SHORTEN_AND_IMPORT:
+with SHORTEN_AND_STAR_IMPORT:
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall2.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall2.kt
new file mode 100644
index 00000000000..8b4decdfb16
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall2.kt
@@ -0,0 +1,11 @@
+// FILE: main.kt
+package test
+
+fun usage() {
+ dependency.foo()
+}
+
+// FILE: dependency.kt
+package dependency
+
+fun foo() {}
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall2.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall2.txt
new file mode 100644
index 00000000000..c464790825d
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall2.txt
@@ -0,0 +1,7 @@
+Before shortening: foo()
+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/partiallySelectedQualifiedCall3.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall3.kt
new file mode 100644
index 00000000000..6399dbea1e7
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall3.kt
@@ -0,0 +1,11 @@
+// FILE: main.kt
+package test
+
+fun usage() {
+ dependency.foo()
+}
+
+// FILE: dependency.kt
+package dependency
+
+val foo: Int = 10
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall3.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall3.txt
new file mode 100644
index 00000000000..fe73dd48498
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall3.txt
@@ -0,0 +1,5 @@
+Before shortening: dependency
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+with SHORTEN_AND_IMPORT:
+with SHORTEN_AND_STAR_IMPORT:
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall4.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall4.kt
new file mode 100644
index 00000000000..4289e32c353
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall4.kt
@@ -0,0 +1,11 @@
+// FILE: main.kt
+package test
+
+fun usage() {
+ dependency.foo
+}
+
+// FILE: dependency.kt
+package dependency
+
+val foo: Int = 10
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall4.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall4.txt
new file mode 100644
index 00000000000..540c1e65a43
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedQualifiedCall4.txt
@@ -0,0 +1,7 @@
+Before shortening: foo
+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/partiallySelectedType1.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedType1.kt
new file mode 100644
index 00000000000..6041000044e
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedType1.kt
@@ -0,0 +1,9 @@
+// FILE: main.kt
+package test
+
+fun usage(foo: dependency.Foo) {}
+
+// FILE: dependency.kt
+package dependency
+
+class Foo
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedType1.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedType1.txt
new file mode 100644
index 00000000000..fe73dd48498
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedType1.txt
@@ -0,0 +1,5 @@
+Before shortening: dependency
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+with SHORTEN_AND_IMPORT:
+with SHORTEN_AND_STAR_IMPORT:
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedType2.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedType2.kt
new file mode 100644
index 00000000000..77c6cc29972
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedType2.kt
@@ -0,0 +1,9 @@
+// FILE: main.kt
+package test
+
+fun usage(foo: dependency.Foo) {}
+
+// FILE: dependency.kt
+package dependency
+
+class Foo
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedType2.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedType2.txt
new file mode 100644
index 00000000000..2f1bf6bad06
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedType2.txt
@@ -0,0 +1,7 @@
+Before shortening: Foo
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+with SHORTEN_AND_IMPORT:
+[type] dependency.Foo
+with SHORTEN_AND_STAR_IMPORT:
+[type] dependency.Foo
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedTypeQualifier1.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedTypeQualifier1.kt
new file mode 100644
index 00000000000..3ed33b22c3d
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedTypeQualifier1.kt
@@ -0,0 +1,13 @@
+// FILE: main.kt
+package test
+
+fun usage() {
+ dependency.Foo.bar()
+}
+
+// FILE: dependency.kt
+package dependency
+
+object Foo {
+ fun bar() {}
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedTypeQualifier1.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedTypeQualifier1.txt
new file mode 100644
index 00000000000..2373886ed3a
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedTypeQualifier1.txt
@@ -0,0 +1,5 @@
+Before shortening: dependency
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+with SHORTEN_AND_IMPORT:
+with SHORTEN_AND_STAR_IMPORT:
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedTypeQualifier2.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedTypeQualifier2.kt
new file mode 100644
index 00000000000..ae62a8b3c22
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedTypeQualifier2.kt
@@ -0,0 +1,13 @@
+// FILE: main.kt
+package test
+
+fun usage() {
+ dependency.Foo.bar()
+}
+
+// FILE: dependency.kt
+package dependency
+
+object Foo {
+ fun bar() {}
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedTypeQualifier2.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedTypeQualifier2.txt
new file mode 100644
index 00000000000..2a58491df5a
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/partiallySelectedTypeQualifier2.txt
@@ -0,0 +1,7 @@
+Before shortening: Foo
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+with SHORTEN_AND_IMPORT:
+[qualifier] dependency.Foo
+with SHORTEN_AND_STAR_IMPORT:
+[qualifier] dependency.Foo