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.coding;
21
22 import com.puppycrawl.tools.checkstyle.StatelessCheck;
23 import com.puppycrawl.tools.checkstyle.api.AbstractCheck;
24 import com.puppycrawl.tools.checkstyle.api.DetailAST;
25 import com.puppycrawl.tools.checkstyle.api.TokenTypes;
26 import com.puppycrawl.tools.checkstyle.utils.CheckUtil;
27 import com.puppycrawl.tools.checkstyle.utils.TokenUtil;
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 @StatelessCheck
45 public class MultipleVariableDeclarationsCheck extends AbstractCheck {
46
47
48
49
50
51 public static final String MSG_MULTIPLE = "multiple.variable.declarations";
52
53
54
55
56
57 public static final String MSG_MULTIPLE_COMMA = "multiple.variable.declarations.comma";
58
59 @Override
60 public int[] getAcceptableTokens() {
61 return getRequiredTokens();
62 }
63
64 @Override
65 public int[] getDefaultTokens() {
66 return getRequiredTokens();
67 }
68
69 @Override
70 public int[] getRequiredTokens() {
71 return new int[] {TokenTypes.VARIABLE_DEF};
72 }
73
74 @Override
75 public void visitToken(DetailAST ast) {
76 DetailAST nextNode = ast.getNextSibling();
77
78 if (nextNode != null) {
79 final boolean isCommaSeparated = nextNode.getType() == TokenTypes.COMMA;
80
81 if (isCommaSeparated
82 || nextNode.getType() == TokenTypes.SEMI) {
83 nextNode = nextNode.getNextSibling();
84 }
85
86 if (nextNode != null
87 && nextNode.getType() == TokenTypes.VARIABLE_DEF) {
88 final DetailAST firstNode = CheckUtil.getFirstNode(ast);
89 if (isCommaSeparated) {
90
91
92
93
94
95
96 if (ast.getParent().getType() != TokenTypes.FOR_INIT) {
97 log(firstNode, MSG_MULTIPLE_COMMA);
98 }
99 }
100 else {
101 final DetailAST lastNode = getLastNode(ast);
102 final DetailAST firstNextNode = CheckUtil.getFirstNode(nextNode);
103
104 if (TokenUtil.areOnSameLine(firstNextNode, lastNode)) {
105 log(firstNode, MSG_MULTIPLE);
106 }
107 }
108 }
109 }
110 }
111
112
113
114
115
116
117
118 private static DetailAST getLastNode(final DetailAST node) {
119 DetailAST currentNode = node;
120 final DetailAST child = node.getLastChild();
121 if (child != null) {
122 currentNode = getLastNode(child);
123 }
124
125 return currentNode;
126 }
127
128 }