[javadoc] Remove fqn-based lookup in JavaDocFragmentAnchorCache

IJ-MR-174748

GitOrigin-RevId: 66fecf99f6c3990aa8e4c35bb796413d83909119
This commit is contained in:
Louis Vignier
2025-09-17 19:25:19 +00:00
committed by intellij-monorepo-bot
parent 39361e8124
commit c6cc5e8224
5 changed files with 17 additions and 24 deletions
@@ -3,13 +3,10 @@ package com.intellij.codeInsight.javadoc
import com.intellij.openapi.components.Service
import com.intellij.openapi.components.service
import com.intellij.openapi.project.DumbService
import com.intellij.openapi.project.Project
import com.intellij.psi.JavaPsiFacade
import com.intellij.psi.PsiClass
import com.intellij.psi.impl.source.javadoc.PsiDocFragmentName
import com.intellij.psi.javadoc.PsiDocComment
import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.util.CachedValueProvider.Result
import com.intellij.psi.util.CachedValuesManager
import com.intellij.psi.util.PsiModificationTracker
@@ -28,10 +25,7 @@ private class JavaDocFragmentCacheService {
// Matches any HTML opening tag with an id attribute
private val ID_PATTERN: Pattern = Pattern.compile("<[a-zA-Z0-9\\-]*[^>] id=[\"']?([^\"'> ]+)[\"']?[^>]*>", Pattern.CASE_INSENSITIVE)
fun getAnchors(project: Project, fqn: String): LinkedHashSet<JavaDocFragmentData> {
val psiClass = JavaPsiFacade.getInstance(project).findClass(fqn, GlobalSearchScope.projectScope(project))
?: return LinkedHashSet()
fun getAnchors(project: Project, psiClass: PsiClass): LinkedHashSet<JavaDocFragmentData> {
val manager = CachedValuesManager.getManager(project)
return manager.getCachedValue(psiClass) {
val result = LinkedHashSet<JavaDocFragmentData>().apply {
@@ -67,10 +61,10 @@ private class JavaDocFragmentCacheService {
}
/**
* Resolves all fragment data for the class corresponding to the given fully qualified name.
* Resolves all fragment data for the class corresponding to the given [PsiClass].
*/
fun getJavaDocFragmentsForClass(project: Project, fqn: String): LinkedHashSet<JavaDocFragmentData> {
return project.service<JavaDocFragmentCacheService>().getAnchors(project, fqn)
fun getJavaDocFragmentsForClass(project: Project, psiClass: PsiClass): LinkedHashSet<JavaDocFragmentData> {
return project.service<JavaDocFragmentCacheService>().getAnchors(project, psiClass)
}
/**
@@ -78,12 +72,9 @@ fun getJavaDocFragmentsForClass(project: Project, fqn: String): LinkedHashSet<Ja
* returns the fragment data and its containing class if found.
*/
fun resolveJavaDocFragment(project: Project, fragmentName: PsiDocFragmentName): Pair<PsiClass, JavaDocFragmentData>? {
if (DumbService.getInstance(project).isDumb) return null
val psiClass = fragmentName.getScope()
val fqn = psiClass?.qualifiedName ?: return null
val data = getJavaDocFragmentsForClass(project, fqn).firstOrNull { data: JavaDocFragmentData? -> data!!.name == fragmentName.text }
val psiClass = fragmentName.getScope() ?: return null
val data = getJavaDocFragmentsForClass(project, psiClass)
.firstOrNull { data: JavaDocFragmentData? -> data!!.name == fragmentName.text }
?: return null
return psiClass to data
@@ -153,10 +153,8 @@ public final class JavaDocUtil {
String refTextCorrected,
int fragmentIndex,
@NotNull PsiManager manager) {
String fqn = aClass.getQualifiedName();
if (fqn == null) { return null; }
String fragmentName = refTextCorrected.substring(fragmentIndex + 2);
for (JavaDocFragmentData fragmentData : JavaDocFragmentAnchorCacheKt.getJavaDocFragmentsForClass(manager.getProject(), fqn)) {
for (JavaDocFragmentData fragmentData : JavaDocFragmentAnchorCacheKt.getJavaDocFragmentsForClass(manager.getProject(), aClass)) {
if (fragmentName.equals(fragmentData.getName())) {
PsiElement ref = PsiUtilCore.getElementAtOffset(aClass.getContainingFile(), fragmentData.getOffset());
PsiDocComment docComment = PsiTreeUtil.getParentOfType(ref, PsiDocComment.class, false);