1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package com.puppycrawl.tools.checkstyle.utils;
21
22 import com.puppycrawl.tools.checkstyle.api.DetailAST;
23 import com.puppycrawl.tools.checkstyle.api.TokenTypes;
24
25
26
27
28
29 public final class BlockCommentPosition {
30
31
32
33
34 private BlockCommentPosition() {
35 }
36
37
38
39
40
41
42 public static boolean isOnType(DetailAST blockComment) {
43 return isOnClass(blockComment)
44 || isOnInterface(blockComment)
45 || isOnEnum(blockComment)
46 || isOnAnnotationDef(blockComment);
47 }
48
49
50
51
52
53
54 public static boolean isOnClass(DetailAST blockComment) {
55 return isOnPlainToken(blockComment, TokenTypes.CLASS_DEF, TokenTypes.LITERAL_CLASS)
56 || isOnTokenWithModifiers(blockComment, TokenTypes.CLASS_DEF)
57 || isOnTokenWithAnnotation(blockComment, TokenTypes.CLASS_DEF);
58 }
59
60
61
62
63
64
65 public static boolean isOnPackage(DetailAST blockComment) {
66 final DetailAST nextSibling = blockComment.getNextSibling();
67 return isOnTokenWithAnnotation(blockComment, TokenTypes.PACKAGE_DEF)
68 || nextSibling != null && nextSibling.getType() == TokenTypes.PACKAGE_DEF;
69 }
70
71
72
73
74
75
76 public static boolean isOnInterface(DetailAST blockComment) {
77 return isOnPlainToken(blockComment, TokenTypes.INTERFACE_DEF, TokenTypes.LITERAL_INTERFACE)
78 || isOnTokenWithModifiers(blockComment, TokenTypes.INTERFACE_DEF)
79 || isOnTokenWithAnnotation(blockComment, TokenTypes.INTERFACE_DEF);
80 }
81
82
83
84
85
86
87 public static boolean isOnEnum(DetailAST blockComment) {
88 return isOnPlainToken(blockComment, TokenTypes.ENUM_DEF, TokenTypes.ENUM)
89 || isOnTokenWithModifiers(blockComment, TokenTypes.ENUM_DEF)
90 || isOnTokenWithAnnotation(blockComment, TokenTypes.ENUM_DEF);
91 }
92
93
94
95
96
97
98 public static boolean isOnAnnotationDef(DetailAST blockComment) {
99 return isOnPlainToken(blockComment, TokenTypes.ANNOTATION_DEF, TokenTypes.AT)
100 || isOnTokenWithModifiers(blockComment, TokenTypes.ANNOTATION_DEF)
101 || isOnTokenWithAnnotation(blockComment, TokenTypes.ANNOTATION_DEF);
102 }
103
104
105
106
107
108
109
110 public static boolean isOnMember(DetailAST blockComment) {
111 return isOnMethod(blockComment)
112 || isOnField(blockComment)
113 || isOnConstructor(blockComment)
114 || isOnEnumConstant(blockComment)
115 || isOnAnnotationField(blockComment);
116 }
117
118
119
120
121
122
123 public static boolean isOnMethod(DetailAST blockComment) {
124 return isOnPlainClassMember(blockComment, TokenTypes.METHOD_DEF)
125 || isOnTokenWithModifiers(blockComment, TokenTypes.METHOD_DEF)
126 || isOnTokenWithAnnotation(blockComment, TokenTypes.METHOD_DEF);
127 }
128
129
130
131
132
133
134 public static boolean isOnField(DetailAST blockComment) {
135 return isOnPlainClassMember(blockComment, TokenTypes.VARIABLE_DEF)
136 || isOnTokenWithModifiers(blockComment, TokenTypes.VARIABLE_DEF)
137 || isOnTokenWithAnnotation(blockComment, TokenTypes.VARIABLE_DEF);
138 }
139
140
141
142
143
144
145 public static boolean isOnConstructor(DetailAST blockComment) {
146 return isOnPlainToken(blockComment, TokenTypes.CTOR_DEF, TokenTypes.IDENT)
147 || isOnTokenWithModifiers(blockComment, TokenTypes.CTOR_DEF)
148 || isOnTokenWithAnnotation(blockComment, TokenTypes.CTOR_DEF);
149 }
150
151
152
153
154
155
156 public static boolean isOnEnumConstant(DetailAST blockComment) {
157 final boolean isOnPlainConst = blockComment.getParent() != null
158 && blockComment.getParent().getType() == TokenTypes.ENUM_CONSTANT_DEF
159 && getPrevSiblingSkipComments(blockComment).getType() == TokenTypes.ANNOTATIONS
160 && getPrevSiblingSkipComments(blockComment).getChildCount() == 0;
161 final boolean isOnConstWithAnnotation = !isOnPlainConst && blockComment.getParent() != null
162 && blockComment.getParent().getType() == TokenTypes.ANNOTATION
163 && blockComment.getParent().getParent().getParent().getType()
164 == TokenTypes.ENUM_CONSTANT_DEF;
165 return isOnPlainConst || isOnConstWithAnnotation;
166 }
167
168
169
170
171
172
173 public static boolean isOnAnnotationField(DetailAST blockComment) {
174 return isOnPlainClassMember(blockComment, TokenTypes.ANNOTATION_FIELD_DEF)
175 || isOnTokenWithModifiers(blockComment, TokenTypes.ANNOTATION_FIELD_DEF)
176 || isOnTokenWithAnnotation(blockComment, TokenTypes.ANNOTATION_FIELD_DEF);
177 }
178
179
180
181
182
183
184
185
186 private static boolean isOnPlainToken(DetailAST blockComment,
187 int parentTokenType, int nextTokenType) {
188 return blockComment.getParent() != null
189 && blockComment.getParent().getType() == parentTokenType
190 && getPrevSiblingSkipComments(blockComment).getChildCount() == 0
191 && getNextSiblingSkipComments(blockComment).getType() == nextTokenType;
192 }
193
194
195
196
197
198
199
200 private static boolean isOnTokenWithModifiers(DetailAST blockComment, int tokenType) {
201 return blockComment.getParent() != null
202 && blockComment.getParent().getType() == TokenTypes.MODIFIERS
203 && blockComment.getParent().getParent().getType() == tokenType
204 && getPrevSiblingSkipComments(blockComment) == null;
205 }
206
207
208
209
210
211
212
213 private static boolean isOnTokenWithAnnotation(DetailAST blockComment, int tokenType) {
214 return blockComment.getParent() != null
215 && blockComment.getParent().getType() == TokenTypes.ANNOTATION
216 && getPrevSiblingSkipComments(blockComment.getParent()) == null
217 && blockComment.getParent().getParent().getParent().getType() == tokenType
218 && getPrevSiblingSkipComments(blockComment) == null;
219 }
220
221
222
223
224
225
226
227 private static boolean isOnPlainClassMember(DetailAST blockComment, int memberType) {
228 DetailAST parent = blockComment.getParent();
229
230 while (parent != null && (parent.getType() == TokenTypes.DOT
231 || parent.getType() == TokenTypes.ARRAY_DECLARATOR)) {
232 parent = parent.getParent();
233 }
234 return parent != null
235 && (parent.getType() == TokenTypes.TYPE
236 || parent.getType() == TokenTypes.TYPE_PARAMETERS)
237 && parent.getParent().getType() == memberType
238
239 && parent.getPreviousSibling().getChildCount() == 0;
240 }
241
242
243
244
245
246
247 private static DetailAST getNextSiblingSkipComments(DetailAST node) {
248 DetailAST result = node.getNextSibling();
249 while (result.getType() == TokenTypes.SINGLE_LINE_COMMENT
250 || result.getType() == TokenTypes.BLOCK_COMMENT_BEGIN) {
251 result = result.getNextSibling();
252 }
253 return result;
254 }
255
256
257
258
259
260
261 private static DetailAST getPrevSiblingSkipComments(DetailAST node) {
262 DetailAST result = node.getPreviousSibling();
263 while (result != null
264 && (result.getType() == TokenTypes.SINGLE_LINE_COMMENT
265 || result.getType() == TokenTypes.BLOCK_COMMENT_BEGIN)) {
266 result = result.getPreviousSibling();
267 }
268 return result;
269 }
270
271 }