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.ArrayList;
11 import java.util.List;
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 public final class CurlyBracketsStructureCheck extends AbstractCheck {
38
39
40
41
42 public CurlyBracketsStructureCheck() {
43
44 }
45
46 @Override
47 public int[] getDefaultTokens() {
48 return new int[] {
49 TokenTypes.ARRAY_INIT,
50 };
51 }
52
53 @Override
54 public int[] getAcceptableTokens() {
55 return this.getDefaultTokens();
56 }
57
58 @Override
59 public int[] getRequiredTokens() {
60 return this.getDefaultTokens();
61 }
62
63 @Override
64 public void visitToken(final DetailAST ast) {
65 if (ast.getType() == TokenTypes.ARRAY_INIT) {
66 this.checkParams(ast);
67 }
68 }
69
70 private void checkParams(final DetailAST node) {
71 final DetailAST closing = node.findFirstToken(TokenTypes.RCURLY);
72 if (closing != null) {
73 this.checkLines(node, node.getLineNo(), closing.getLineNo());
74 }
75 }
76
77 private void checkLines(final DetailAST node, final int start,
78 final int end) {
79 if (start != end) {
80 this.checkExpressions(
81 CurlyBracketsStructureCheck.findAllChildren(
82 node,
83 TokenTypes.EXPR
84 ),
85 start,
86 end
87 );
88 }
89 }
90
91 private void checkExpressions(final Iterable<DetailAST> exprs,
92 final int start,
93 final int end
94 ) {
95 for (final DetailAST expr : exprs) {
96 final int pline = expr.getLineNo();
97 if (pline == start) {
98 this.log(pline, "Parameters should start on a new line");
99 }
100 final DetailAST last = expr.getLastChild();
101 final int lline = last.getLineNo();
102 if (lline == end) {
103 this.log(lline, "Closing bracket should be on a new line");
104 }
105 }
106 }
107
108 private static Iterable<DetailAST> findAllChildren(final DetailAST base,
109 final int type) {
110 final List<DetailAST> children = new ArrayList<>(base.getChildCount());
111 DetailAST child = base.getFirstChild();
112 while (child != null) {
113 if (child.getType() == type) {
114 children.add(child);
115 }
116 child = child.getNextSibling();
117 }
118 return children;
119 }
120 }