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 import java.util.regex.Pattern;
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 public final class EmptyLineBeforeFirstMemberCheck extends AbstractCheck {
34
35
36
37
38 private static final Pattern BLANK = Pattern.compile("^\\s*$");
39
40
41
42
43 public EmptyLineBeforeFirstMemberCheck() {
44
45 }
46
47 @Override
48 public int[] getDefaultTokens() {
49 return new int[] {
50 TokenTypes.CLASS_DEF,
51 TokenTypes.INTERFACE_DEF,
52 TokenTypes.ENUM_DEF,
53 TokenTypes.ANNOTATION_DEF,
54 };
55 }
56
57 @Override
58 public int[] getAcceptableTokens() {
59 return this.getDefaultTokens();
60 }
61
62 @Override
63 public int[] getRequiredTokens() {
64 return this.getDefaultTokens();
65 }
66
67 @Override
68 public void visitToken(final DetailAST ast) {
69 final DetailAST block = ast.findFirstToken(TokenTypes.OBJBLOCK);
70 if (block != null) {
71 this.visitBlock(block);
72 }
73 }
74
75 private void visitBlock(final DetailAST block) {
76 final DetailAST left = block.findFirstToken(TokenTypes.LCURLY);
77 final DetailAST right = block.findFirstToken(TokenTypes.RCURLY);
78 if (left != null && right != null
79 && right.getLineNo() - left.getLineNo() >= 2
80 && !EmptyLineBeforeFirstMemberCheck.BLANK
81 .matcher(this.getLines()[left.getLineNo()]).find()) {
82 this.log(
83 left.getLineNo() + 1,
84 "Expected empty line before first member"
85 );
86 }
87 }
88 }