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.checks.indentation;
21
22 import com.puppycrawl.tools.checkstyle.api.DetailAST;
23 import com.puppycrawl.tools.checkstyle.api.TokenTypes;
24
25
26
27
28
29 public class ClassDefHandler extends BlockParentHandler {
30
31
32
33
34
35
36
37
38
39 public ClassDefHandler(IndentationCheck indentCheck,
40 DetailAST ast,
41 AbstractExpressionHandler parent) {
42 super(indentCheck, getHandlerName(ast), ast, parent);
43 }
44
45 @Override
46 protected DetailAST getLeftCurly() {
47 return getMainAst().findFirstToken(TokenTypes.OBJBLOCK)
48 .findFirstToken(TokenTypes.LCURLY);
49 }
50
51 @Override
52 protected DetailAST getRightCurly() {
53 return getMainAst().findFirstToken(TokenTypes.OBJBLOCK)
54 .findFirstToken(TokenTypes.RCURLY);
55 }
56
57 @Override
58 protected DetailAST getTopLevelAst() {
59 return null;
60
61 }
62
63 @Override
64 protected DetailAST getListChild() {
65 return getMainAst().findFirstToken(TokenTypes.OBJBLOCK);
66 }
67
68 @Override
69 public void checkIndentation() {
70 final DetailAST modifiers = getMainAst().findFirstToken(TokenTypes.MODIFIERS);
71 if (modifiers.hasChildren()) {
72 checkModifiers();
73 }
74 else {
75 if (getMainAst().getType() != TokenTypes.ANNOTATION_DEF) {
76 final DetailAST ident = getMainAst().findFirstToken(TokenTypes.IDENT);
77 DetailAST tokenToCheck = getMainAst();
78 if (ident.getLineNo() == getMainAst().getLineNo()) {
79 tokenToCheck = ident;
80 }
81 final int lineStart = getLineStart(tokenToCheck);
82 if (!getIndent().isAcceptable(lineStart)) {
83 logError(tokenToCheck, "ident", lineStart);
84 }
85 }
86 }
87 if (getMainAst().getType() == TokenTypes.ANNOTATION_DEF) {
88 final DetailAST atAst = getMainAst().findFirstToken(TokenTypes.AT);
89 if (isOnStartOfLine(atAst)) {
90 checkWrappingIndentation(getMainAst(), getListChild(), 0,
91 getIndent().getFirstIndentLevel(), false);
92 }
93 }
94 else {
95 checkWrappingIndentation(getMainAst(), getListChild());
96 }
97 super.checkIndentation();
98 }
99
100 @Override
101 protected int[] getCheckedChildren() {
102 return new int[] {
103 TokenTypes.EXPR,
104 TokenTypes.OBJBLOCK,
105 TokenTypes.LITERAL_BREAK,
106 TokenTypes.LITERAL_RETURN,
107 TokenTypes.LITERAL_THROW,
108 TokenTypes.LITERAL_CONTINUE,
109 };
110 }
111
112
113
114
115
116
117
118 private static String getHandlerName(DetailAST ast) {
119 final int tokenType = ast.getType();
120
121 return switch (tokenType) {
122 case TokenTypes.CLASS_DEF -> "class def";
123 case TokenTypes.ENUM_DEF -> "enum def";
124 case TokenTypes.ANNOTATION_DEF -> "annotation def";
125 case TokenTypes.RECORD_DEF -> "record def";
126 default -> "interface def";
127 };
128 }
129
130 }