Skip to content

Commit

Permalink
Pattern Wrappers must be cached to be reused
Browse files Browse the repository at this point in the history
Signed-off-by: Rob Stryker <stryker@redhat.com>
  • Loading branch information
Rob Stryker committed Feb 13, 2025
1 parent 197281f commit fbbdffc
Showing 1 changed file with 14 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
*******************************************************************************/
package org.eclipse.jdt.internal.core.search;

import java.util.HashMap;
import java.util.function.Function;

import org.eclipse.jdt.core.dom.ASTNode;
Expand Down Expand Up @@ -75,6 +76,7 @@ class PatternLocatorVisitor extends ASTVisitor {
private final PatternLocator patternLocator;
private final NodeSetWrapper nodeSet;
private MatchLocator locator;
private HashMap<PatternLocator, DOMPatternLocator> wrapperMap = new HashMap<>();

public PatternLocatorVisitor(PatternLocator patternLocator, NodeSetWrapper nodeSet, MatchLocator locator) {
super(true);
Expand All @@ -84,6 +86,15 @@ public PatternLocatorVisitor(PatternLocator patternLocator, NodeSetWrapper nodeS
}

private DOMPatternLocator getWrapper(PatternLocator locator) {
DOMPatternLocator l = wrapperMap.get(locator);
if(l == null ) {
l = createWrapper(locator);
wrapperMap.put(locator, l);
}
return l;
}

private DOMPatternLocator createWrapper(PatternLocator locator) {
// TODO implement all this.
if( locator instanceof FieldLocator fl) {
return new DOMFieldLocator(fl);
Expand Down Expand Up @@ -273,9 +284,10 @@ public boolean visit(QualifiedName node) {
if (node.getLocationInParent() == SimpleType.NAME_PROPERTY) {
return false; // type was already checked
}
int level = getWrapper(this.patternLocator).match(node, this.nodeSet, this.locator);
DOMPatternLocator wrapper = getWrapper(this.patternLocator);
int level = wrapper.match(node, this.nodeSet, this.locator);
if ((level & PatternLocator.MATCH_LEVEL_MASK) == PatternLocator.POSSIBLE_MATCH && (this.nodeSet.getWrapped().mustResolve || this.patternLocator.isMustResolve())) {
level = getWrapper(this.patternLocator).resolveLevel(node, node.resolveBinding(), this.locator);
level = wrapper.resolveLevel(node, node.resolveBinding(), this.locator);
}
this.nodeSet.addMatch(node, level);
if( (level & PatternLocator.MATCH_LEVEL_MASK) == PatternLocator.IMPOSSIBLE_MATCH ) {
Expand Down

0 comments on commit fbbdffc

Please sign in to comment.