[performance] IDEA-340303 There is no need to cache references in HyperlinkAnnotator

GitOrigin-RevId: cc80b90115a134a03ec5064169521442c0e7b0c4
This commit is contained in:
Yuriy Artamonov
2023-12-19 14:14:38 +00:00
committed by intellij-monorepo-bot
parent 3266b134fb
commit 9b05a93fbc
@@ -19,9 +19,6 @@ import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiReference;
import com.intellij.psi.PsiReferenceService;
import com.intellij.psi.PsiReferenceService.Hints;
import com.intellij.psi.util.CachedValueProvider.Result;
import com.intellij.psi.util.CachedValuesManager;
import com.intellij.psi.util.PsiModificationTracker;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.Nls;
@@ -29,7 +26,6 @@ import org.jetbrains.annotations.NotNull;
import java.util.List;
import static com.intellij.util.containers.ContainerUtil.unmodifiableOrEmptyList;
import static java.util.Objects.requireNonNull;
@ApiStatus.NonExtendable
@@ -41,15 +37,17 @@ public class HyperlinkAnnotator implements Annotator {
public void annotate(@NotNull PsiElement element, @NotNull AnnotationHolder holder) {
if (holder.isBatchMode()) return;
for (PsiHighlightedReference reference : PsiSymbolReferenceService.getService().getReferences(element, PsiHighlightedReference.class)) {
TextRange range = reference.getAbsoluteRange();
String message = reference.highlightMessage();
AnnotationBuilder annotationBuilder = message == null ? holder.newSilentAnnotation(reference.highlightSeverity())
: holder.newAnnotation(reference.highlightSeverity(), message);
reference.highlightReference(annotationBuilder.range(range)).create();
}
if (WebReference.isWebReferenceWorthy(element)) {
// asking for references on every element is too expensive, only ask for it on potential external reference hosts
// not only slow, but also creates a lot of cached values and SoftReference instances in all elements
for (PsiHighlightedReference reference : PsiSymbolReferenceService.getService().getReferences(element, PsiHighlightedReference.class)) {
TextRange range = reference.getAbsoluteRange();
String message = reference.highlightMessage();
AnnotationBuilder annotationBuilder = message == null ? holder.newSilentAnnotation(reference.highlightSeverity())
: holder.newAnnotation(reference.highlightSeverity(), message);
reference.highlightReference(annotationBuilder.range(range)).create();
}
annotateContributedReferences(element, holder);
}
}
@@ -69,12 +67,9 @@ public class HyperlinkAnnotator implements Annotator {
}
}
@NotNull
private static List<PsiReference> getReferences(@NotNull PsiElement element) {
return CachedValuesManager.getCachedValue(element, () -> {
List<PsiReference> references = PsiReferenceService.getService().getReferences(element, Hints.HIGHLIGHTED_REFERENCES);
return Result.create(unmodifiableOrEmptyList(references), PsiModificationTracker.MODIFICATION_COUNT);
});
private static @NotNull List<PsiReference> getReferences(@NotNull PsiElement element) {
// there is very little sense in caching them here
return PsiReferenceService.getService().getReferences(element, Hints.HIGHLIGHTED_REFERENCES);
}
private static boolean annotateHyperlinks(@NotNull PsiElement element,