1 package net.sourceforge.pmd.lang.java.ast;
2
3 import java.util.ArrayList;
4 import java.util.Collection;
5 import java.util.Collections;
6 import java.util.HashMap;
7 import java.util.List;
8 import java.util.Map;
9 import java.util.regex.Matcher;
10 import java.util.regex.Pattern;
11
12 import net.sourceforge.pmd.util.StringUtil;
13
14 public final class CommentUtil {
15
16 private CommentUtil() {}
17
18 private static final String CR = "\n";
19
20 public static String wordAfter(String text, int position) {
21
22 if (position >= text.length()) return null;
23
24 int end = ++position;
25 char ch = text.charAt(end);
26
27 while (Character.isLetterOrDigit(ch) && end < text.length()) {
28 ch = text.charAt(++end);
29 }
30
31 return text.substring(position, end);
32 }
33
34 public static String javadocContentAfter(String text, int position) {
35
36 int endPos = text.indexOf('\n', position);
37 if (endPos < 0) return null;
38
39 if (StringUtil.isNotEmpty(text.substring(position, endPos))) {
40 return text.substring(position, endPos).trim();
41 }
42
43 if (text.indexOf('@', endPos) >= 0) return null;
44
45
46 int nextEndPos = text.indexOf('\n', endPos + 1);
47
48 if (StringUtil.isNotEmpty(text.substring(endPos, nextEndPos))) {
49 return text.substring(endPos, nextEndPos).trim();
50 }
51
52 return null;
53 }
54
55 private static Pattern JAVADOC_TAG = Pattern.compile("@[A-Za-z0-9]+");
56 private static Map<String, String> JAVADOC_CACHE = new HashMap<String, String>();
57
58 public static Map<String, Integer> javadocTagsIn(String comment) {
59 Matcher m = JAVADOC_TAG.matcher(comment);
60 Map<String, Integer> tags = null;
61 while (m.find()) {
62 if (tags == null ) { tags = new HashMap<String, Integer>(); }
63 String match = comment.substring(m.start() + 1, m.end());
64 String tag = JAVADOC_CACHE.get(match);
65 if (tag == null) {
66 JAVADOC_CACHE.put(match, match);
67 }
68 tags.put(tag, m.start());
69 }
70 if ( tags == null ) {
71 return Collections.emptyMap();
72 }
73 return tags;
74 }
75
76 public static List<String> multiLinesIn(String comment) {
77
78 String[] lines = comment.split(CR);
79 List<String> filteredLines = new ArrayList<String>(lines.length);
80
81 for (String rawLine : lines) {
82 String line = rawLine.trim();
83
84 if (line.startsWith("//")) {
85 filteredLines.add(line.substring(2));
86 continue;
87 }
88
89 if (line.endsWith("*/")) {
90 int end = line.length()-2;
91 int start = line.startsWith("/**") ? 3 : line.startsWith("/*") ? 2 : 0;
92 filteredLines.add(line.substring(start, end));
93 continue;
94 }
95
96 if (line.charAt(0) == '*') {
97 filteredLines.add(line.substring(1));
98 continue;
99 }
100
101 if (line.startsWith("/**")) {
102 filteredLines.add(line.substring(3));
103 continue;
104 }
105
106 if (line.startsWith("/*")) {
107 filteredLines.add(line.substring(2));
108 continue;
109 }
110
111 filteredLines.add(line);
112 }
113
114 return filteredLines;
115 }
116
117
118
119
120
121
122
123 public static List<String> trim(List<String> lines) {
124
125 int firstNonEmpty = 0;
126 for (; firstNonEmpty<lines.size(); firstNonEmpty++) {
127 if (StringUtil.isNotEmpty(lines.get(firstNonEmpty))) break;
128 }
129
130
131 if (firstNonEmpty == lines.size()) return Collections.emptyList();
132
133 int lastNonEmpty = lines.size() - 1;
134 for (; lastNonEmpty>0; lastNonEmpty--) {
135 if (StringUtil.isNotEmpty(lines.get(lastNonEmpty))) break;
136 }
137
138 List<String> filtered = new ArrayList<String>();
139 for (int i=firstNonEmpty; i<lastNonEmpty; i++) {
140 filtered.add( lines.get(i) );
141 }
142
143 return filtered;
144 }
145
146 public static void main(String[] args) {
147
148 Collection<String> tags = javadocTagsIn(args[0]).keySet();
149
150 for (String tag : tags) {
151 System.out.println( tag );
152 }
153 }
154 }