diff --git a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/JavaNamesHighlightVisitor.java b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/JavaNamesHighlightVisitor.java index aad23d5f2697..388af092ebf9 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/JavaNamesHighlightVisitor.java +++ b/java/java-analysis-impl/src/com/intellij/codeInsight/daemon/impl/analysis/JavaNamesHighlightVisitor.java @@ -103,7 +103,7 @@ final class JavaNamesHighlightVisitor extends JavaElementVisitor implements High } else if (value instanceof PsiDocFragmentName docFragmentName) { final Pair fragmentData = computeIfSmartMode(value.getProject(), () -> { - return JavaDocFragmentAnchorCacheKt.getAnchor(value.getProject(), docFragmentName); + return JavaDocFragmentAnchorCacheKt.resolveJavaDocFragment(value.getProject(), docFragmentName); }); if (fragmentData != null) { myHolder.add(HighlightNamesUtil.highlightFragmentReference(docFragmentName)); diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaDocCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaDocCompletionContributor.java index 8da8f756cca7..f12b9256e714 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaDocCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaDocCompletionContributor.java @@ -141,7 +141,7 @@ public final class JavaDocCompletionContributor extends CompletionContributor im final PsiClass classRef = parent instanceof PsiDocFragmentRef ? ((PsiDocFragmentRef)docFragmentName.getParent()).getScope() : null; final String fqn = classRef == null ? null : classRef.getQualifiedName(); if (fqn != null) { - for (JavaDocFragmentData anchor : JavaDocFragmentAnchorCacheKt.getAnchors(position.getProject(), fqn)) { + for (JavaDocFragmentData anchor : JavaDocFragmentAnchorCacheKt.getJavaDocFragmentsForClass(position.getProject(), fqn)) { result.addElement(LookupElementBuilder.create(anchor.getName()).withIcon(AllIcons.Nodes.Related)); } } diff --git a/java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java b/java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java index 10de0db907f6..467d56813adc 100644 --- a/java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java +++ b/java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java @@ -454,7 +454,7 @@ public class JavaPsiImplementationHelperImpl extends JavaPsiImplementationHelper public @Nullable PsiSymbolReference getFragmentNameSymbol(@NotNull PsiDocFragmentName fragmentName) { if (DumbService.getInstance(myProject).isDumb()) return null; - final Pair fragmentData = JavaDocFragmentAnchorCacheKt.getAnchor(myProject, fragmentName); + final Pair fragmentData = JavaDocFragmentAnchorCacheKt.resolveJavaDocFragment(myProject, fragmentName); if (fragmentData == null) return null; final int offset = fragmentData.getSecond().getOffset(); diff --git a/java/java-indexing-impl/src/com/intellij/codeInsight/javadoc/index/JavaDocFragmentAnchorCache.kt b/java/java-indexing-impl/src/com/intellij/codeInsight/javadoc/index/JavaDocFragmentAnchorCache.kt index ccfa54a00503..bdbd6a5e4495 100644 --- a/java/java-indexing-impl/src/com/intellij/codeInsight/javadoc/index/JavaDocFragmentAnchorCache.kt +++ b/java/java-indexing-impl/src/com/intellij/codeInsight/javadoc/index/JavaDocFragmentAnchorCache.kt @@ -17,6 +17,12 @@ import java.util.regex.Pattern @JvmField val NAME: ID> = ID.create("java.javadoc.fragment.anchors") +/** + * Data associated with a JavaDoc fragment (e.g. `

`). + * + * @param name fragment name + * @param offset fragment offset in the containing file + */ data class JavaDocFragmentData(val name: String, val offset: Int) @Service(Service.Level.PROJECT) @@ -65,17 +71,24 @@ private class JavaDocFragmentCacheService { } } -fun getAnchors(project: Project, fqnOrPackage: String): LinkedHashSet { - return project.service().getAnchors(project, fqnOrPackage) +/** + * Resolves all fragment data for the class corresponding to the given fully qualified name. + */ +fun getJavaDocFragmentsForClass(project: Project, fqn: String): LinkedHashSet { + return project.service().getAnchors(project, fqn) } -fun getAnchor(project: Project, fragmentName: PsiDocFragmentName): Pair? { +/** + * For a given `PsiDocFragmentName`, e.g. (`my-id` in `{@link MyClass##my-id …}`), + * returns the fragment data and its containing class if found. + */ +fun resolveJavaDocFragment(project: Project, fragmentName: PsiDocFragmentName): Pair? { if (DumbService.getInstance(project).isDumb) return null val psiClass = fragmentName.getScope() val fqn = psiClass?.qualifiedName ?: return null - val data = getAnchors(project, fqn).firstOrNull { data: JavaDocFragmentData -> data.name == fragmentName.text } + val data = getJavaDocFragmentsForClass(project, fqn).firstOrNull { data: JavaDocFragmentData? -> data!!.name == fragmentName.text } ?: return null return psiClass to data diff --git a/java/java-tests/testSrc/com/intellij/java/indexing/JavaDocFragmentAnchorCacheTest.java b/java/java-tests/testSrc/com/intellij/java/indexing/JavaDocFragmentAnchorCacheTest.java index 84bf536527ea..74ed56c56b8f 100644 --- a/java/java-tests/testSrc/com/intellij/java/indexing/JavaDocFragmentAnchorCacheTest.java +++ b/java/java-tests/testSrc/com/intellij/java/indexing/JavaDocFragmentAnchorCacheTest.java @@ -37,7 +37,7 @@ public class JavaDocFragmentAnchorCacheTest extends LightJavaCodeInsightTestCase Project project = getProject(); - Collection anchors = JavaDocFragmentAnchorCacheKt.getAnchors(project, "p.A"); + Collection anchors = JavaDocFragmentAnchorCacheKt.getJavaDocFragmentsForClass(project, "p.A"); assertNotNull(anchors); assertContainsElements(anchors, new JavaDocFragmentData("equivalenceRelation", 25),