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