[Analysis API] Shorten qualifier of unresolved reference

^KTIJ-25115
This commit is contained in:
aleksandrina-streltsova
2023-04-27 18:55:00 +03:00
committed by teamcity
parent 2d945b7226
commit ed7a3299f0
11 changed files with 121 additions and 6 deletions
@@ -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?
@@ -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 {
@@ -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 {
@@ -0,0 +1,5 @@
package some
annotation class SomeAnnotation
class Complete(@set:<expr>some.SomeAnnotation</expr> var field: Int)
@@ -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
@@ -0,0 +1,3 @@
// WITH_STDLIB
// FILE: main.kt
fun other() : <expr>java.util.SortedSet</expr>
@@ -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
@@ -0,0 +1,8 @@
// FILE: main.kt
package x.y.z
fun test(a: <expr>a.b.c.A.f</expr>) {}
// FILE: dependency.kt
package a.b.c
class A
@@ -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
@@ -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<<expr>foo.bar.A</expr>>.foo()
}
}
@@ -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