[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
@@ -139,9 +139,8 @@ public final class JavaDocCompletionContributor extends CompletionContributor im
else if (position.getParent() instanceof PsiDocFragmentName docFragmentName) {
final PsiElement parent = docFragmentName.getParent();
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.getJavaDocFragmentsForClass(position.getProject(), fqn)) {
if (classRef != null) {
for (JavaDocFragmentData anchor : JavaDocFragmentAnchorCacheKt.getJavaDocFragmentsForClass(position.getProject(), classRef)) {
result.addElement(LookupElementBuilder.create(anchor.getName()).withIcon(AllIcons.Nodes.Related));
}
}
@@ -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);
@@ -138,7 +138,6 @@ public class JavadocCompletionTest extends LightFixtureCompletionTestCase {
assertTrue(getLookupElementStrings().containsAll(Arrays.asList("foo", "myName")));
}
@NeedsIndex.Full
public void testSee7() {
configureByFile("See7.java");
assertTrue(getLookupElementStrings().containsAll(Arrays.asList("my-id1", "my-id2", "my-id3", "my-id4")));
@@ -4,6 +4,9 @@ package com.intellij.java.indexing;
import com.intellij.codeInsight.javadoc.JavaDocFragmentAnchorCacheKt;
import com.intellij.codeInsight.javadoc.JavaDocFragmentData;
import com.intellij.openapi.project.Project;
import com.intellij.psi.JavaPsiFacade;
import com.intellij.psi.PsiClass;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.testFramework.LightJavaCodeInsightTestCase;
import org.intellij.lang.annotations.Language;
@@ -35,7 +38,10 @@ public class JavaDocFragmentAnchorCacheTest extends LightJavaCodeInsightTestCase
Project project = getProject();
Collection<JavaDocFragmentData> anchors = JavaDocFragmentAnchorCacheKt.getJavaDocFragmentsForClass(project, "p.A");
PsiClass psiClass = JavaPsiFacade.getInstance(project).findClass("p.A", GlobalSearchScope.projectScope(project));
assertNotNull(psiClass);
Collection<JavaDocFragmentData> anchors = JavaDocFragmentAnchorCacheKt.getJavaDocFragmentsForClass(project, psiClass);
assertNotNull(anchors);
assertContainsElements(anchors,
new JavaDocFragmentData("equivalenceRelation", 25),