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 909ddde41b5..cb63830eae0 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
@@ -365,15 +365,22 @@ private class ElementsToShortenCollector(
}
private fun processTypeRef(resolvedTypeRef: FirResolvedTypeRef) {
- val wholeTypeReference = resolvedTypeRef.realPsi as? KtTypeReference ?: return
- if (!wholeTypeReference.textRange.intersects(selection)) return
+ val nonErrorResolvedTypeRef = if (resolvedTypeRef is FirErrorTypeRef) {
+ resolvedTypeRef.partiallyResolvedTypeRef as? FirResolvedTypeRef ?: resolvedTypeRef
+ } else resolvedTypeRef
- val wholeClassifierId = resolvedTypeRef.type.lowerBoundIfFlexible().candidateClassId ?: return
- val wholeTypeElement = wholeTypeReference.typeElement?.unwrapNullability() as? KtUserType ?: return
+ val typeElement = when (val realPsi = nonErrorResolvedTypeRef.realPsi) {
+ is KtTypeReference -> realPsi.typeElement
+ is KtNameReferenceExpression -> realPsi.parent as? KtTypeElement
+ else -> null
+ }?.unwrapNullability() as? KtUserType ?: return
- if (wholeTypeElement.qualifier == null) return
+ if (!typeElement.textRange.intersects(selection)) return
+ if (typeElement.qualifier == null) return
- findTypeToShorten(wholeClassifierId, wholeTypeElement)?.let(::addElementToShorten)
+ val classifierId = nonErrorResolvedTypeRef.type.lowerBoundIfFlexible().candidateClassId ?: return
+
+ findTypeToShorten(classifierId, typeElement)?.let(::addElementToShorten)
}
val ConeKotlinType.candidateClassId: ClassId?
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 0e8f01d5dbd..15d2b7119d3 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
@@ -46,6 +46,12 @@ public class FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated ext
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/referenceShortener/referenceShortener"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
+ @Test
+ @TestMetadata("annotaiton.kt")
+ public void testAnnotaiton() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/annotaiton.kt");
+ }
+
@Test
@TestMetadata("classScopes.kt")
public void testClassScopes() throws Exception {
@@ -76,6 +82,12 @@ public class FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated ext
runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/classType2.kt");
}
+ @Test
+ @TestMetadata("classWithWrongNumberOfTypeArguments.kt")
+ public void testClassWithWrongNumberOfTypeArguments() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/classWithWrongNumberOfTypeArguments.kt");
+ }
+
@Test
@TestMetadata("classesWithSameName.kt")
public void testClassesWithSameName() throws Exception {
@@ -250,6 +262,12 @@ public class FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated ext
runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/parameterTypeTopLevelTypeLoses.kt");
}
+ @Test
+ @TestMetadata("qualifierOfUnresolvedReference.kt")
+ public void testQualifierOfUnresolvedReference() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/qualifierOfUnresolvedReference.kt");
+ }
+
@Test
@TestMetadata("receiver.kt")
public void testReceiver() throws Exception {
@@ -352,6 +370,12 @@ public class FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated ext
runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/superClass.kt");
}
+ @Test
+ @TestMetadata("superEntry.kt")
+ public void testSuperEntry() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/superEntry.kt");
+ }
+
@Test
@TestMetadata("typeParams.kt")
public void testTypeParams() 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 35644ea3e2a..ab00d0d2528 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
@@ -46,6 +46,12 @@ public class FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenera
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/referenceShortener/referenceShortener"), Pattern.compile("^(.+)\\.kt$"), null, true);
}
+ @Test
+ @TestMetadata("annotaiton.kt")
+ public void testAnnotaiton() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/annotaiton.kt");
+ }
+
@Test
@TestMetadata("classScopes.kt")
public void testClassScopes() throws Exception {
@@ -76,6 +82,12 @@ public class FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenera
runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/classType2.kt");
}
+ @Test
+ @TestMetadata("classWithWrongNumberOfTypeArguments.kt")
+ public void testClassWithWrongNumberOfTypeArguments() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/classWithWrongNumberOfTypeArguments.kt");
+ }
+
@Test
@TestMetadata("classesWithSameName.kt")
public void testClassesWithSameName() throws Exception {
@@ -250,6 +262,12 @@ public class FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenera
runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/parameterTypeTopLevelTypeLoses.kt");
}
+ @Test
+ @TestMetadata("qualifierOfUnresolvedReference.kt")
+ public void testQualifierOfUnresolvedReference() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/qualifierOfUnresolvedReference.kt");
+ }
+
@Test
@TestMetadata("receiver.kt")
public void testReceiver() throws Exception {
@@ -352,6 +370,12 @@ public class FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenera
runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/superClass.kt");
}
+ @Test
+ @TestMetadata("superEntry.kt")
+ public void testSuperEntry() throws Exception {
+ runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/superEntry.kt");
+ }
+
@Test
@TestMetadata("typeParams.kt")
public void testTypeParams() throws Exception {
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/annotaiton.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/annotaiton.kt
new file mode 100644
index 00000000000..c827c777571
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/annotaiton.kt
@@ -0,0 +1,5 @@
+package some
+
+annotation class SomeAnnotation
+
+class Complete(@set:some.SomeAnnotation var field: Int)
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/annotaiton.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/annotaiton.txt
new file mode 100644
index 00000000000..94d2e67313d
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/annotaiton.txt
@@ -0,0 +1,8 @@
+Before shortening: some.SomeAnnotation
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+[type] some.SomeAnnotation
+with SHORTEN_AND_IMPORT:
+[type] some.SomeAnnotation
+with SHORTEN_AND_STAR_IMPORT:
+[type] some.SomeAnnotation
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/classWithWrongNumberOfTypeArguments.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/classWithWrongNumberOfTypeArguments.kt
new file mode 100644
index 00000000000..2a9acdabbc2
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/classWithWrongNumberOfTypeArguments.kt
@@ -0,0 +1,3 @@
+// WITH_STDLIB
+// FILE: main.kt
+fun other() : java.util.SortedSet
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/classWithWrongNumberOfTypeArguments.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/classWithWrongNumberOfTypeArguments.txt
new file mode 100644
index 00000000000..7a903ef8945
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/classWithWrongNumberOfTypeArguments.txt
@@ -0,0 +1,7 @@
+Before shortening: java.util.SortedSet
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+with SHORTEN_AND_IMPORT:
+[type] java.util.SortedSet
+with SHORTEN_AND_STAR_IMPORT:
+[type] java.util.SortedSet
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/qualifierOfUnresolvedReference.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/qualifierOfUnresolvedReference.kt
new file mode 100644
index 00000000000..93cf8f950d9
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/qualifierOfUnresolvedReference.kt
@@ -0,0 +1,8 @@
+// FILE: main.kt
+package x.y.z
+
+fun test(a: a.b.c.A.f) {}
+// FILE: dependency.kt
+package a.b.c
+
+class A
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/qualifierOfUnresolvedReference.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/qualifierOfUnresolvedReference.txt
new file mode 100644
index 00000000000..fbe7e965a9e
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/qualifierOfUnresolvedReference.txt
@@ -0,0 +1,7 @@
+Before shortening: a.b.c.A.f
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+with SHORTEN_AND_IMPORT:
+[type] a.b.c.A
+with SHORTEN_AND_STAR_IMPORT:
+[type] a.b.c.A
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/superEntry.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/superEntry.kt
new file mode 100644
index 00000000000..74c98db3576
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/superEntry.kt
@@ -0,0 +1,14 @@
+package foo.bar
+interface A {
+ fun foo(i: Int) {}
+}
+
+interface B {
+ fun foo(i2: Int) {}
+}
+
+class C : A, B {
+ override fun foo(j: Int) {
+ super<foo.bar.A>.foo()
+ }
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/superEntry.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/superEntry.txt
new file mode 100644
index 00000000000..a705db7d3f3
--- /dev/null
+++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/superEntry.txt
@@ -0,0 +1,8 @@
+Before shortening: foo.bar.A
+with DO_NOT_SHORTEN:
+with SHORTEN_IF_ALREADY_IMPORTED:
+[type] foo.bar.A
+with SHORTEN_AND_IMPORT:
+[type] foo.bar.A
+with SHORTEN_AND_STAR_IMPORT:
+[type] foo.bar.A