]>
Commit | Line | Data |
---|---|---|
1b2798f6 EK |
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 | } |