Skip to content

Commit 9d50cb6

Browse files
SONARJAVA-5537 S7476: remove FPs and reduce noise (#5158)
1 parent c01d9ba commit 9d50cb6

6 files changed

Lines changed: 88 additions & 28 deletions

File tree

its/autoscan/src/test/resources/autoscan/diffs/diff_S7476.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33
"hasTruePositives": true,
44
"falseNegatives": 0,
55
"falsePositives": 0
6-
}
6+
}

its/ruling/src/test/resources/guava/java-S7476.json

Lines changed: 0 additions & 9 deletions
This file was deleted.

java-checks-test-sources/default/src/main/java/checks/CommentsMustStartWithCorrectNumberOfSlashesCheckAfterJava23.java renamed to java-checks-test-sources/default/src/main/java/checks/CommentsMustStartWithCorrectNumberOfSlashesCheckJava23.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1+
///////////////////////////////////////////////////////////////////////////////////////////////
2+
//
3+
// this a license header, we don't raise on it as it will not generate javadoc
4+
//
5+
///////////////////////////////////////////////////////////////////////////////////////////////
16
package checks;
27

3-
public class CommentsMustStartWithCorrectNumberOfSlashesCheckAfterJava23 {
8+
public class CommentsMustStartWithCorrectNumberOfSlashesCheckJava23 {
49
// This is a comment
510
public void twoSlashes() {}
611
/// javadoc using markdown
@@ -44,9 +49,9 @@ public void javadoc(String input){
4449
// Noncompliant@+3
4550
// Noncompliant@+4
4651
/// This is a javadoc
47-
//// invalid
48-
///
4952
//// invalid
53+
///
54+
///// invalid
5055
//^^^^
5156
public void markdownJavadoc() {
5257
}

java-checks-test-sources/default/src/main/java/checks/CommentsMustStartWithCorrectNumberOfSlashesCheckBeforeJava23.java renamed to java-checks-test-sources/default/src/main/java/checks/CommentsMustStartWithCorrectNumberOfSlashesCheckSample.java

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,18 @@
1+
///////////////////////////////////////////////////////////////////////////////////////////////
2+
//
3+
// this a license header, we don't raise on it as it will not generate javadoc
4+
//
5+
///////////////////////////////////////////////////////////////////////////////////////////////
16
package checks;
27

3-
public class CommentsMustStartWithCorrectNumberOfSlashesCheckBeforeJava23 {
8+
9+
// Noncompliant@+1
10+
/// don't use three slashes
11+
import java.util.List;
12+
13+
// Noncompliant@+1
14+
/// This is a comment, but will be javadoc in java 23
15+
public class CommentsMustStartWithCorrectNumberOfSlashesCheckSample {
416

517
// This is a comment
618
public void twoSlashes() {}
@@ -13,6 +25,11 @@ public void threeSlashes() {}
1325
//^^^
1426
public void fourSlashes() {}
1527

28+
public void insideMethod() {
29+
// Noncompliant@+1
30+
///This is a comment
31+
}
32+
1633

1734
// //
1835
public void twoTimeTwoSlashes() {}

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

Lines changed: 44 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,43 @@
1717
package org.sonar.java.checks;
1818

1919
import java.util.List;
20+
import java.util.Optional;
2021
import org.sonar.check.Rule;
2122
import org.sonar.java.model.DefaultModuleScannerContext;
2223
import org.sonar.java.reporting.AnalyzerMessage;
2324
import org.sonar.plugins.java.api.IssuableSubscriptionVisitor;
25+
import org.sonar.plugins.java.api.JavaFileScannerContext;
26+
import org.sonar.plugins.java.api.JavaVersion;
27+
import org.sonar.plugins.java.api.JavaVersionAwareVisitor;
28+
import org.sonar.plugins.java.api.location.Position;
29+
import org.sonar.plugins.java.api.location.Range;
30+
import org.sonar.plugins.java.api.tree.SyntaxToken;
2431
import org.sonar.plugins.java.api.tree.SyntaxTrivia;
2532
import org.sonar.plugins.java.api.tree.Tree;
2633

2734
@Rule(key = "S7476")
28-
public class CommentsMustStartWithCorrectNumberOfSlashesCheck extends IssuableSubscriptionVisitor {
35+
public class CommentsMustStartWithCorrectNumberOfSlashesCheck extends IssuableSubscriptionVisitor implements JavaVersionAwareVisitor {
2936
private static final String BEFORE_JAVA_23 = "A single-line comment should start with exactly two slashes, no more.";
30-
private static final String AFTER_JAVA_23 = "Markdown documentation should start with exactly three slashes, no more.";
37+
private static final String JAVA_23 = "Markdown documentation should start with exactly three slashes, no more.";
3138
private static final String INCORRECT_SLASHES_BEFORE_JAVA_23 = "///";
32-
private static final String INCORRECT_SLASHES_AFTER_JAVA_23 = "////";
39+
private static final String INCORRECT_SLASHES_JAVA_23 = "////";
40+
private static final Position FILE_START = Position.at(Position.FIRST_LINE, Position.FIRST_COLUMN);
41+
private Position compilationUnitFirstTokenPosition = FILE_START;
42+
43+
@Override
44+
public void setContext(JavaFileScannerContext context) {
45+
super.setContext(context);
46+
compilationUnitFirstTokenPosition = Optional.ofNullable(context.getTree())
47+
.map(Tree::firstToken)
48+
.map(SyntaxToken::range)
49+
.map(Range::start).orElse(FILE_START);
50+
}
51+
52+
@Override
53+
public void leaveFile(JavaFileScannerContext context) {
54+
compilationUnitFirstTokenPosition = FILE_START;
55+
super.leaveFile(context);
56+
}
3357

3458
@Override
3559
public List<Tree.Kind> nodesToVisit() {
@@ -38,6 +62,9 @@ public List<Tree.Kind> nodesToVisit() {
3862

3963
@Override
4064
public void visitTrivia(SyntaxTrivia syntaxTrivia) {
65+
if (isHeader(syntaxTrivia)) {
66+
return;
67+
}
4168
if (syntaxTrivia.isComment(SyntaxTrivia.CommentKind.LINE) && syntaxTrivia.comment().startsWith(INCORRECT_SLASHES_BEFORE_JAVA_23)) {
4269
var span = LineSpan.fromComment(syntaxTrivia, 0, 0, INCORRECT_SLASHES_BEFORE_JAVA_23.length());
4370
reportIssue(span, BEFORE_JAVA_23);
@@ -48,17 +75,26 @@ public void visitTrivia(SyntaxTrivia syntaxTrivia) {
4875
for (int idx = 0; idx < lines.length; idx++) {
4976
String line = lines[idx];
5077

51-
if (line.trim().startsWith(INCORRECT_SLASHES_AFTER_JAVA_23)) {
52-
int startPos = line.indexOf(INCORRECT_SLASHES_AFTER_JAVA_23);
53-
var span = LineSpan.fromComment(syntaxTrivia, idx, startPos, startPos + INCORRECT_SLASHES_AFTER_JAVA_23.length());
54-
reportIssue(span, AFTER_JAVA_23);
78+
if (line.trim().startsWith(INCORRECT_SLASHES_JAVA_23)) {
79+
int startPos = line.indexOf(INCORRECT_SLASHES_JAVA_23);
80+
var span = LineSpan.fromComment(syntaxTrivia, idx, startPos, startPos + INCORRECT_SLASHES_JAVA_23.length());
81+
reportIssue(span, JAVA_23);
5582
}
5683
}
5784
}
5885
}
5986

87+
@Override
88+
public boolean isCompatibleWithJavaVersion(JavaVersion version) {
89+
return version.isJava17Compatible();
90+
}
91+
92+
private boolean isHeader(SyntaxTrivia syntaxTrivia) {
93+
return syntaxTrivia.range().start().isBefore(compilationUnitFirstTokenPosition);
94+
}
95+
6096
private void reportIssue(LineSpan span, String message) {
61-
((DefaultModuleScannerContext) this.context).reportIssue(issueSingleLine(span,message));
97+
((DefaultModuleScannerContext) this.context).reportIssue(issueSingleLine(span, message));
6298
}
6399

64100
private AnalyzerMessage issueSingleLine(LineSpan span, String message) {

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

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,27 +18,38 @@
1818

1919
import org.junit.jupiter.api.Test;
2020
import org.sonar.java.checks.verifier.CheckVerifier;
21+
import org.sonar.plugins.java.api.JavaFileScanner;
2122

2223
import static org.sonar.java.checks.verifier.TestUtils.mainCodeSourcesPath;
2324

2425
class CommentsMustStartWithCorrectNumberOfSlashesCheckTest {
26+
private static final JavaFileScanner check = new CommentsMustStartWithCorrectNumberOfSlashesCheck();
27+
28+
@Test
29+
void test_before_java17() {
30+
CheckVerifier.newVerifier()
31+
.onFile(mainCodeSourcesPath("checks/CommentsMustStartWithCorrectNumberOfSlashesCheckSample.java"))
32+
.withCheck(check)
33+
.withJavaVersion(16)
34+
.verifyNoIssues();
35+
}
2536

2637
@Test
2738
void test_before_java23() {
2839
CheckVerifier.newVerifier()
29-
.onFile(mainCodeSourcesPath("checks/CommentsMustStartWithCorrectNumberOfSlashesCheckBeforeJava23.java"))
30-
.withCheck(new CommentsMustStartWithCorrectNumberOfSlashesCheck())
40+
.onFile(mainCodeSourcesPath("checks/CommentsMustStartWithCorrectNumberOfSlashesCheckSample.java"))
41+
.withCheck(check)
3142
.withJavaVersion(22)
3243
.verifyIssues();
3344
}
3445

3546
@Test
36-
void test_after_java23() {
47+
void test_java23() {
3748
CheckVerifier.newVerifier()
38-
.onFile(mainCodeSourcesPath("checks/CommentsMustStartWithCorrectNumberOfSlashesCheckAfterJava23.java"))
39-
.withCheck(new CommentsMustStartWithCorrectNumberOfSlashesCheck())
49+
.onFile(mainCodeSourcesPath("checks/CommentsMustStartWithCorrectNumberOfSlashesCheckJava23.java"))
50+
.withCheck(check)
4051
.withJavaVersion(23)
4152
.verifyIssues();
4253
}
43-
54+
4455
}

0 commit comments

Comments
 (0)