Skip to content

Commit a20f5bf

Browse files
committed
Issue #18064: add ArrayBracketNoWhitespace check
1 parent dd0b3d3 commit a20f5bf

25 files changed

Lines changed: 1339 additions & 3 deletions

File tree

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7287,6 +7287,17 @@
72877287
</details>
72887288
</checkerFrameworkError>
72897289

7290+
<checkerFrameworkError unstable="false">
7291+
<fileName>src/main/java/com/puppycrawl/tools/checkstyle/checks/whitespace/ArrayBracketNoWhitespaceCheck.java</fileName>
7292+
<specifier>argument</specifier>
7293+
<message>incompatible argument for parameter rightBracket of ArrayBracketNoWhitespaceCheck.processRightBracket.</message>
7294+
<lineContent>processRightBracket(rightBracket);</lineContent>
7295+
<details>
7296+
found : @Initialized @Nullable DetailAST
7297+
required: @Initialized @NonNull DetailAST
7298+
</details>
7299+
</checkerFrameworkError>
7300+
72907301
<checkerFrameworkError unstable="false">
72917302
<fileName>src/main/java/com/puppycrawl/tools/checkstyle/checks/whitespace/EmptyLineSeparatorCheck.java</fileName>
72927303
<specifier>dereference.of.nullable</specifier>

config/checkstyle-checks.xml

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

397397
<!-- Coding -->
398398
<module name="ArrayTrailingComma"/>
399+
<module name="ArrayBracketNoWhitespace"/>
399400
<module name="AvoidDoubleBraceInitialization"/>
400401
<module name="AvoidInlineConditionals"/>
401402
<module name="AvoidNoArgumentSuperConstructorCall"/>

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

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

232232
<!-- no properties in module by design -->
233+
<suppress id="propertiesMacroMustExist"
234+
files="src[\\/]site[\\/]xdoc[\\/]checks[\\/]whitespace[\\/]arraybracketnowhitespace.xml.template"/>
233235
<suppress id="propertiesMacroMustExist"
234236
files="src[\\/]site[\\/]xdoc[\\/]checks[\\/]annotation[\\/]missingoverrideonrecordaccessor.xml.template"/>
235237
<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
@@ -56,6 +56,7 @@ arget
5656
Arial
5757
arity
5858
Arquillian
59+
arraybracketnowhitespace
5960
arraycopy
6061
arraytrailingcomma
6162
arraytypestyle

config/linkcheck-suppressions.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,6 +593,7 @@
593593
<a href="apidocs/com/puppycrawl/tools/checkstyle/checks/UniquePropertiesCheck.UniqueProperties.html#%3Cinit%3E()">#%3Cinit%3E()</a>: doesn't exist.
594594
<a href="apidocs/com/puppycrawl/tools/checkstyle/checks/UpperEllCheck.html#%3Cinit%3E()">#%3Cinit%3E()</a>: doesn't exist.
595595
<a href="apidocs/com/puppycrawl/tools/checkstyle/checks/whitespace/AbstractParenPadCheck.html#%3Cinit%3E()">#%3Cinit%3E()</a>: doesn't exist.
596+
<a href="apidocs/com/puppycrawl/tools/checkstyle/checks/whitespace/ArrayBracketNoWhitespaceCheck.html#%3Cinit%3E()">#%3Cinit%3E()</a>: doesn't exist.
596597
<a href="apidocs/com/puppycrawl/tools/checkstyle/checks/whitespace/EmptyForInitializerPadCheck.html#%3Cinit%3E()">#%3Cinit%3E()</a>: doesn't exist.
597598
<a href="apidocs/com/puppycrawl/tools/checkstyle/checks/whitespace/EmptyForIteratorPadCheck.html#%3Cinit%3E()">#%3Cinit%3E()</a>: doesn't exist.
598599
<a href="apidocs/com/puppycrawl/tools/checkstyle/checks/whitespace/EmptyLineSeparatorCheck.html#%3Cinit%3E()">#%3Cinit%3E()</a>: doesn't exist.
@@ -1223,6 +1224,7 @@
12231224
<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.
12241225
<a href="com/puppycrawl/tools/checkstyle/checks/UpperEllCheck.html#%3Cinit%3E()">com/puppycrawl/tools/checkstyle/checks/UpperEllCheck.html#%3Cinit%3E()</a>: doesn't exist.
12251226
<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.
1227+
<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.
12261228
<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.
12271229
<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.
12281230
<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)