]> git.uio.no Git - ifi-stolz-refaktor.git/blobdiff - case-study/refaktor-before/src/no/uio/ifi/refaktor/analyze/VariableBindingFinder.java
Case Study: adding data and statistics
[ifi-stolz-refaktor.git] / case-study / refaktor-before / src / no / uio / ifi / refaktor / analyze / VariableBindingFinder.java
diff --git a/case-study/refaktor-before/src/no/uio/ifi/refaktor/analyze/VariableBindingFinder.java b/case-study/refaktor-before/src/no/uio/ifi/refaktor/analyze/VariableBindingFinder.java
new file mode 100644 (file)
index 0000000..75506dd
--- /dev/null
@@ -0,0 +1,68 @@
+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;
+       }
+}