]> git.uio.no Git - ifi-stolz-refaktor.git/blame - case-study/refaktor-after/src/no/uio/ifi/refaktor/utils/MethodSignature.java
Case Study: adding data and statistics
[ifi-stolz-refaktor.git] / case-study / refaktor-after / src / no / uio / ifi / refaktor / utils / MethodSignature.java
CommitLineData
1b2798f6
EK
1package no.uio.ifi.refaktor.utils;
2
3import java.util.LinkedList;
4import java.util.List;
5import java.util.regex.Matcher;
6import java.util.regex.Pattern;
7
8import org.eclipse.jdt.core.Signature;
9
10public class MethodSignature {
11
12 private static final String SIMPLE_NAME = "[a-zA-Z_$][\\w$]*";
13 private String name = "";
14 private final List<String> parameterSignatures = new LinkedList<String>();
15
16 public MethodSignature(String source) {
17 parse(source);
18 }
19
20 public static MethodSignature parseSignature(String source) {
21 return new MethodSignature(source);
22 }
23
24 private void parse(String source) {
25 String rawSignature = source.trim();
26// Java 7:
27// Pattern pattern = Pattern.compile("^.*?\\s+(?<name>\\w+)\\((?<parameters>.*?)\\).*");
28 Pattern pattern = Pattern.compile("^.*?\\s+(\\w+)\\((.*?)\\).*");
29 Matcher matcher = pattern.matcher(rawSignature);
30 if (matcher.matches()) {
31 setMethodName(matcher);
32 setParameters(matcher);
33 }
34 }
35
36 private void setMethodName(Matcher matcher) {
37// Java 7:
38// setName(matcher.group("name"));
39 setName(matcher.group(1));
40 }
41
42 private void setParameters(Matcher matcher) {
43// Java 7:
44// String parametersGroup = matcher.group("parameters");
45 String parametersGroup = matcher.group(2);
46 if (parametersGroup != null) {
47 for (String parameter: parseParameters(parametersGroup)) {
48 if (!parameter.isEmpty()) {
49 setParameterSignature(parameter);
50 }
51 }
52 }
53 }
54
55 private List<String> parseParameters(String parametersGroup) {
56 List<String> parameters = new LinkedList<String>();
57 int angleBracketCount = 0;
58 String parameter = "";
59 for (int i = 0; i < parametersGroup.length(); i++) {
60 char ch = parametersGroup.charAt(i);
61 if (ch == ',' && angleBracketCount == 0) {
62 parameters.add(parameter.trim());
63 parameter = "";
64 } else {
65 parameter += ch;
66 if (ch == '<')
67 angleBracketCount++;
68 if (ch == '>')
69 angleBracketCount--;
70 }
71 }
72 parameters.add(parameter.trim());
73 return parameters;
74 }
75
76 private void setParameterSignature(String parameter) {
77// Java 7:
78// Pattern pattern = Pattern.compile("^(?:final\\s+)?(?<type>.+)\\b" + SIMPLE_NAME + "$");
79 Pattern pattern = Pattern.compile("^(?:final\\s+)?(.+)\\b" + SIMPLE_NAME + "$");
80 Matcher matcher = pattern.matcher(parameter);
81 if (matcher.matches()) {
82// Java 7:
83// String typeGroup = matcher.group("type");
84 String typeGroup = matcher.group(1);
85 if (!isEmpty(typeGroup)) {
86 typeGroup = typeGroup.trim();
87 addParameterSignature(Signature.createTypeSignature(typeGroup, false));
88 }
89 }
90 }
91
92 private boolean isEmpty(String group) {
93 return group == null || group.isEmpty();
94 }
95
96 private void setName(String group) {
97 name = group == null ? "" : group;
98 }
99
100 private void addParameterSignature(String parameterSignature) {
101 parameterSignatures.add(parameterSignature);
102 }
103
104 public String getName() {
105 return name;
106 }
107
108 public List<String> getParameterSignatures() {
109 return parameterSignatures;
110 }
111
112 public String[] getParameterSignaturesArray() {
113 return getParameterSignatures().toArray(new String[]{});
114 }
115
116}