diff --git a/platform/lang-impl/src/com/intellij/codeInsight/highlighting/HyperlinkAnnotator.java b/platform/lang-impl/src/com/intellij/codeInsight/highlighting/HyperlinkAnnotator.java index 3cc637b32202..a8964034677d 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/highlighting/HyperlinkAnnotator.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/highlighting/HyperlinkAnnotator.java @@ -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 getReferences(@NotNull PsiElement element) { - return CachedValuesManager.getCachedValue(element, () -> { - List references = PsiReferenceService.getService().getReferences(element, Hints.HIGHLIGHTED_REFERENCES); - return Result.create(unmodifiableOrEmptyList(references), PsiModificationTracker.MODIFICATION_COUNT); - }); + private static @NotNull List 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,