1
2
3
4
5 package com.qulice.checkstyle;
6
7 import com.puppycrawl.tools.checkstyle.api.AbstractCheck;
8 import com.puppycrawl.tools.checkstyle.api.DetailAST;
9 import com.puppycrawl.tools.checkstyle.api.TokenTypes;
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 public final class JavadocEmptyLineCheck extends AbstractCheck {
30
31 @Override
32 public int[] getDefaultTokens() {
33 return new int[] {
34 TokenTypes.PACKAGE_DEF,
35 TokenTypes.CLASS_DEF,
36 TokenTypes.INTERFACE_DEF,
37 TokenTypes.ANNOTATION_DEF,
38 TokenTypes.ANNOTATION_FIELD_DEF,
39 TokenTypes.ENUM_DEF,
40 TokenTypes.ENUM_CONSTANT_DEF,
41 TokenTypes.VARIABLE_DEF,
42 TokenTypes.CTOR_DEF,
43 TokenTypes.METHOD_DEF,
44 };
45 }
46
47 @Override
48 public int[] getAcceptableTokens() {
49 return this.getDefaultTokens();
50 }
51
52 @Override
53 public int[] getRequiredTokens() {
54 return this.getDefaultTokens();
55 }
56
57 @Override
58 public void visitToken(final DetailAST ast) {
59 final String[] lines = this.getLines();
60 final int current = ast.getLineNo();
61 final int start =
62 JavadocEmptyLineCheck.findCommentStart(lines, current) + 1;
63 if (JavadocEmptyLineCheck.isNodeHavingJavadoc(ast, start)) {
64 if (JavadocEmptyLineCheck.isJavadocLineEmpty(lines[start])) {
65 this.log(start + 1, "Empty Javadoc line at the beginning");
66 }
67 final int end =
68 JavadocEmptyLineCheck.findCommentEnd(lines, current) - 1;
69 if (JavadocEmptyLineCheck.isJavadocLineEmpty(lines[end])) {
70 this.log(end + 1, "Empty Javadoc line at the end");
71 }
72 }
73 }
74
75
76
77
78
79
80 private static boolean isJavadocLineEmpty(final String line) {
81 return "*".equals(line.trim());
82 }
83
84
85
86
87
88
89
90 private static boolean isNodeHavingJavadoc(final DetailAST node,
91 final int start) {
92 return start > getLineNoOfPreviousNode(node);
93 }
94
95
96
97
98
99
100 private static int getLineNoOfPreviousNode(final DetailAST node) {
101 int start = 0;
102 final DetailAST previous = node.getPreviousSibling();
103 if (previous != null) {
104 start = previous.getLineNo();
105 }
106 return start;
107 }
108
109
110
111
112
113
114
115 private static int findCommentStart(final String[] lines, final int start) {
116 return JavadocEmptyLineCheck.findTrimmedTextUp(lines, start, "/**");
117 }
118
119
120
121
122
123
124
125 private static int findCommentEnd(final String[] lines, final int start) {
126 return JavadocEmptyLineCheck.findTrimmedTextUp(lines, start, "*/");
127 }
128
129
130
131
132
133
134
135
136 private static int findTrimmedTextUp(final String[] lines,
137 final int start, final String text) {
138 int found = -1;
139 for (int pos = start - 1; pos >= 0; pos -= 1) {
140 if (lines[pos].trim().equals(text)) {
141 found = pos;
142 break;
143 }
144 }
145 return found;
146 }
147 }