]>
Commit | Line | Data |
---|---|---|
5d575eef EK |
1 | package no.uio.ifi.refaktor.utils; |
2 | ||
3 | import java.util.LinkedList; | |
4 | import java.util.List; | |
5 | import java.util.regex.Matcher; | |
6 | import java.util.regex.Pattern; | |
7 | ||
3b76defa EK |
8 | import org.eclipse.jdt.core.Signature; |
9 | ||
5d575eef EK |
10 | public class MethodSignature { |
11 | ||
12 | private static final String SIMPLE_NAME = "[a-zA-Z_$][\\w$]*"; | |
5d575eef EK |
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(); | |
36f3d69f EK |
26 | // Java 7: |
27 | // Pattern pattern = Pattern.compile("^.*?\\s+(?<name>\\w+)\\((?<parameters>.*?)\\).*"); | |
28 | Pattern pattern = Pattern.compile("^.*?\\s+(\\w+)\\((.*?)\\).*"); | |
5d575eef EK |
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) { | |
36f3d69f EK |
37 | // Java 7: |
38 | // setName(matcher.group("name")); | |
39 | setName(matcher.group(1)); | |
5d575eef EK |
40 | } |
41 | ||
42 | private void setParameters(Matcher matcher) { | |
36f3d69f EK |
43 | // Java 7: |
44 | // String parametersGroup = matcher.group("parameters"); | |
45 | String parametersGroup = matcher.group(2); | |
5d575eef EK |
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) { | |
36f3d69f EK |
77 | // Java 7: |
78 | // Pattern pattern = Pattern.compile("^(?:final\\s+)?(?<type>.+)\\b" + SIMPLE_NAME + "$"); | |
79 | Pattern pattern = Pattern.compile("^(?:final\\s+)?(.+)\\b" + SIMPLE_NAME + "$"); | |
3b76defa | 80 | Matcher matcher = pattern.matcher(parameter); |
5d575eef | 81 | if (matcher.matches()) { |
36f3d69f EK |
82 | // Java 7: |
83 | // String typeGroup = matcher.group("type"); | |
84 | String typeGroup = matcher.group(1); | |
5d575eef EK |
85 | if (!isEmpty(typeGroup)) { |
86 | typeGroup = typeGroup.trim(); | |
3b76defa | 87 | addParameterSignature(Signature.createTypeSignature(typeGroup, false)); |
5d575eef EK |
88 | } |
89 | } | |
90 | } | |
91 | ||
5d575eef EK |
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 | ||
048f5b32 EK |
112 | public String[] getParameterSignaturesArray() { |
113 | return getParameterSignatures().toArray(new String[]{}); | |
114 | } | |
115 | ||
5d575eef | 116 | } |