📄 doclet.java
字号:
+ "</h4>");
writer.println(formatText(method.commentText()));
ParamTag[] paramTags = method.paramTags();
boolean space = false;
for (int j = 0; j < paramTags.length; j++) {
if (!space) {
writer.println("<br /><br />");
space = true;
}
String p = paramTags[j].parameterName() + " - " + paramTags[j].parameterComment();
if (j == 0) {
writer.println("<div class=\"itemTitle\">Parameters:</div>");
}
writer.println("<div class=\"item\">" + p + "</div>");
}
Tag[] returnTags = method.tags("return");
if (returnTags != null && returnTags.length > 0) {
if (!space) {
writer.println("<br /><br />");
space = true;
}
writer.println("<div class=\"itemTitle\">Returns:</div>");
writer.println("<div class=\"item\">" + returnTags[0].text() + "</div>");
}
ThrowsTag[] throwsTags = method.throwsTags();
if (throwsTags != null && throwsTags.length > 0) {
if (!space) {
writer.println("<br /><br />");
space = true;
}
writer.println("<div class=\"itemTitle\">Throws:</div>");
for (int j = 0; j < throwsTags.length; j++) {
String p = throwsTags[j].exceptionName();
String c = throwsTags[j].exceptionComment();
if (c.length() > 0) {
p += " - " + c;
}
writer.println("<div class=\"item\">" + p + "</div>");
}
}
writer.println("<hr />");
}
// field details
Arrays.sort(fields, new Comparator() {
public int compare(Object a, Object b) {
FieldDoc fa = (FieldDoc) a;
FieldDoc fb = (FieldDoc) b;
String ca = fa.constantValueExpression();
String cb = fb.constantValueExpression();
if (ca != null && cb != null) {
return ca.compareTo(cb);
}
return fa.name().compareTo(fb.name());
}
});
for (int i = 0; i < fields.length; i++) {
FieldDoc field = fields[i];
if (skipField(clazz, field)) {
continue;
}
String text = field.commentText();
if (text.startsWith("INTERNAL")) {
continue;
}
String name = field.name();
String constant = field.constantValueExpression();
String link = getFieldLink(text, constant, clazz, name);
writer.println("<a name=\"" + link + "\"></a>");
writer.println("<h4><span class=\"methodName\">" + name);
if (constant == null) {
writer.println();
} else {
writer.println(" = " + constant);
}
writer.println("</span></h4>");
if (text != null) {
writer.println("<div class=\"item\">" + formatText(text) + "</div>");
}
writer.println("<hr />");
}
writer.println("</div></td></tr></table></body></html>");
writer.close();
out.close();
}
private String getFieldLink(String text, String constant, ClassDoc clazz, String name) {
String link = constant != null ? constant : name.toLowerCase();
int linkStart = text.indexOf("<code>");
if (linkStart >= 0) {
int linkEnd = text.indexOf("</code>", linkStart);
link = text.substring(linkStart + "<code>".length(), linkEnd);
if (constant != null && !constant.equals(link)) {
System.out.println("Wrong code tag? " + clazz.name() + "." + name +
" code: " + link + " constant: " + constant);
errorCount++;
}
}
if (Character.isDigit(link.charAt(0))) {
link = "c" + link;
}
return link;
}
private static String formatText(String text) {
if (text == null) {
return text;
}
text = StringUtils.replaceAll(text, "\n </pre>", "</pre>");
return text;
}
private static boolean skipField(ClassDoc clazz, FieldDoc field) {
if (!field.isFinal() || !field.isStatic() || !field.isPublic() || field.containingClass() != clazz) {
return true;
}
return false;
}
private boolean skipMethod(MethodDoc method) {
ClassDoc clazz = method.containingClass();
boolean isInterface = clazz.isInterface() || (clazz.isAbstract() && method.isAbstract());
if (INTERFACES_ONLY && !isInterface) {
return true;
}
String name = method.name();
if (!method.isPublic() || name.equals("finalize")) {
return true;
}
if (method.getRawCommentText().trim().startsWith("@deprecated INTERNAL")) {
return true;
}
String firstSentence = getFirstSentence(method.firstSentenceTags());
String raw = method.getRawCommentText();
if (firstSentence != null && firstSentence.startsWith("INTERNAL")) {
return true;
}
if ((firstSentence == null || firstSentence.trim().length() == 0) && raw.indexOf("{@inheritDoc}") < 0) {
if (!doesOverride(method)) {
boolean setterOrGetter = name.startsWith("set") && method.parameters().length == 1;
setterOrGetter |= name.startsWith("get") && method.parameters().length == 0;
if (isInterface || !setterOrGetter) {
addError("Undocumented method " + " (" + clazz.name() + ".java:" + method.position().line() +") " + clazz + "." + name + " " + raw);
return true;
}
}
}
return false;
}
private void addError(String s) {
if (errors.add(s)) {
System.out.println(s);
errorCount++;
}
}
private boolean doesOverride(MethodDoc method) {
ClassDoc clazz = method.containingClass();
ClassDoc[] ifs = clazz.interfaces();
int pc = method.parameters().length;
String name = method.name();
for (int i = 0;; i++) {
ClassDoc c;
if (i < ifs.length) {
c = ifs[i];
} else {
clazz = clazz.superclass();
if (clazz == null) {
break;
}
c = clazz;
}
MethodDoc[] ms = c.methods();
for (int j = 0; j < ms.length; j++) {
MethodDoc m = ms[j];
if (m.name().equals(name) && m.parameters().length == pc) {
return true;
}
}
}
return false;
}
private static String getFirstSentence(Tag[] tags) {
String firstSentence = null;
if (tags.length > 0) {
Tag first = tags[0];
firstSentence = first.text();
}
return firstSentence;
}
private static String getTypeName(boolean isStatic, Type type) {
String s = type.typeName() + type.dimension();
if (isStatic) {
s = "static " + s;
}
return s;
}
private static boolean isDeprecated(MethodDoc method) {
Tag[] tags = method.tags();
boolean deprecated = false;
for (int j = 0; j < tags.length; j++) {
Tag t = tags[j];
if (t.kind().equals("@deprecated")) {
deprecated = true;
}
}
return deprecated;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -