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 java.util.Optional;
23
24 import com.puppycrawl.tools.checkstyle.api.DetailAST;
25 import com.puppycrawl.tools.checkstyle.api.Scope;
26 import com.puppycrawl.tools.checkstyle.api.TokenTypes;
27
28
29
30
31
32 public final class ScopeUtil {
33
34
35 private ScopeUtil() {
36 }
37
38
39
40
41
42
43
44
45 public static Scope getDeclaredScopeFromMods(DetailAST aMods) {
46 Scope result = null;
47 for (DetailAST token = aMods.getFirstChild(); token != null;
48 token = token.getNextSibling()) {
49 switch (token.getType()) {
50 case TokenTypes.LITERAL_PUBLIC:
51 result = Scope.PUBLIC;
52 break;
53 case TokenTypes.LITERAL_PROTECTED:
54 result = Scope.PROTECTED;
55 break;
56 case TokenTypes.LITERAL_PRIVATE:
57 result = Scope.PRIVATE;
58 break;
59 default:
60 break;
61 }
62 }
63 return result;
64 }
65
66
67
68
69
70
71
72 public static Scope getScope(DetailAST ast) {
73 return Optional.ofNullable(ast.findFirstToken(TokenTypes.MODIFIERS))
74 .map(ScopeUtil::getDeclaredScopeFromMods)
75 .orElseGet(() -> getDefaultScope(ast));
76 }
77
78
79
80
81
82
83
84
85
86 public static Scope getScopeFromMods(DetailAST aMods) {
87 return Optional.ofNullable(getDeclaredScopeFromMods(aMods))
88 .orElseGet(() -> getDefaultScope(aMods));
89 }
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105 private static Scope getDefaultScope(DetailAST ast) {
106 final Scope result;
107 if (isInEnumBlock(ast)) {
108 if (ast.getType() == TokenTypes.ENUM_CONSTANT_DEF) {
109 result = Scope.PUBLIC;
110 }
111 else if (ast.getType() == TokenTypes.CTOR_DEF) {
112 result = Scope.PRIVATE;
113 }
114 else {
115 result = Scope.PACKAGE;
116 }
117 }
118 else if (isInInterfaceOrAnnotationBlock(ast)) {
119 result = Scope.PUBLIC;
120 }
121 else {
122 result = Scope.PACKAGE;
123 }
124 return result;
125 }
126
127
128
129
130
131
132
133 public static Scope getSurroundingScope(DetailAST node) {
134 Scope returnValue = null;
135 for (DetailAST token = node;
136 token != null;
137 token = token.getParent()) {
138 final int type = token.getType();
139 if (TokenUtil.isTypeDeclaration(type)) {
140 final Scope tokenScope = getScope(token);
141 if (returnValue == null || returnValue.isIn(tokenScope)) {
142 returnValue = tokenScope;
143 }
144 }
145 else if (type == TokenTypes.LITERAL_NEW) {
146 returnValue = Scope.ANONINNER;
147
148 break;
149 }
150 }
151
152 return returnValue;
153 }
154
155
156
157
158
159
160
161 public static boolean isInClassBlock(DetailAST node) {
162 return isInBlockOf(node, TokenTypes.CLASS_DEF);
163 }
164
165
166
167
168
169
170
171 public static boolean isInRecordBlock(DetailAST node) {
172 return isInBlockOf(node, TokenTypes.RECORD_DEF);
173 }
174
175
176
177
178
179
180
181 public static boolean isInInterfaceBlock(DetailAST node) {
182 return isInBlockOf(node, TokenTypes.INTERFACE_DEF);
183 }
184
185
186
187
188
189
190
191 public static boolean isInAnnotationBlock(DetailAST node) {
192 return isInBlockOf(node, TokenTypes.ANNOTATION_DEF);
193 }
194
195
196
197
198
199
200
201
202 public static boolean isInBlockOf(DetailAST node, int tokenType) {
203 boolean returnValue = false;
204
205
206 for (DetailAST token = node.getParent();
207 token != null; token = token.getParent()) {
208 if (TokenUtil.isOfType(token, TokenTypes.LITERAL_NEW, tokenType)
209 || TokenUtil.isTypeDeclaration(token.getType())) {
210 returnValue = token.getType() == tokenType;
211 break;
212 }
213 }
214 return returnValue;
215 }
216
217
218
219
220
221
222
223
224
225 public static boolean isInInterfaceOrAnnotationBlock(DetailAST node) {
226 return isInInterfaceBlock(node) || isInAnnotationBlock(node);
227 }
228
229
230
231
232
233
234
235 public static boolean isInEnumBlock(DetailAST node) {
236 boolean returnValue = false;
237
238
239 for (DetailAST token = node.getParent();
240 token != null; token = token.getParent()) {
241 if (TokenUtil.isOfType(token, TokenTypes.INTERFACE_DEF,
242 TokenTypes.ANNOTATION_DEF, TokenTypes.CLASS_DEF,
243 TokenTypes.LITERAL_NEW, TokenTypes.ENUM_DEF)) {
244 returnValue = token.getType() == TokenTypes.ENUM_DEF;
245 break;
246 }
247 }
248
249 return returnValue;
250 }
251
252
253
254
255
256
257
258
259 public static boolean isInCodeBlock(DetailAST node) {
260 boolean returnValue = false;
261 final int[] tokenTypes = {
262 TokenTypes.METHOD_DEF,
263 TokenTypes.CTOR_DEF,
264 TokenTypes.INSTANCE_INIT,
265 TokenTypes.STATIC_INIT,
266 TokenTypes.LAMBDA,
267 TokenTypes.COMPACT_CTOR_DEF,
268 };
269
270
271 for (DetailAST token = node.getParent();
272 token != null;
273 token = token.getParent()) {
274 if (TokenUtil.isOfType(token, tokenTypes)) {
275 returnValue = true;
276 break;
277 }
278 }
279
280 return returnValue;
281 }
282
283
284
285
286
287
288
289 public static boolean isOuterMostType(DetailAST node) {
290 boolean returnValue = true;
291 for (DetailAST parent = node.getParent();
292 parent != null;
293 parent = parent.getParent()) {
294 if (TokenUtil.isTypeDeclaration(parent.getType())) {
295 returnValue = false;
296 break;
297 }
298 }
299
300 return returnValue;
301 }
302
303
304
305
306
307
308
309
310
311 public static boolean isLocalVariableDef(DetailAST node) {
312 final boolean localVariableDef;
313
314 if (node.getType() == TokenTypes.VARIABLE_DEF) {
315 final DetailAST parent = node.getParent();
316 localVariableDef = TokenUtil.isOfType(parent, TokenTypes.SLIST,
317 TokenTypes.FOR_INIT, TokenTypes.FOR_EACH_CLAUSE);
318 }
319
320 else if (node.getType() == TokenTypes.RESOURCE) {
321 localVariableDef = node.getChildCount() > 1;
322 }
323
324
325 else if (node.getType() == TokenTypes.PARAMETER_DEF) {
326 final DetailAST parent = node.getParent();
327 localVariableDef = parent.getType() == TokenTypes.LITERAL_CATCH;
328 }
329
330 else {
331 localVariableDef = false;
332 }
333
334 return localVariableDef;
335 }
336
337
338
339
340
341
342
343
344
345 public static boolean isClassFieldDef(DetailAST node) {
346 return node.getType() == TokenTypes.VARIABLE_DEF
347 && !isLocalVariableDef(node);
348 }
349
350
351
352
353
354
355
356
357 public static boolean isInScope(DetailAST ast, Scope scope) {
358 final Scope surroundingScopeOfAstToken = getSurroundingScope(ast);
359 return surroundingScopeOfAstToken == scope;
360 }
361
362 }