Skip to content

Commit 0582034

Browse files
committed
Issue #17756: Fix GenericWhitespaceCheck to reject tabs after '>'
1 parent f34fa83 commit 0582034

File tree

3 files changed

+141
-2
lines changed

3 files changed

+141
-2
lines changed

src/main/java/com/puppycrawl/tools/checkstyle/checks/whitespace/GenericWhitespaceCheck.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,9 +208,16 @@ private void processSingleGeneric(DetailAST ast, int[] line, int after) {
208208
log(ast, MSG_WS_FOLLOWED, CLOSE_ANGLE_BRACKET);
209209
}
210210
}
211-
else if (!isCharacterValidAfterGenericEnd(charAfter)) {
211+
else if (after + 1 < line.length && charAfter == ' '
212+
&& line[after + 1] == ' ') {
212213
log(ast, MSG_WS_ILLEGAL_FOLLOW, CLOSE_ANGLE_BRACKET);
213214
}
215+
else {
216+
if (!isCharacterValidAfterGenericEnd(charAfter)) {
217+
log(ast, MSG_WS_ILLEGAL_FOLLOW, CLOSE_ANGLE_BRACKET);
218+
}
219+
}
220+
214221
}
215222

216223
/**
@@ -373,7 +380,7 @@ private static boolean isCharacterValidAfterGenericEnd(char charAfter) {
373380
return charAfter == ')' || charAfter == ','
374381
|| charAfter == '[' || charAfter == '.'
375382
|| charAfter == ':' || charAfter == ';'
376-
|| Character.isWhitespace(charAfter);
383+
|| charAfter == ' ';
377384
}
378385

379386
}

src/test/java/com/puppycrawl/tools/checkstyle/checks/whitespace/GenericWhitespaceCheckTest.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,4 +330,18 @@ public void testWrongTokenType() {
330330
}
331331
}
332332

333+
@Test
334+
public void testTabAndMissingSpace() throws Exception {
335+
final String[] expected = {
336+
"14:16: " + getCheckMessage(MSG_WS_ILLEGAL_FOLLOW, '>'),
337+
"16:16: " + getCheckMessage(MSG_WS_ILLEGAL_FOLLOW, '>'),
338+
"19:16: " + getCheckMessage(MSG_WS_ILLEGAL_FOLLOW, '>'),
339+
"22:29: " + getCheckMessage(MSG_WS_ILLEGAL_FOLLOW, '>'),
340+
"29:42: " + getCheckMessage(MSG_WS_ILLEGAL_FOLLOW, '>'),
341+
};
342+
verifyWithInlineConfigParser(
343+
getPath("InputGenericWhitespace.java"),
344+
expected);
345+
}
346+
333347
}
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
/*
2+
GenericWhitespace
3+
4+
5+
*/
6+
7+
package com.puppycrawl.tools.checkstyle.checks.whitespace.genericwhitespace;
8+
9+
import java.util.*;
10+
import java.util.concurrent.ConcurrentMap;
11+
12+
public class InputGenericWhitespace {
13+
14+
List<String>items; // violation ''>' is followed by an illegal character.'
15+
16+
List<String> withTab; // violation ''>' is followed by an illegal character.'
17+
18+
// violation below ''>' is followed by an illegal character.'
19+
List<String> attributes = new ArrayList<String>();
20+
21+
// violation below ''>' is followed by an illegal character.'
22+
Hashtable<String, Object> ret = new Hashtable<>();
23+
24+
final Map<String, String>
25+
comeMapWithLongName = new HashMap
26+
<String, String>();
27+
28+
// violation below ''>' is followed by an illegal character.'
29+
public void fieldMappers(List<List<?>> fieldMappers) {
30+
for (List<?> mapper : fieldMappers) {
31+
System.out.println(mapper);
32+
}
33+
}
34+
35+
static class InputIndentationFromGuava<K, V> extends AbstractMap<K, V>
36+
implements ConcurrentMap<K, V> {
37+
38+
@Override
39+
public Set<java.util.Map.Entry<K, V>> entrySet() {
40+
return null;
41+
}
42+
43+
@Override
44+
public V putIfAbsent(K key, V value) {
45+
return null;
46+
}
47+
48+
@Override
49+
public boolean remove(Object key, Object value) {
50+
return false;
51+
}
52+
53+
@Override
54+
public boolean replace(K key, V oldValue, V newValue) {
55+
return false;
56+
}
57+
58+
@Override
59+
public V replace(K key, V value) {
60+
return null;
61+
}
62+
63+
static class ValueReference<T1, T2> {
64+
65+
}
66+
67+
static class ReferenceEntry<T1, T2> {
68+
69+
}
70+
71+
static class Segment<T1, T2> {
72+
73+
protected Object valueReferenceQueue;
74+
75+
}
76+
77+
static class StrongAccessEntry<T1, T2> {
78+
79+
public StrongAccessEntry(T1 key, int hash, ReferenceEntry<T1, T2> next) {
80+
81+
}
82+
83+
}
84+
85+
static class StrongValueReference<T1, T2> {
86+
87+
public StrongValueReference(int value) {
88+
89+
}
90+
91+
}
92+
93+
static class WeightedStrongValueReference<T1, T2> {
94+
95+
public WeightedStrongValueReference(int value, int weight) {
96+
}
97+
98+
}
99+
100+
static class SoftValueReference<T1, T2> {
101+
102+
public SoftValueReference(Object valueReferenceQueue, int value,
103+
ReferenceEntry<Integer, Integer> entry) {
104+
}
105+
106+
}
107+
108+
static class WeightedSoftValueReference<T1, T2> {
109+
}
110+
111+
static class WeakValueReference<T1, T2> {
112+
}
113+
114+
static class WeightedWeakValueReference<T1, T2> {
115+
}
116+
117+
}
118+
}

0 commit comments

Comments
 (0)