From ed7a3299f0dc1045888fa753c382b19844a92ece Mon Sep 17 00:00:00 2001 From: aleksandrina-streltsova Date: Thu, 27 Apr 2023 18:55:00 +0300 Subject: [PATCH] [Analysis API] Shorten qualifier of unresolved reference ^KTIJ-25115 --- .../fir/components/KtFirReferenceShortener.kt | 19 ++++++++++----- ...ModuleReferenceShortenerTestGenerated.java | 24 +++++++++++++++++++ ...ModuleReferenceShortenerTestGenerated.java | 24 +++++++++++++++++++ .../referenceShortener/annotaiton.kt | 5 ++++ .../referenceShortener/annotaiton.txt | 8 +++++++ .../classWithWrongNumberOfTypeArguments.kt | 3 +++ .../classWithWrongNumberOfTypeArguments.txt | 7 ++++++ .../qualifierOfUnresolvedReference.kt | 8 +++++++ .../qualifierOfUnresolvedReference.txt | 7 ++++++ .../referenceShortener/superEntry.kt | 14 +++++++++++ .../referenceShortener/superEntry.txt | 8 +++++++ 11 files changed, 121 insertions(+), 6 deletions(-) create mode 100644 analysis/analysis-api/testData/components/referenceShortener/referenceShortener/annotaiton.kt create mode 100644 analysis/analysis-api/testData/components/referenceShortener/referenceShortener/annotaiton.txt create mode 100644 analysis/analysis-api/testData/components/referenceShortener/referenceShortener/classWithWrongNumberOfTypeArguments.kt create mode 100644 analysis/analysis-api/testData/components/referenceShortener/referenceShortener/classWithWrongNumberOfTypeArguments.txt create mode 100644 analysis/analysis-api/testData/components/referenceShortener/referenceShortener/qualifierOfUnresolvedReference.kt create mode 100644 analysis/analysis-api/testData/components/referenceShortener/referenceShortener/qualifierOfUnresolvedReference.txt create mode 100644 analysis/analysis-api/testData/components/referenceShortener/referenceShortener/superEntry.kt create mode 100644 analysis/analysis-api/testData/components/referenceShortener/referenceShortener/superEntry.txt 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