1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package com.puppycrawl.tools.checkstyle.checks.blocks;
20
21 import com.puppycrawl.tools.checkstyle.api.DetailAST;
22 import com.puppycrawl.tools.checkstyle.api.TokenTypes;
23 import com.puppycrawl.tools.checkstyle.checks.AbstractOptionCheck;
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61 public class EmptyBlockCheck
62 extends AbstractOptionCheck<BlockOption>
63 {
64
65
66
67
68 public static final String MSG_KEY_BLOCK_NO_STMT = "block.noStmt";
69
70
71
72
73
74 public static final String MSG_KEY_BLOCK_EMPTY = "block.empty";
75
76
77
78
79 public EmptyBlockCheck()
80 {
81 super(BlockOption.STMT, BlockOption.class);
82 }
83
84 @Override
85 public int[] getDefaultTokens()
86 {
87 return new int[] {
88 TokenTypes.LITERAL_WHILE,
89 TokenTypes.LITERAL_TRY,
90 TokenTypes.LITERAL_CATCH,
91 TokenTypes.LITERAL_FINALLY,
92 TokenTypes.LITERAL_DO,
93 TokenTypes.LITERAL_IF,
94 TokenTypes.LITERAL_ELSE,
95 TokenTypes.LITERAL_FOR,
96 TokenTypes.INSTANCE_INIT,
97 TokenTypes.STATIC_INIT,
98 TokenTypes.LITERAL_SWITCH,
99
100 };
101 }
102
103 @Override
104 public void visitToken(DetailAST ast)
105 {
106 final DetailAST slistToken = ast.findFirstToken(TokenTypes.SLIST);
107 final DetailAST leftCurly = slistToken != null
108 ? slistToken : ast.findFirstToken(TokenTypes.LCURLY);
109 if (leftCurly != null) {
110 if (getAbstractOption() == BlockOption.STMT) {
111 boolean emptyBlock;
112 if (leftCurly.getType() == TokenTypes.LCURLY) {
113 emptyBlock = leftCurly.getNextSibling().getType() != TokenTypes.CASE_GROUP;
114 }
115 else {
116 emptyBlock = leftCurly.getChildCount() <= 1;
117 }
118 if (emptyBlock) {
119 log(leftCurly.getLineNo(),
120 leftCurly.getColumnNo(),
121 MSG_KEY_BLOCK_NO_STMT,
122 ast.getText());
123 }
124 }
125 else if (getAbstractOption() == BlockOption.TEXT
126 && !hasText(leftCurly))
127 {
128 log(leftCurly.getLineNo(),
129 leftCurly.getColumnNo(),
130 MSG_KEY_BLOCK_EMPTY,
131 ast.getText());
132 }
133 }
134 }
135
136
137
138
139
140 protected boolean hasText(final DetailAST slistAST)
141 {
142 boolean retVal = false;
143
144 final DetailAST rightCurly = slistAST.findFirstToken(TokenTypes.RCURLY);
145 final DetailAST rcurlyAST = rightCurly != null
146 ? rightCurly : slistAST.getParent().findFirstToken(TokenTypes.RCURLY);
147 if (rcurlyAST != null) {
148 final int slistLineNo = slistAST.getLineNo();
149 final int slistColNo = slistAST.getColumnNo();
150 final int rcurlyLineNo = rcurlyAST.getLineNo();
151 final int rcurlyColNo = rcurlyAST.getColumnNo();
152 final String[] lines = getLines();
153 if (slistLineNo == rcurlyLineNo) {
154
155 final String txt = lines[slistLineNo - 1]
156 .substring(slistColNo + 1, rcurlyColNo);
157 if (txt.trim().length() != 0) {
158 retVal = true;
159 }
160 }
161 else {
162
163 if ((lines[slistLineNo - 1]
164 .substring(slistColNo + 1).trim().length() != 0)
165 || (lines[rcurlyLineNo - 1]
166 .substring(0, rcurlyColNo).trim().length() != 0))
167 {
168 retVal = true;
169 }
170 else {
171
172 for (int i = slistLineNo; i < (rcurlyLineNo - 1); i++) {
173 if (lines[i].trim().length() > 0) {
174 retVal = true;
175 break;
176 }
177 }
178 }
179 }
180 }
181 return retVal;
182 }
183 }