From ec77a1958bd0713765355bc4223914229dfbf4e3 Mon Sep 17 00:00:00 2001 From: Nicola Isotta Date: Mon, 13 Apr 2026 08:35:16 +0200 Subject: [PATCH] Improve perf of EL module by caching ResolverContext in ELParserResult --- .../modules/web/el/CompilationContext.java | 19 ++++++++++++------- .../modules/web/el/ELOccurrencesFinder.java | 2 +- .../modules/web/el/ELParserResult.java | 10 ++++++++++ .../completion/ELCodeCompletionHandler.java | 7 ++++++- .../modules/web/el/hints/ELHintsProvider.java | 10 ++++++++-- .../el/navigation/ELDeclarationFinder.java | 11 ++++++++++- 6 files changed, 47 insertions(+), 12 deletions(-) diff --git a/enterprise/web.el/src/org/netbeans/modules/web/el/CompilationContext.java b/enterprise/web.el/src/org/netbeans/modules/web/el/CompilationContext.java index c1db899e6990..31c1ebd6dc68 100644 --- a/enterprise/web.el/src/org/netbeans/modules/web/el/CompilationContext.java +++ b/enterprise/web.el/src/org/netbeans/modules/web/el/CompilationContext.java @@ -27,19 +27,24 @@ * @author marekfukala */ public class CompilationContext { - + private final FileObject file; private final CompilationInfo info; - private final ResolverContext context = new ResolverContext(); + private final ResolverContext context; private CompilationCache cache; - private CompilationContext(FileObject file, CompilationInfo info) { + private CompilationContext(FileObject file, CompilationInfo info, ResolverContext context) { this.file = file; this.info = info; + this.context = context != null ? context : new ResolverContext(); } - + public static CompilationContext create(FileObject file, CompilationInfo info) { - return new CompilationContext(file, info); + return create(file, info, new ResolverContext()); + } + + public static CompilationContext create(FileObject file, CompilationInfo info, ResolverContext context) { + return new CompilationContext(file, info, context); } public FileObject file() { @@ -53,12 +58,12 @@ public CompilationInfo info() { public ResolverContext context() { return context; } - + public synchronized CompilationCache cache() { if(cache == null) { cache = new CompilationCache(); } return cache; } - + } diff --git a/enterprise/web.el/src/org/netbeans/modules/web/el/ELOccurrencesFinder.java b/enterprise/web.el/src/org/netbeans/modules/web/el/ELOccurrencesFinder.java index ea0c1fc892ea..93efb8aa0269 100644 --- a/enterprise/web.el/src/org/netbeans/modules/web/el/ELOccurrencesFinder.java +++ b/enterprise/web.el/src/org/netbeans/modules/web/el/ELOccurrencesFinder.java @@ -133,7 +133,7 @@ private void computeOccurrences(final ELParserResult parserResult) { try { jsource.runUserActionTask((CompilationController info) -> { info.toPhase(JavaSource.Phase.RESOLVED); - CompilationContext ccontext = CompilationContext.create(file, info); + CompilationContext ccontext = CompilationContext.create(file, info, parserResult.getContext()); occurrences.putAll(findMatchingTypes(ccontext, target, matching)); if (this.occurrences.isEmpty()) { // perhaps the caret is on a resource bundle key node diff --git a/enterprise/web.el/src/org/netbeans/modules/web/el/ELParserResult.java b/enterprise/web.el/src/org/netbeans/modules/web/el/ELParserResult.java index 55fb253b6578..7db1afef66f8 100644 --- a/enterprise/web.el/src/org/netbeans/modules/web/el/ELParserResult.java +++ b/enterprise/web.el/src/org/netbeans/modules/web/el/ELParserResult.java @@ -20,15 +20,19 @@ package org.netbeans.modules.web.el; import com.sun.el.parser.Node; + import java.util.ArrayList; import java.util.Collections; import java.util.List; + import javax.el.ELException; + import org.netbeans.modules.csl.api.Error; import org.netbeans.modules.csl.api.OffsetRange; import org.netbeans.modules.csl.api.Severity; import org.netbeans.modules.csl.spi.ParserResult; import org.netbeans.modules.parsing.api.Snapshot; +import org.netbeans.modules.web.el.spi.ResolverContext; import org.openide.filesystems.FileObject; /** @@ -42,6 +46,8 @@ public final class ELParserResult extends ParserResult { private final FileObject file; + private final ResolverContext context = new ResolverContext(); + public ELParserResult(Snapshot snapshot) { super(snapshot); this.file = snapshot.getSource().getFileObject(); @@ -132,6 +138,10 @@ public List getDiagnostics() { return result; } + public ResolverContext getContext() { + return context; + } + private static class ELError implements Error.Badging { private final ELElement errorElement; diff --git a/enterprise/web.el/src/org/netbeans/modules/web/el/completion/ELCodeCompletionHandler.java b/enterprise/web.el/src/org/netbeans/modules/web/el/completion/ELCodeCompletionHandler.java index cc9b3f3b50bb..de6311413fd9 100644 --- a/enterprise/web.el/src/org/netbeans/modules/web/el/completion/ELCodeCompletionHandler.java +++ b/enterprise/web.el/src/org/netbeans/modules/web/el/completion/ELCodeCompletionHandler.java @@ -151,7 +151,12 @@ public CodeCompletionResult complete(final CodeCompletionContext context) { @Override public void run(CompilationController info) throws Exception { info.toPhase(JavaSource.Phase.RESOLVED); - CompilationContext ccontext = CompilationContext.create(file, info); + CompilationContext ccontext; + if (context.getParserResult() instanceof ELParserResult elParserResult) { + ccontext = CompilationContext.create(file, info, elParserResult.getContext()); + } else { + ccontext = CompilationContext.create(file, info); + } // assignments to resolve Node node = nodeToResolve instanceof AstIdentifier && assignments.containsKey((AstIdentifier) nodeToResolve) ? diff --git a/enterprise/web.el/src/org/netbeans/modules/web/el/hints/ELHintsProvider.java b/enterprise/web.el/src/org/netbeans/modules/web/el/hints/ELHintsProvider.java index 2dc03d287c55..fd9995831c3f 100644 --- a/enterprise/web.el/src/org/netbeans/modules/web/el/hints/ELHintsProvider.java +++ b/enterprise/web.el/src/org/netbeans/modules/web/el/hints/ELHintsProvider.java @@ -22,7 +22,7 @@ import java.io.IOException; import java.util.List; import java.util.Map; -import org.netbeans.api.java.source.ClasspathInfo; + import org.netbeans.api.java.source.CompilationController; import org.netbeans.api.java.source.JavaSource; import org.netbeans.api.java.source.Task; @@ -33,6 +33,7 @@ import org.netbeans.modules.csl.api.Rule.AstRule; import org.netbeans.modules.csl.api.RuleContext; import org.netbeans.modules.web.el.CompilationContext; +import org.netbeans.modules.web.el.ELParserResult; import org.netbeans.modules.web.el.ELTypeUtilities; import org.openide.filesystems.FileObject; import org.openide.util.Exceptions; @@ -64,7 +65,12 @@ public void computeHints(final HintsManager manager, final RuleContext context, @Override public void run(CompilationController info) throws Exception { info.toPhase(JavaSource.Phase.RESOLVED); - CompilationContext ccontext = CompilationContext.create(file, info); + CompilationContext ccontext; + if (context.parserResult instanceof ELParserResult elParserResult) { + ccontext = CompilationContext.create(file, info, elParserResult.getContext()); + } else { + ccontext = CompilationContext.create(file, info); + } for (ELRule rule : ids) { if (manager.isEnabled(rule)) { rule.run(ccontext, context, hints); diff --git a/enterprise/web.el/src/org/netbeans/modules/web/el/navigation/ELDeclarationFinder.java b/enterprise/web.el/src/org/netbeans/modules/web/el/navigation/ELDeclarationFinder.java index 2060155fe2d8..ecc6c611fa1f 100644 --- a/enterprise/web.el/src/org/netbeans/modules/web/el/navigation/ELDeclarationFinder.java +++ b/enterprise/web.el/src/org/netbeans/modules/web/el/navigation/ELDeclarationFinder.java @@ -23,6 +23,7 @@ import com.sun.source.tree.Tree; import com.sun.source.util.SourcePositions; import com.sun.source.util.Trees; + import java.io.IOException; import java.util.ArrayList; import java.util.Collections; @@ -31,8 +32,10 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; + import javax.lang.model.element.Element; import javax.swing.text.Document; + import org.netbeans.api.java.source.ClasspathInfo; import org.netbeans.api.java.source.CompilationController; import org.netbeans.api.java.source.ElementHandle; @@ -51,6 +54,7 @@ import org.netbeans.modules.web.el.AstPath; import org.netbeans.modules.web.el.CompilationContext; import org.netbeans.modules.web.el.ELElement; +import org.netbeans.modules.web.el.ELParserResult; import org.netbeans.modules.web.el.ELTypeUtilities; import org.netbeans.modules.web.el.ResourceBundles; import org.netbeans.modules.web.el.completion.ELResourceBundleKeyCompletionItem; @@ -83,7 +87,12 @@ public DeclarationLocation findDeclaration(final ParserResult info, int offset) @Override public void run(CompilationController cc) throws Exception { cc.toPhase(JavaSource.Phase.RESOLVED); - CompilationContext context = CompilationContext.create(file, cc); + CompilationContext context; + if (info instanceof ELParserResult elParserResult) { + context = CompilationContext.create(file, cc, elParserResult.getContext()); + } else { + context = CompilationContext.create(file, cc); + } // resolve beans Element javaElement = ELTypeUtilities.resolveElement(context, nodeElem.second(), nodeElem.first());