package no.uio.ifi.refaktor.analyze; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.ASTVisitor; import org.eclipse.jdt.core.dom.IBinding; import org.eclipse.jdt.core.dom.IVariableBinding; import org.eclipse.jdt.core.dom.SimpleName; public class VariableBindingFinder extends ASTVisitor { private final String bindingKey; private final Pattern pattern; private final String keyGroupOne; private final String keyGroupTwo; private boolean bindingFound; private IVariableBinding variableBinding; public VariableBindingFinder(String bindingKey) { this.bindingKey = bindingKey; bindingFound = false; pattern = Pattern.compile("^([^$]+)\\$\\d+[$;](.+)$"); Matcher bindingKeyMatcher = pattern.matcher(bindingKey); if (bindingKeyMatcher.matches()) { keyGroupOne = bindingKeyMatcher.group(1); keyGroupTwo = bindingKeyMatcher.group(2); } else { keyGroupOne = ""; keyGroupTwo = ""; } } @Override public boolean visit(SimpleName node) { IBinding binding = node.resolveBinding(); if (!(binding instanceof IVariableBinding)) return false; if (perfectMatch(binding) || bindingPartiallyMatchesOriginalKey(binding)) { variableBinding = (IVariableBinding) binding; bindingFound = true; } return false; } private boolean perfectMatch(IBinding binding) { return binding.getKey().equals(bindingKey); } private boolean bindingPartiallyMatchesOriginalKey(IBinding binding) { Matcher matcher = pattern.matcher(binding.getKey()); return matcher.matches() && keyGroupOne.equals(matcher.group(1)) && keyGroupTwo.equals(matcher.group(2)); } @Override public boolean preVisit2(ASTNode node) { return !bindingFound; } public IVariableBinding getVariableBinding() { return variableBinding; } }