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 20f34310032..4813182cd6b 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 @@ -86,7 +86,7 @@ internal class KtFirReferenceShortener( val declarationToVisit = file.findSmallestElementOfTypeContainingSelection(selection) ?: file - val firDeclaration = declarationToVisit.getOrBuildFir(firResolveSession) as? FirDeclaration ?: return ShortenCommandImpl( + val firDeclaration = declarationToVisit.getCorrespondingFirDeclaration() ?: return ShortenCommandImpl( file.createSmartPointer(), importsToAdd = emptySet(), starImportsToAdd = emptySet(), @@ -141,6 +141,18 @@ internal class KtFirReferenceShortener( ) } + private fun KtElement.getCorrespondingFirDeclaration(): FirDeclaration? { + require(this is KtFile || this is KtDeclaration) + + val firElement = getOrBuildFir(firResolveSession) + + return when (firElement) { + is FirDeclaration -> firElement + is FirAnonymousFunctionExpression -> firElement.anonymousFunction + else -> null + } + } + private fun buildSymbol(firSymbol: FirBasedSymbol<*>): KtSymbol = analysisSession.firSymbolBuilder.buildSymbol(firSymbol) } @@ -153,10 +165,13 @@ private fun FqName.dropFakeRootPrefixIfPresent(): FqName { private data class AdditionalImports(val simpleImports: Set, val starImports: Set) -private inline fun KtFile.findSmallestElementOfTypeContainingSelection(selection: TextRange): T? = - findElementAt(selection.startOffset) - ?.parentsOfType(withSelf = true) - ?.firstOrNull { selection in it.textRange } +private inline fun KtFile.findSmallestElementOfTypeContainingSelection(selection: TextRange): T? { + val parents = findElementAt(selection.startOffset) + ?.parentsWithSelf + ?.toList() + + return parents?.filterIsInstance()?.firstOrNull { selection in it.textRange } +} /** * How a symbol is imported. The order of the enum entry represents the priority of imports. If a symbol is available from multiple kinds of 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 4c4a9c16f83..7fb604e04e9 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 @@ -52,6 +52,24 @@ public class FirIdeNormalAnalysisSourceModuleReferenceShortenerTestGenerated ext runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/annotaiton.kt"); } + @Test + @TestMetadata("anonymousFunction_annotation.kt") + public void testAnonymousFunction_annotation() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/anonymousFunction_annotation.kt"); + } + + @Test + @TestMetadata("anonymousFunction_receiverType.kt") + public void testAnonymousFunction_receiverType() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/anonymousFunction_receiverType.kt"); + } + + @Test + @TestMetadata("anonymousFunction_returnType.kt") + public void testAnonymousFunction_returnType() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/anonymousFunction_returnType.kt"); + } + @Test @TestMetadata("callInsideScriptExpression.kts") public void testCallInsideScriptExpression() 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 550a7d46a13..feb042afa55 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 @@ -52,6 +52,24 @@ public class FirStandaloneNormalAnalysisSourceModuleReferenceShortenerTestGenera runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/annotaiton.kt"); } + @Test + @TestMetadata("anonymousFunction_annotation.kt") + public void testAnonymousFunction_annotation() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/anonymousFunction_annotation.kt"); + } + + @Test + @TestMetadata("anonymousFunction_receiverType.kt") + public void testAnonymousFunction_receiverType() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/anonymousFunction_receiverType.kt"); + } + + @Test + @TestMetadata("anonymousFunction_returnType.kt") + public void testAnonymousFunction_returnType() throws Exception { + runTest("analysis/analysis-api/testData/components/referenceShortener/referenceShortener/anonymousFunction_returnType.kt"); + } + @Test @TestMetadata("callInsideScriptExpression.kts") public void testCallInsideScriptExpression() throws Exception { diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/anonymousFunction_annotation.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/anonymousFunction_annotation.kt new file mode 100644 index 00000000000..9806e181309 --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/anonymousFunction_annotation.kt @@ -0,0 +1,9 @@ +// FILE: main.kt +package test + +val anonymous = @dependency.Ann fun() {} + +// FILE: dependency.kt +package dependency + +annotation class Ann diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/anonymousFunction_annotation.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/anonymousFunction_annotation.txt new file mode 100644 index 00000000000..d98598fa69c --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/anonymousFunction_annotation.txt @@ -0,0 +1,7 @@ +Before shortening: @dependency.Ann +with DO_NOT_SHORTEN: +with SHORTEN_IF_ALREADY_IMPORTED: +with SHORTEN_AND_IMPORT: +[type] dependency.Ann +with SHORTEN_AND_STAR_IMPORT: +[type] dependency.Ann diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/anonymousFunction_receiverType.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/anonymousFunction_receiverType.kt new file mode 100644 index 00000000000..72763b4279a --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/anonymousFunction_receiverType.kt @@ -0,0 +1,9 @@ +// FILE: main.kt +package test + +val anonymous = fun dependency.Type.() {} + +// FILE: dependency.kt +package dependency + +class Type diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/anonymousFunction_receiverType.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/anonymousFunction_receiverType.txt new file mode 100644 index 00000000000..27ecce329d7 --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/anonymousFunction_receiverType.txt @@ -0,0 +1,7 @@ +Before shortening: dependency.Type +with DO_NOT_SHORTEN: +with SHORTEN_IF_ALREADY_IMPORTED: +with SHORTEN_AND_IMPORT: +[type] dependency.Type +with SHORTEN_AND_STAR_IMPORT: +[type] dependency.Type diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/anonymousFunction_returnType.kt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/anonymousFunction_returnType.kt new file mode 100644 index 00000000000..02a1777ef03 --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/anonymousFunction_returnType.kt @@ -0,0 +1,9 @@ +// FILE: main.kt +package test + +val anonymous = fun(): dependency.Type = dependency.Type() + +// FILE: dependency.kt +package dependency + +class Type diff --git a/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/anonymousFunction_returnType.txt b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/anonymousFunction_returnType.txt new file mode 100644 index 00000000000..27ecce329d7 --- /dev/null +++ b/analysis/analysis-api/testData/components/referenceShortener/referenceShortener/anonymousFunction_returnType.txt @@ -0,0 +1,7 @@ +Before shortening: dependency.Type +with DO_NOT_SHORTEN: +with SHORTEN_IF_ALREADY_IMPORTED: +with SHORTEN_AND_IMPORT: +[type] dependency.Type +with SHORTEN_AND_STAR_IMPORT: +[type] dependency.Type