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.whitespace;
21
22 import java.util.Locale;
23
24 import com.puppycrawl.tools.checkstyle.StatelessCheck;
25 import com.puppycrawl.tools.checkstyle.api.AbstractCheck;
26 import com.puppycrawl.tools.checkstyle.api.DetailAST;
27 import com.puppycrawl.tools.checkstyle.api.TokenTypes;
28 import com.puppycrawl.tools.checkstyle.utils.CodePointUtil;
29 import com.puppycrawl.tools.checkstyle.utils.CommonUtil;
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 @StatelessCheck
48 public class MethodParamPadCheck
49 extends AbstractCheck {
50
51
52
53
54
55 public static final String MSG_LINE_PREVIOUS = "line.previous";
56
57
58
59
60
61 public static final String MSG_WS_PRECEDED = "ws.preceded";
62
63
64
65
66
67 public static final String MSG_WS_NOT_PRECEDED = "ws.notPreceded";
68
69
70
71
72 private boolean allowLineBreaks;
73
74
75 private PadOption option = PadOption.NOSPACE;
76
77 @Override
78 public int[] getDefaultTokens() {
79 return getAcceptableTokens();
80 }
81
82 @Override
83 public int[] getAcceptableTokens() {
84 return new int[] {
85 TokenTypes.CTOR_DEF,
86 TokenTypes.CTOR_CALL,
87 TokenTypes.LITERAL_NEW,
88 TokenTypes.METHOD_CALL,
89 TokenTypes.METHOD_DEF,
90 TokenTypes.SUPER_CTOR_CALL,
91 TokenTypes.ENUM_CONSTANT_DEF,
92 TokenTypes.RECORD_DEF,
93 TokenTypes.RECORD_PATTERN_DEF,
94 };
95 }
96
97 @Override
98 public int[] getRequiredTokens() {
99 return CommonUtil.EMPTY_INT_ARRAY;
100 }
101
102 @Override
103 public void visitToken(DetailAST ast) {
104 final DetailAST parenAST;
105 if (ast.getType() == TokenTypes.METHOD_CALL) {
106 parenAST = ast;
107 }
108 else {
109 parenAST = ast.findFirstToken(TokenTypes.LPAREN);
110
111 }
112
113 if (parenAST != null) {
114 final int[] line = getLineCodePoints(parenAST.getLineNo() - 1);
115 if (CodePointUtil.hasWhitespaceBefore(parenAST.getColumnNo(), line)) {
116 if (!allowLineBreaks) {
117 log(parenAST, MSG_LINE_PREVIOUS, parenAST.getText());
118 }
119 }
120 else {
121 final int before = parenAST.getColumnNo() - 1;
122 if (option == PadOption.NOSPACE
123 && CommonUtil.isCodePointWhitespace(line, before)) {
124 log(parenAST, MSG_WS_PRECEDED, parenAST.getText());
125 }
126 else if (option == PadOption.SPACE
127 && !CommonUtil.isCodePointWhitespace(line, before)) {
128 log(parenAST, MSG_WS_NOT_PRECEDED, parenAST.getText());
129 }
130 }
131 }
132 }
133
134
135
136
137
138
139
140
141 public void setAllowLineBreaks(boolean allowLineBreaks) {
142 this.allowLineBreaks = allowLineBreaks;
143 }
144
145
146
147
148
149
150
151
152 public void setOption(String optionStr) {
153 option = PadOption.valueOf(optionStr.trim().toUpperCase(Locale.ENGLISH));
154 }
155
156 }