package net.sourceforge.pmd.eclipse.ui.views.ast; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import net.sourceforge.pmd.util.StringUtil; public class CommentUtil { private static final String CR = "\n"; private CommentUtil() {} public static String wordAfter(String text, int position) { if (position >= text.length()) return null; int end = ++position; char ch = text.charAt(end); while (Character.isLetterOrDigit(ch) && end < text.length()) { ch = text.charAt(++end); } return text.substring(position, end); } public static Map<String, Integer> javadocTagsIn(String comment) { int atPos = comment.indexOf('@'); if (atPos < 0) return Collections.emptyMap(); Map<String, Integer> tags = new HashMap<String, Integer>(); while (atPos >= 0) { String tag = wordAfter(comment, atPos); tags.put(tag, atPos); atPos = comment.indexOf('@', atPos + tag.length()); } return tags; } public static List<String> multiLinesIn(String comment) { String[] lines = comment.split(CR); List<String> filteredLines = new ArrayList<String>(lines.length); for (String rawLine : lines) { String line = rawLine.trim(); if (line.startsWith("//")) { filteredLines.add(line.substring(2)); continue; } if (line.endsWith("*/")) { int end = line.length()-2; int start = line.startsWith("/**") ? 3 : line.startsWith("/*") ? 2 : 0; filteredLines.add(line.substring(start, end)); continue; } if (line.charAt(0) == '*') { filteredLines.add(line.substring(1)); continue; } if (line.startsWith("/**")) { filteredLines.add(line.substring(3)); continue; } if (line.startsWith("/*")) { filteredLines.add(line.substring(2)); continue; } filteredLines.add(line); } return filteredLines; } /** * Similar to the String.trim() function, this one removes the leading and * trailing empty/blank lines from the line list. * * @param lines */ public static List<String> trim(List<String> lines) { int firstNonEmpty = 0; for (; firstNonEmpty<lines.size(); firstNonEmpty++) { if (StringUtil.isNotEmpty(lines.get(firstNonEmpty))) break; } // all of them empty? if (firstNonEmpty == lines.size()) return Collections.emptyList(); int lastNonEmpty = lines.size() - 1; for (; lastNonEmpty>0; lastNonEmpty--) { if (StringUtil.isNotEmpty(lines.get(lastNonEmpty))) break; } List<String> filtered = new ArrayList<String>(); for (int i=firstNonEmpty; i<lastNonEmpty; i++) { filtered.add( lines.get(i) ); } return filtered; } public static void main(String[] args) { Collection<String> tags = javadocTagsIn(args[0]).keySet(); for (String tag : tags) { System.out.println( tag ); } } }