From c0d54f9bbf26ff83ccaeaf9a6626e776e7f9cd36 Mon Sep 17 00:00:00 2001 From: Roman Golyshev Date: Mon, 22 Jan 2024 15:59:40 +0100 Subject: [PATCH] KT-65152 [AA] Add extra test for package resolution Make sure that, when ambiguous, both the package and the callable/class/property are resolved from KDoc reference. Do a slight refactoring of `KDocReferenceResolver` This behavior is also true for K1 --- ...isSourceModuleReferenceResolveTestGenerated.java | 6 ++++++ .../api/fir/references/KDocReferenceResolver.kt | 10 +++++++++- ...isSourceModuleReferenceResolveTestGenerated.java | 6 ++++++ ...rySourceModuleReferenceResolveTestGenerated.java | 6 ++++++ ...isSourceModuleReferenceResolveTestGenerated.java | 6 ++++++ ...isSourceModuleReferenceResolveTestGenerated.java | 6 ++++++ .../kDoc/packages/packageVsTopLevelDeclarations.kt | 13 +++++++++++++ .../kDoc/packages/packageVsTopLevelDeclarations.txt | 11 +++++++++++ 8 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 analysis/analysis-api/testData/referenceResolve/kDoc/packages/packageVsTopLevelDeclarations.kt create mode 100644 analysis/analysis-api/testData/referenceResolve/kDoc/packages/packageVsTopLevelDeclarations.txt diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java index 5d3d37ae597..9bfedc3b893 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/references/Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java @@ -1623,6 +1623,12 @@ public class Fe10IdeNormalAnalysisSourceModuleReferenceResolveTestGenerated exte public void testLongPackage() throws Exception { runTest("analysis/analysis-api/testData/referenceResolve/kDoc/packages/longPackage.kt"); } + + @Test + @TestMetadata("packageVsTopLevelDeclarations.kt") + public void testPackageVsTopLevelDeclarations() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/packages/packageVsTopLevelDeclarations.kt"); + } } @Nested diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KDocReferenceResolver.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KDocReferenceResolver.kt index f39ef207ea0..09823e9265c 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KDocReferenceResolver.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/references/KDocReferenceResolver.kt @@ -23,6 +23,7 @@ import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty import kotlin.reflect.KClass import org.jetbrains.kotlin.analysis.utils.printer.parentOfType +import org.jetbrains.kotlin.utils.addIfNotNull internal object KDocReferenceResolver { @@ -84,7 +85,7 @@ internal object KDocReferenceResolver { context(KtAnalysisSession) private fun resolveKdocFqName(fqName: FqName, contextElement: KtElement): Collection { getExtensionReceiverSymbolByThisQualifier(fqName, contextElement).ifNotEmpty { return this } - (getSymbolsFromScopes(fqName, contextElement) + listOfNotNull(getPackageSymbolIfPackageExists(fqName))).ifNotEmpty { return this } + getSymbolsFromExistingScopes(fqName, contextElement).ifNotEmpty { return this } getNonImportedSymbolsByFullyQualifiedName(fqName).ifNotEmpty { return this } AdditionalKDocResolutionProvider.resolveKdocFqName(fqName, contextElement).ifNotEmpty { return this } return emptyList() @@ -102,6 +103,13 @@ internal object KDocReferenceResolver { return emptyList() } + context(KtAnalysisSession) + private fun getSymbolsFromExistingScopes(fqName: FqName, contextElement: KtElement): Collection = + buildList { + addAll(getSymbolsFromScopes(fqName, contextElement)) + addIfNotNull(getPackageSymbolIfPackageExists(fqName)) + } + context(KtAnalysisSession) private fun getSymbolsFromScopes(fqName: FqName, contextElement: KtElement): Collection { getSymbolsFromParentMemberScopes(fqName, contextElement).ifNotEmpty { return this } diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java index 187d10b3e9a..4c16d128b2f 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated.java @@ -1623,6 +1623,12 @@ public class FirIdeDependentAnalysisSourceModuleReferenceResolveTestGenerated ex public void testLongPackage() throws Exception { runTest("analysis/analysis-api/testData/referenceResolve/kDoc/packages/longPackage.kt"); } + + @Test + @TestMetadata("packageVsTopLevelDeclarations.kt") + public void testPackageVsTopLevelDeclarations() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/packages/packageVsTopLevelDeclarations.kt"); + } } @Nested diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java index 1545dfd2b60..435604c69c9 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerated.java @@ -1507,6 +1507,12 @@ public class FirIdeNormalAnalysisLibrarySourceModuleReferenceResolveTestGenerate public void testLongPackage() throws Exception { runTest("analysis/analysis-api/testData/referenceResolve/kDoc/packages/longPackage.kt"); } + + @Test + @TestMetadata("packageVsTopLevelDeclarations.kt") + public void testPackageVsTopLevelDeclarations() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/packages/packageVsTopLevelDeclarations.kt"); + } } @Nested diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java index e4caac33641..2a72e205a55 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/references/FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated.java @@ -1623,6 +1623,12 @@ public class FirIdeNormalAnalysisSourceModuleReferenceResolveTestGenerated exten public void testLongPackage() throws Exception { runTest("analysis/analysis-api/testData/referenceResolve/kDoc/packages/longPackage.kt"); } + + @Test + @TestMetadata("packageVsTopLevelDeclarations.kt") + public void testPackageVsTopLevelDeclarations() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/packages/packageVsTopLevelDeclarations.kt"); + } } @Nested diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java index 382588526a3..654fa0623aa 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/references/FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerated.java @@ -1623,6 +1623,12 @@ public class FirStandaloneNormalAnalysisSourceModuleReferenceResolveTestGenerate public void testLongPackage() throws Exception { runTest("analysis/analysis-api/testData/referenceResolve/kDoc/packages/longPackage.kt"); } + + @Test + @TestMetadata("packageVsTopLevelDeclarations.kt") + public void testPackageVsTopLevelDeclarations() throws Exception { + runTest("analysis/analysis-api/testData/referenceResolve/kDoc/packages/packageVsTopLevelDeclarations.kt"); + } } @Nested diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/packages/packageVsTopLevelDeclarations.kt b/analysis/analysis-api/testData/referenceResolve/kDoc/packages/packageVsTopLevelDeclarations.kt new file mode 100644 index 00000000000..0c85c51a663 --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/packages/packageVsTopLevelDeclarations.kt @@ -0,0 +1,13 @@ +package foo + +interface foo + +fun foo() {} + +/** + * [foo] + * + * [foo.foo] + * [foo.foo] + */ +fun usage() {} \ No newline at end of file diff --git a/analysis/analysis-api/testData/referenceResolve/kDoc/packages/packageVsTopLevelDeclarations.txt b/analysis/analysis-api/testData/referenceResolve/kDoc/packages/packageVsTopLevelDeclarations.txt new file mode 100644 index 00000000000..6b3c0a4e5cd --- /dev/null +++ b/analysis/analysis-api/testData/referenceResolve/kDoc/packages/packageVsTopLevelDeclarations.txt @@ -0,0 +1,11 @@ +Caret 1 resolved to: +0: (in foo) fun foo() +1: (in foo) interface foo +2: package foo + +Caret 2 resolved to: +0: package foo + +Caret 3 resolved to: +0: (in foo) fun foo() +1: (in foo) interface foo