Skip to content

Commit 75ef419

Browse files
committed
Issue #18064: add ArrayBracketNoWhitespace check
1 parent 83bcc0d commit 75ef419

24 files changed

Lines changed: 1358 additions & 3 deletions

File tree

config/checker-framework-suppressions/checker-nullness-optional-interning-suppressions.xml

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7291,6 +7291,28 @@
72917291
</details>
72927292
</checkerFrameworkError>
72937293

7294+
<checkerFrameworkError unstable="false">
7295+
<fileName>src/main/java/com/puppycrawl/tools/checkstyle/checks/whitespace/ArrayBracketNoWhitespaceCheck.java</fileName>
7296+
<specifier>argument</specifier>
7297+
<message>incompatible argument for parameter token of ArrayBracketNoWhitespaceCheck.precededByWhitespace.</message>
7298+
<lineContent>if (precededByWhitespace(rightBracket)) {</lineContent>
7299+
<details>
7300+
found : @Initialized @Nullable DetailAST
7301+
required: @Initialized @NonNull DetailAST
7302+
</details>
7303+
</checkerFrameworkError>
7304+
7305+
<checkerFrameworkError unstable="false">
7306+
<fileName>src/main/java/com/puppycrawl/tools/checkstyle/checks/whitespace/ArrayBracketNoWhitespaceCheck.java</fileName>
7307+
<specifier>return</specifier>
7308+
<message>incompatible types in return.</message>
7309+
<lineContent>return closest;</lineContent>
7310+
<details>
7311+
type of expression: @Initialized @Nullable DetailAST
7312+
method return type: @Initialized @NonNull DetailAST
7313+
</details>
7314+
</checkerFrameworkError>
7315+
72947316
<checkerFrameworkError unstable="false">
72957317
<fileName>src/main/java/com/puppycrawl/tools/checkstyle/checks/whitespace/EmptyLineSeparatorCheck.java</fileName>
72967318
<specifier>dereference.of.nullable</specifier>

config/checkstyle-checks.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -399,6 +399,7 @@
399399

400400
<!-- Coding -->
401401
<module name="ArrayTrailingComma"/>
402+
<module name="ArrayBracketNoWhitespace"/>
402403
<module name="AvoidDoubleBraceInitialization"/>
403404
<module name="AvoidInlineConditionals"/>
404405
<module name="AvoidNoArgumentSuperConstructorCall"/>

config/checkstyle-non-main-files-suppressions.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,8 @@
235235
files="src[\\/]site[\\/]xdoc[\\/]checks\.xml\.template"/>
236236

237237
<!-- no properties in module by design -->
238+
<suppress id="propertiesMacroMustExist"
239+
files="src[\\/]site[\\/]xdoc[\\/]checks[\\/]whitespace[\\/]arraybracketnowhitespace.xml.template"/>
238240
<suppress id="propertiesMacroMustExist"
239241
files="src[\\/]site[\\/]xdoc[\\/]checks[\\/]annotation[\\/]missingoverrideonrecordaccessor.xml.template"/>
240242
<suppress id="propertiesMacroMustExist"

config/checkstyle-resources-suppressions.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@
9999
<!-- intentional problem for testing -->
100100
<suppress id="noTrailingWhitespace"
101101
files="[\\/]InputJavadocContentLocationTrailingSpace\.java"/>
102+
<suppress id="noTrailingWhitespace"
103+
files="[\\/]InputArrayBracketNoWhitespaceDefault\.java"/>
102104
<suppress id="noTrailingWhitespace"
103105
files="[\\/]InputJavadocParagraphCorrect\.java"/>
104106
<suppress id="noTrailingWhitespace"

config/jsoref-spellchecker/whitelist.words

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ archunit
5555
Arial
5656
arity
5757
Arquillian
58+
arraybracketnowhitespace
5859
arraycopy
5960
arraytrailingcomma
6061
arraytypestyle

config/linkcheck-suppressions.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -599,6 +599,7 @@
599599
<a href="apidocs/com/puppycrawl/tools/checkstyle/checks/UniquePropertiesCheck.UniqueProperties.html#%3Cinit%3E()">#%3Cinit%3E()</a>: doesn't exist.
600600
<a href="apidocs/com/puppycrawl/tools/checkstyle/checks/UpperEllCheck.html#%3Cinit%3E()">#%3Cinit%3E()</a>: doesn't exist.
601601
<a href="apidocs/com/puppycrawl/tools/checkstyle/checks/whitespace/AbstractParenPadCheck.html#%3Cinit%3E()">#%3Cinit%3E()</a>: doesn't exist.
602+
<a href="apidocs/com/puppycrawl/tools/checkstyle/checks/whitespace/ArrayBracketNoWhitespaceCheck.html#%3Cinit%3E()">#%3Cinit%3E()</a>: doesn't exist.
602603
<a href="apidocs/com/puppycrawl/tools/checkstyle/checks/whitespace/EmptyForInitializerPadCheck.html#%3Cinit%3E()">#%3Cinit%3E()</a>: doesn't exist.
603604
<a href="apidocs/com/puppycrawl/tools/checkstyle/checks/whitespace/EmptyForIteratorPadCheck.html#%3Cinit%3E()">#%3Cinit%3E()</a>: doesn't exist.
604605
<a href="apidocs/com/puppycrawl/tools/checkstyle/checks/whitespace/EmptyLineSeparatorCheck.html#%3Cinit%3E()">#%3Cinit%3E()</a>: doesn't exist.
@@ -1233,6 +1234,7 @@
12331234
<a href="com/puppycrawl/tools/checkstyle/checks/UniquePropertiesCheck.UniqueProperties.html#%3Cinit%3E()">com/puppycrawl/tools/checkstyle/checks/UniquePropertiesCheck.UniqueProperties.html#%3Cinit%3E()</a>: doesn't exist.
12341235
<a href="com/puppycrawl/tools/checkstyle/checks/UpperEllCheck.html#%3Cinit%3E()">com/puppycrawl/tools/checkstyle/checks/UpperEllCheck.html#%3Cinit%3E()</a>: doesn't exist.
12351236
<a href="com/puppycrawl/tools/checkstyle/checks/whitespace/AbstractParenPadCheck.html#%3Cinit%3E()">com/puppycrawl/tools/checkstyle/checks/whitespace/AbstractParenPadCheck.html#%3Cinit%3E()</a>: doesn't exist.
1237+
<a href="com/puppycrawl/tools/checkstyle/checks/whitespace/ArrayBracketNoWhitespaceCheck.html#%3Cinit%3E()">com/puppycrawl/tools/checkstyle/checks/whitespace/ArrayBracketNoWhitespaceCheck.html#%3Cinit%3E()</a>: doesn't exist.
12361238
<a href="com/puppycrawl/tools/checkstyle/checks/whitespace/EmptyForInitializerPadCheck.html#%3Cinit%3E()">com/puppycrawl/tools/checkstyle/checks/whitespace/EmptyForInitializerPadCheck.html#%3Cinit%3E()</a>: doesn't exist.
12371239
<a href="com/puppycrawl/tools/checkstyle/checks/whitespace/EmptyForIteratorPadCheck.html#%3Cinit%3E()">com/puppycrawl/tools/checkstyle/checks/whitespace/EmptyForIteratorPadCheck.html#%3Cinit%3E()</a>: doesn't exist.
12381240
<a href="com/puppycrawl/tools/checkstyle/checks/whitespace/EmptyLineSeparatorCheck.html#%3Cinit%3E()">com/puppycrawl/tools/checkstyle/checks/whitespace/EmptyLineSeparatorCheck.html#%3Cinit%3E()</a>: doesn't exist.
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
///////////////////////////////////////////////////////////////////////////////////////////////
2+
// checkstyle: Checks Java source code and other text files for adherence to a set of rules.
3+
// Copyright (C) 2001-2026 the original author or authors.
4+
//
5+
// This library is free software; you can redistribute it and/or
6+
// modify it under the terms of the GNU Lesser General Public
7+
// License as published by the Free Software Foundation; either
8+
// version 2.1 of the License, or (at your option) any later version.
9+
//
10+
// This library is distributed in the hope that it will be useful,
11+
// but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13+
// Lesser General Public License for more details.
14+
//
15+
// You should have received a copy of the GNU Lesser General Public
16+
// License along with this library; if not, write to the Free Software
17+
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18+
///////////////////////////////////////////////////////////////////////////////////////////////
19+
20+
package org.checkstyle.suppressionxpathfilter.whitespace;
21+
22+
import java.io.File;
23+
import java.util.Collections;
24+
import java.util.List;
25+
26+
import org.checkstyle.suppressionxpathfilter.AbstractXpathTestSupport;
27+
import org.junit.jupiter.api.Test;
28+
29+
import com.puppycrawl.tools.checkstyle.DefaultConfiguration;
30+
import com.puppycrawl.tools.checkstyle.checks.whitespace.ArrayBracketNoWhitespaceCheck;
31+
32+
public class XpathRegressionArrayBracketNoWhitespaceTest extends AbstractXpathTestSupport {
33+
34+
private final String checkName = ArrayBracketNoWhitespaceCheck.class.getSimpleName();
35+
36+
@Override
37+
protected String getCheckName() {
38+
return checkName;
39+
}
40+
41+
@Override
42+
public String getPackageLocation() {
43+
return "org/checkstyle/suppressionxpathfilter/whitespace/arraybracketnowhitespace";
44+
}
45+
46+
@Test
47+
public void testArrayBracketNoWhitespacePreceded() throws Exception {
48+
final File fileToProcess =
49+
new File(getPath("InputXpathArrayBracketNoWhitespacePreceded.java"));
50+
51+
final DefaultConfiguration moduleConfig =
52+
createModuleConfig(ArrayBracketNoWhitespaceCheck.class);
53+
54+
final String[] expectedViolation = {
55+
"4:9: " + getCheckMessage(ArrayBracketNoWhitespaceCheck.class,
56+
ArrayBracketNoWhitespaceCheck.MSG_WS_PRECEDED, "["),
57+
};
58+
59+
final List<String> expectedXpathQueries = Collections.singletonList(
60+
"/COMPILATION_UNIT/CLASS_DEF[./IDENT["
61+
+ "@text='InputXpathArrayBracketNoWhitespacePreceded']]/OBJBLOCK"
62+
+ "/VARIABLE_DEF[./IDENT[@text='bad']]/TYPE/ARRAY_DECLARATOR"
63+
);
64+
65+
runVerifications(moduleConfig, fileToProcess, expectedViolation, expectedXpathQueries);
66+
}
67+
68+
@Test
69+
public void testArrayBracketNoWhitespaceFollowed() throws Exception {
70+
final File fileToProcess =
71+
new File(getPath("InputXpathArrayBracketNoWhitespaceFollowed.java"));
72+
73+
final DefaultConfiguration moduleConfig =
74+
createModuleConfig(ArrayBracketNoWhitespaceCheck.class);
75+
76+
final String[] expectedViolation = {
77+
"5:32: " + getCheckMessage(ArrayBracketNoWhitespaceCheck.class,
78+
ArrayBracketNoWhitespaceCheck.MSG_WS_FOLLOWED, "["),
79+
};
80+
81+
final List<String> expectedXpathQueries = Collections.singletonList(
82+
"/COMPILATION_UNIT/CLASS_DEF[./IDENT["
83+
+ "@text='InputXpathArrayBracketNoWhitespaceFollowed']]/OBJBLOCK"
84+
+ "/METHOD_DEF[./IDENT[@text='bad']]/SLIST/VARIABLE_DEF[./IDENT[@text='offsets']]"
85+
+ "/ASSIGN/EXPR/LITERAL_NEW/ARRAY_DECLARATOR"
86+
);
87+
88+
runVerifications(moduleConfig, fileToProcess, expectedViolation, expectedXpathQueries);
89+
}
90+
91+
@Test
92+
public void testArrayBracketNoWhitespaceNotFollowed() throws Exception {
93+
final File fileToProcess =
94+
new File(getPath("InputXpathArrayBracketNoWhitespaceNotFollowed.java"));
95+
96+
final DefaultConfiguration moduleConfig =
97+
createModuleConfig(ArrayBracketNoWhitespaceCheck.class);
98+
99+
final String[] expectedViolation = {
100+
"6:26: " + getCheckMessage(ArrayBracketNoWhitespaceCheck.class,
101+
ArrayBracketNoWhitespaceCheck.MSG_WS_NOT_FOLLOWED, "]"),
102+
};
103+
104+
final List<String> expectedXpathQueries = Collections.singletonList(
105+
"/COMPILATION_UNIT/CLASS_DEF[./IDENT["
106+
+ "@text='InputXpathArrayBracketNoWhitespaceNotFollowed']]/OBJBLOCK"
107+
+ "/METHOD_DEF[./IDENT[@text='bad']]/SLIST/VARIABLE_DEF[./IDENT[@text='total']]"
108+
+ "/ASSIGN/EXPR/PLUS[./NUM_INT[@text='5']]/INDEX_OP[./IDENT[@text='arr']]/RBRACK"
109+
);
110+
111+
runVerifications(moduleConfig, fileToProcess, expectedViolation, expectedXpathQueries);
112+
}
113+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package org.checkstyle.suppressionxpathfilter.whitespace.arraybracketnowhitespace;
2+
3+
public class InputXpathArrayBracketNoWhitespaceFollowed {
4+
void bad() {
5+
int[] offsets = new int[ 10]; //warn
6+
}
7+
void good() {
8+
int[] offsets = new int[10];
9+
}
10+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package org.checkstyle.suppressionxpathfilter.whitespace.arraybracketnowhitespace;
2+
3+
public class InputXpathArrayBracketNoWhitespaceNotFollowed {
4+
void bad() {
5+
int[] arr = {1, 2, 3};
6+
int total = arr[0]+ 5; //warn
7+
}
8+
void good() {
9+
int[] arr = {1, 2, 3};
10+
int total = arr[0] + 5;
11+
}
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package org.checkstyle.suppressionxpathfilter.whitespace.arraybracketnowhitespace;
2+
3+
public class InputXpathArrayBracketNoWhitespacePreceded {
4+
int [] bad; //warn
5+
int[] good;
6+
}

0 commit comments

Comments
 (0)