--- /dev/null
+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;
+ }
+}