From 98085efb87a3543b85926611601857bc15e6de64 Mon Sep 17 00:00:00 2001 From: Gesa HENTSCHKE Date: Wed, 5 Feb 2025 07:47:05 +0100 Subject: [PATCH] [#1207] cache IResource in EnablementTester Cache resource for URI because each call of LSPEclipseUtils.findResourceFor(URI) takes ~300 microseconds. And it gets called a lot of times. fixes #1207 --- .../lsp4e/enablement/EnablementTester.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/enablement/EnablementTester.java b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/enablement/EnablementTester.java index 3d8a939f5..b8519f2c4 100644 --- a/org.eclipse.lsp4e/src/org/eclipse/lsp4e/enablement/EnablementTester.java +++ b/org.eclipse.lsp4e/src/org/eclipse/lsp4e/enablement/EnablementTester.java @@ -13,6 +13,8 @@ package org.eclipse.lsp4e.enablement; import java.net.URI; +import java.util.HashMap; +import java.util.Map; import java.util.function.Supplier; import org.eclipse.core.expressions.EvaluationContext; @@ -40,6 +42,7 @@ public final class EnablementTester { private final Expression expression; private final String description; private final Supplier<@Nullable IEvaluationContext> parent; + private final Map cache = new HashMap<>(); public EnablementTester(Expression expression, String description) { this(() -> null, expression, description); @@ -69,7 +72,7 @@ public boolean evaluate(@Nullable URI uri) { IResource resource = null; try { IDocument document = null; - resource = LSPEclipseUtils.findResourceFor(uri); + resource = getResourceFor(uri); if (resource != null) { document = LSPEclipseUtils.getExistingDocument(resource); if (document == null) { @@ -104,4 +107,25 @@ public boolean evaluate(@Nullable URI uri) { return false; } + /** + * Cache resource for URI because each call to {@link LSPEclipseUtils#findResourceFor(URI)} takes ~300 microseconds. + * And the evaluate method gets called several thousand times in UI thread during editing a LS backed file. + * @param uri + * @return + */ + private @Nullable IResource getResourceFor(@Nullable URI uri) { + if (uri != null) { + var resource = cache.get(uri); + if (resource != null && resource.isAccessible()) { + return resource; + } + resource = LSPEclipseUtils.findResourceFor(uri); + if (resource != null) { + cache.put(uri, resource); + } + return resource; + } + return null; + } + }