]> git.uio.no Git - ifi-stolz-refaktor.git/blob - software/no.uio.ifi.refaktor/src/no/uio/ifi/refaktor/analyze/VariableBindingFinder.java
ExtractAndMoveMethodAnalysisResult: renaming to ExtractAndMoveMethodCandidate
[ifi-stolz-refaktor.git] / software / no.uio.ifi.refaktor / src / no / uio / ifi / refaktor / analyze / VariableBindingFinder.java
1 package no.uio.ifi.refaktor.analyze;
2
3 import java.util.regex.Matcher;
4 import java.util.regex.Pattern;
5
6 import org.eclipse.jdt.core.dom.ASTNode;
7 import org.eclipse.jdt.core.dom.ASTVisitor;
8 import org.eclipse.jdt.core.dom.IBinding;
9 import org.eclipse.jdt.core.dom.IVariableBinding;
10 import org.eclipse.jdt.core.dom.SimpleName;
11
12 public class VariableBindingFinder extends ASTVisitor {
13         private final String bindingKey;
14         private final Pattern pattern;
15         private final String keyGroupOne;
16         private final String keyGroupTwo;
17         private boolean bindingFound;
18         private IVariableBinding variableBinding;
19
20         public VariableBindingFinder(String bindingKey) {
21                 this.bindingKey = bindingKey;
22                 bindingFound = false;
23                 pattern = Pattern.compile("^([^$]+)\\$\\d+[$;](.+)$");
24
25                 Matcher bindingKeyMatcher = pattern.matcher(bindingKey);
26
27                 if (bindingKeyMatcher.matches()) {
28                         keyGroupOne = bindingKeyMatcher.group(1);
29                         keyGroupTwo = bindingKeyMatcher.group(2);
30                 } else {
31                         keyGroupOne = "";
32                         keyGroupTwo = "";
33                 }
34         }
35
36         @Override
37         public boolean visit(SimpleName node) {
38                 IBinding binding = node.resolveBinding();
39
40                 if (!(binding instanceof IVariableBinding))
41                         return false;
42
43                 if (perfectMatch(binding) || bindingPartiallyMatchesOriginalKey(binding)) {
44                         variableBinding = (IVariableBinding) binding;
45                         bindingFound = true;
46                 }
47
48                 return false;
49         }
50
51         private boolean perfectMatch(IBinding binding) {
52                 return binding.getKey().equals(bindingKey);
53         }
54
55         private boolean bindingPartiallyMatchesOriginalKey(IBinding binding) {
56                 Matcher matcher = pattern.matcher(binding.getKey());
57                 return matcher.matches() && keyGroupOne.equals(matcher.group(1)) && keyGroupTwo.equals(matcher.group(2));
58         }
59
60         @Override
61         public boolean preVisit2(ASTNode node) {
62                 return !bindingFound;
63         }
64
65         public IVariableBinding getVariableBinding() {
66                 return variableBinding;
67         }
68 }