Skip to content

Commit b9dcc06

Browse files
SONARJAVA-5982 Do not raise S106 on compact source files (#5413)
1 parent 7809702 commit b9dcc06

4 files changed

Lines changed: 62 additions & 4 deletions

File tree

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
void main() {
2+
String name = IO.readln("Enter your name: ");
3+
IO.println("Hello " + name + "!");
4+
System.out.println("Goodbye " + name + "!");
5+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
void main() {
2+
String name = IO.readln("Enter your name: ");
3+
IO.println("Hello " + name + "!");
4+
System.out.println("Goodbye " + name + "!");
5+
6+
System.out.println(f(6, 7));
7+
8+
RegularClass rc = new RegularClass();
9+
rc.log("This is a log message.");
10+
}
11+
12+
int f(int x, int y) {
13+
System.err.println("Error: x=" + x + ", y=" + y);
14+
return x + y;
15+
}
16+
17+
class RegularClass {
18+
void log(String message) {
19+
System.out.println(message);
20+
}
21+
}

java-checks/src/main/java/org/sonar/java/checks/SystemOutOrErrUsageCheck.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,20 +29,36 @@
2929
@Rule(key = "S106")
3030
public class SystemOutOrErrUsageCheck extends IssuableSubscriptionVisitor {
3131

32+
private boolean isCompactSourceFile = false;
33+
3234
@Override
3335
public List<Tree.Kind> nodesToVisit() {
34-
return Collections.singletonList(Tree.Kind.MEMBER_SELECT);
36+
return List.of(
37+
Tree.Kind.COMPILATION_UNIT,
38+
Tree.Kind.IMPLICIT_CLASS,
39+
Tree.Kind.MEMBER_SELECT
40+
);
3541
}
3642

3743
@Override
3844
public void visitNode(Tree tree) {
39-
MemberSelectExpressionTree mset = (MemberSelectExpressionTree) tree;
45+
if (tree.is(Tree.Kind.COMPILATION_UNIT)) {
46+
isCompactSourceFile = false;
47+
} else if (tree.is(Tree.Kind.IMPLICIT_CLASS)) {
48+
// System.out or System.err is allowed in compact source files.
49+
isCompactSourceFile = true;
50+
} else if (!isCompactSourceFile && tree instanceof MemberSelectExpressionTree mset) {
51+
visitMemberSelectExpression(mset);
52+
}
53+
}
54+
55+
private void visitMemberSelectExpression(MemberSelectExpressionTree mset) {
4056
String name = mset.identifier().name();
4157

4258
if ("out".equals(name) && isSystem(mset.expression())) {
43-
reportIssue(tree, "Replace this use of System.out by a logger.");
59+
reportIssue(mset, "Replace this use of System.out by a logger.");
4460
} else if ("err".equals(name) && isSystem(mset.expression())) {
45-
reportIssue(tree, "Replace this use of System.err by a logger.");
61+
reportIssue(mset, "Replace this use of System.err by a logger.");
4662
}
4763
}
4864

java-checks/src/test/java/org/sonar/java/checks/SystemOutOrErrUsageCheckTest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,20 @@ void test() {
2929
.withCheck(new SystemOutOrErrUsageCheck())
3030
.verifyIssues();
3131
}
32+
33+
@Test
34+
void test_compact_source_file() {
35+
CheckVerifier.newVerifier()
36+
.onFile(mainCodeSourcesPath("checks/SystemOutOrErrUsageCheckCompactOnlyMainSample.java"))
37+
.withCheck(new SystemOutOrErrUsageCheck())
38+
.verifyNoIssues();
39+
}
40+
41+
@Test
42+
void test_compact_source_file_with_regular_class() {
43+
CheckVerifier.newVerifier()
44+
.onFile(mainCodeSourcesPath("checks/SystemOutOrErrUsageCheckCompactWithClassSample.java"))
45+
.withCheck(new SystemOutOrErrUsageCheck())
46+
.verifyNoIssues();
47+
}
3248
}

0 commit comments

Comments
 (0)