Skip to content

Commit 3f2f593

Browse files
SONARJAVA-5819: Make check verifier keep the context for all files when analyzing multiple files
1 parent 199ca4a commit 3f2f593

File tree

12 files changed

+192
-79
lines changed

12 files changed

+192
-79
lines changed

java-checks-testkit/src/main/java/org/sonar/java/checks/verifier/internal/InternalCheckVerifier.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -145,16 +145,15 @@ public InternalCheckVerifier withJavaVersion(int javaVersionAsInt) {
145145
requiresNull(javaVersion, "java version");
146146
return withJavaVersion(javaVersionAsInt, false);
147147
}
148-
148+
149149
@Override
150150
public InternalCheckVerifier withJavaVersion(int javaVersionAsInt, boolean enablePreviewFeatures) {
151151
requiresNull(javaVersion, "java version");
152152
if (enablePreviewFeatures && javaVersionAsInt != JavaVersionImpl.MAX_SUPPORTED) {
153153
var message = String.format(
154154
"Preview features can only be enabled when the version == latest supported Java version (%d != %d)",
155155
javaVersionAsInt,
156-
JavaVersionImpl.MAX_SUPPORTED
157-
);
156+
JavaVersionImpl.MAX_SUPPORTED);
158157
throw new IllegalArgumentException(message);
159158
}
160159
javaVersion = new JavaVersionImpl(javaVersionAsInt, enablePreviewFeatures);
@@ -233,8 +232,7 @@ public CheckVerifier withCache(@Nullable ReadCache readCache, @Nullable WriteCac
233232
this.cacheContext = new InternalCacheContext(
234233
true,
235234
readCache == null ? new DummyCache() : new JavaReadCacheImpl(readCache),
236-
writeCache == null ? new DummyCache() : new JavaWriteCacheImpl(writeCache)
237-
);
235+
writeCache == null ? new DummyCache() : new JavaWriteCacheImpl(writeCache));
238236
return this;
239237
}
240238

@@ -305,17 +303,21 @@ private void verifyAll() {
305303
}
306304
astScanner.scan(filesToParse);
307305

308-
JavaFileScannerContextForTests testJavaFileScannerContext = visitorsBridge.lastCreatedTestContext();
306+
var issues = new LinkedHashSet<AnalyzerMessage>();
307+
var quickFixes = new HashMap<AnalyzerMessage.TextSpan, List<JavaQuickFix>>();
308+
309+
for (var fileScannerContext : visitorsBridge.testContexts()) {
310+
issues.addAll(fileScannerContext.getIssues());
311+
quickFixes.putAll(fileScannerContext.getQuickFixes());
312+
}
313+
309314
JavaFileScannerContextForTests testModuleScannerContext = visitorsBridge.lastCreatedModuleContext();
310-
if (testJavaFileScannerContext != null) {
311-
var issues = new LinkedHashSet<>(testJavaFileScannerContext.getIssues());
315+
if (testModuleScannerContext != null) {
312316
issues.addAll(testModuleScannerContext.getIssues());
313-
var quickFixes = new HashMap<>(testJavaFileScannerContext.getQuickFixes());
314317
quickFixes.putAll(testModuleScannerContext.getQuickFixes());
315-
checkIssues(issues, quickFixes);
316-
} else {
317-
checkIssues(Collections.emptySet(), Collections.emptyMap());
318318
}
319+
320+
checkIssues(issues, quickFixes);
319321
}
320322

321323
private void checkIssues(Set<AnalyzerMessage> issues, Map<TextSpan, List<JavaQuickFix>> quickFixes) {

java-checks-testkit/src/main/java/org/sonar/java/checks/verifier/internal/JavaCheckVerifier.java

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ public static JavaCheckVerifier newInstance() {
8383
private List<InputFile> files = null;
8484
private boolean withoutSemantic = false;
8585
private boolean isCacheEnabled = false;
86-
private Consumer<CompilationUnitTree> compilationUnitModifier = unused -> {};
86+
private Consumer<CompilationUnitTree> compilationUnitModifier = unused -> {
87+
};
8788

8889
@VisibleForTesting
8990
CacheContext cacheContext = null;
@@ -105,7 +106,7 @@ private MultiFileVerifier createVerifier() {
105106
.withJavaVersion(actualVersion)
106107
.withSonarComponents(sonarComponents)
107108
.withAndroidContext(inAndroidContext);
108-
if(!withoutSemantic) {
109+
if (!withoutSemantic) {
109110
visitorsBridgeBuilder.enableSemanticWithProjectClasspath(actualClasspath);
110111
}
111112

@@ -122,10 +123,12 @@ private MultiFileVerifier createVerifier() {
122123

123124
addComments(verifier, commentLinesVisitor);
124125

125-
JavaFileScannerContextForTests testJavaFileScannerContext = visitorsBridge.lastCreatedTestContext();
126+
for (var fileScannerContext : visitorsBridge.testContexts()) {
127+
addIssues(fileScannerContext, verifier);
128+
}
129+
126130
JavaFileScannerContextForTests testModuleScannerContext = visitorsBridge.lastCreatedModuleContext();
127-
if (testJavaFileScannerContext != null) {
128-
addIssues(testJavaFileScannerContext, verifier);
131+
if (testModuleScannerContext != null) {
129132
addIssues(testModuleScannerContext, verifier);
130133
}
131134

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
class B { // Compliant
2+
}
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
class B { // Noncompliant
2+
}

java-checks-testkit/src/test/java/org/sonar/java/checks/verifier/internal/CheckVerifierTestUtils.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import java.util.List;
2121
import java.util.function.Supplier;
2222
import java.util.stream.Stream;
23+
import javax.annotation.Nullable;
2324
import org.sonar.check.Rule;
2425
import org.sonar.java.reporting.InternalJavaIssueBuilder;
2526
import org.sonar.java.reporting.JavaQuickFix;
@@ -40,8 +41,10 @@ private CheckVerifierTestUtils() {
4041
}
4142

4243
protected static final String TEST_FILE = "src/test/files/testing/Compliant.java";
44+
protected static final String TEST_FILE_2 = "src/test/files/testing/Compliant2.java";
4345
protected static final String TEST_FILE_PARSE_ERROR = "src/test/files/testing/ParsingError.java";
4446
protected static final String TEST_FILE_NONCOMPLIANT = "src/test/files/testing/Noncompliant.java";
47+
protected static final String TEST_FILE_NONCOMPLIANT_2 = "src/test/files/testing/Noncompliant2.java";
4548
protected static final String TEST_FILE_NONCOMPLIANT_ISSUE_ON_FILE = "src/test/files/java-check-verifier/CommonsJavaCheckVerifierOnFile.java";
4649
protected static final String TEST_FILE_WITH_QUICK_FIX = "src/test/files/testing/IssueWithQuickFix.java";
4750
protected static final String TEST_FILE_WITH_NO_EXPECTED = "src/test/files/testing/IssueWithNoQuickFixExpected.java";
@@ -51,11 +54,14 @@ private CheckVerifierTestUtils() {
5154

5255
protected static final JavaFileScanner FAILING_CHECK = new FailingCheck();
5356
protected static final JavaFileScanner NO_EFFECT_CHECK = new NoEffectCheck();
54-
protected static final JavaFileScanner FILE_LINE_ISSUE_CHECK = new FileLineIssueCheck();
5557
protected static final JavaFileScanner PROJECT_ISSUE_CHECK = new ProjectIssueCheck();
5658
protected static final JavaFileScanner FILE_ISSUE_CHECK = new FileIssueCheck();
5759
protected static final JavaFileScanner FILE_ISSUE_CHECK_IN_ANDROID = new FileIssueCheckInAndroidContext();
5860

61+
protected static FileLineIssueCheck fileLineIssueCheck() {
62+
return new FileLineIssueCheck();
63+
}
64+
5965
@Rule(key = "FailingCheck")
6066
protected static final class FailingCheck implements JavaFileScanner {
6167
@Override
@@ -97,10 +103,18 @@ public void scanFile(JavaFileScannerContext context) {
97103

98104
@Rule(key = "FileLineIssueCheck")
99105
protected static final class FileLineIssueCheck implements JavaFileScanner {
106+
private @Nullable String pathSuffix = null;
107+
108+
public FileLineIssueCheck raiseForSpecificFileOnly(String pathSuffix) {
109+
this.pathSuffix = pathSuffix;
110+
return this;
111+
}
100112

101113
@Override
102114
public void scanFile(JavaFileScannerContext context) {
103-
context.addIssue(1, this, "issueOnLine");
115+
if (pathSuffix == null || context.getInputFile().uri().getPath().endsWith(pathSuffix)) {
116+
context.addIssue(1, this, "issueOnLine");
117+
}
104118
}
105119
}
106120

java-checks-testkit/src/test/java/org/sonar/java/checks/verifier/internal/InternalCheckVerifierTest.java

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@
5656
import static org.sonar.java.checks.verifier.internal.CheckVerifierTestUtils.FAILING_CHECK;
5757
import static org.sonar.java.checks.verifier.internal.CheckVerifierTestUtils.FILE_ISSUE_CHECK;
5858
import static org.sonar.java.checks.verifier.internal.CheckVerifierTestUtils.FILE_ISSUE_CHECK_IN_ANDROID;
59-
import static org.sonar.java.checks.verifier.internal.CheckVerifierTestUtils.FILE_LINE_ISSUE_CHECK;
6059
import static org.sonar.java.checks.verifier.internal.CheckVerifierTestUtils.IssueWithQuickFix;
6160
import static org.sonar.java.checks.verifier.internal.CheckVerifierTestUtils.MultipleIssuePerLineCheck;
6261
import static org.sonar.java.checks.verifier.internal.CheckVerifierTestUtils.NO_EFFECT_CHECK;
@@ -129,7 +128,7 @@ void setting_no_issues_without_semantic_should_fail_if_issue_is_raised() {
129128
Throwable e = catchThrowable(() -> InternalCheckVerifier.newInstance()
130129
.withJavaVersion(11)
131130
.onFile(TEST_FILE)
132-
.withCheck(FILE_LINE_ISSUE_CHECK)
131+
.withCheck(CheckVerifierTestUtils.fileLineIssueCheck())
133132
.withoutSemantic()
134133
.verifyNoIssues());
135134

@@ -184,12 +183,11 @@ void preview_features_can_only_be_enabled_for_the_latest_java_version() {
184183
assertThatThrownBy(() -> verifier.withJavaVersion(desiredJavaVersion, true))
185184
.isInstanceOf(IllegalArgumentException.class)
186185
.hasMessage(
187-
String.format("Preview features can only be enabled when the version == latest supported Java version (%d != %d)", desiredJavaVersion, JavaVersionImpl.MAX_SUPPORTED)
188-
);
186+
String.format("Preview features can only be enabled when the version == latest supported Java version (%d != %d)", desiredJavaVersion, JavaVersionImpl.MAX_SUPPORTED));
189187
}
190-
191188

192-
/* @Test
189+
/* @formatter:off
190+
@Test
193191
void preview_features_disabled_by_default() {
194192
Throwable e = catchThrowable(() -> InternalCheckVerifier.newInstance()
195193
.withCheck(NO_EFFECT_CHECK)
@@ -218,8 +216,9 @@ void preview_features_disabled_by_default() {
218216
.verifyNoIssues());
219217
220218
assertThat(noExceptionThrown).isNull();
221-
}*/
222-
219+
}
220+
@formatter:on
221+
*/
223222

224223
@Test
225224
void setting_multiple_times_one_files_fails() {
@@ -468,7 +467,7 @@ void raissing_a_different_message_should_fail() {
468467
void raising_an_issue_line_instead_of_project_should_fail() {
469468
Throwable e = catchThrowable(() -> InternalCheckVerifier.newInstance()
470469
.onFile(TEST_FILE)
471-
.withChecks(FILE_LINE_ISSUE_CHECK)
470+
.withChecks(CheckVerifierTestUtils.fileLineIssueCheck())
472471
.verifyIssueOnProject("issueOnProject"));
473472

474473
assertThat(e)
@@ -546,8 +545,8 @@ void raising_issues_while_expecting_none_should_fail() {
546545
.withChecks(
547546
FILE_ISSUE_CHECK,
548547
PROJECT_ISSUE_CHECK,
549-
FILE_LINE_ISSUE_CHECK,
550-
FILE_LINE_ISSUE_CHECK)
548+
CheckVerifierTestUtils.fileLineIssueCheck(),
549+
CheckVerifierTestUtils.fileLineIssueCheck())
551550
.verifyNoIssues());
552551

553552
assertThat(e)
@@ -614,7 +613,7 @@ void raising_a_different_message_should_fail() {
614613
void raising_an_issue_line_instead_of_file_should_fail() {
615614
Throwable e = catchThrowable(() -> InternalCheckVerifier.newInstance()
616615
.onFile(TEST_FILE)
617-
.withChecks(FILE_LINE_ISSUE_CHECK)
616+
.withChecks(CheckVerifierTestUtils.fileLineIssueCheck())
618617
.verifyIssueOnFile("issueOnFile"));
619618

620619
assertThat(e)
@@ -654,7 +653,7 @@ void raising_no_issue_while_expecting_some_should_fail() {
654653
void should_verify() {
655654
InternalCheckVerifier.newInstance()
656655
.onFile(TEST_FILE_NONCOMPLIANT)
657-
.withChecks(FILE_LINE_ISSUE_CHECK)
656+
.withChecks(CheckVerifierTestUtils.fileLineIssueCheck())
658657
.verifyIssues();
659658
}
660659

@@ -744,8 +743,8 @@ void test_one_quick_fix_wrong_description() {
744743
assertThat(e)
745744
.isInstanceOf(AssertionError.class)
746745
.hasMessageContaining("[Quick Fix] Wrong description for issue on line 1.")
747-
.hasMessageContaining( "Expected: {{Description}}")
748-
.hasMessageContaining( "but was: {{wrong}}");
746+
.hasMessageContaining("Expected: {{Description}}")
747+
.hasMessageContaining("but was: {{wrong}}");
749748
}
750749

751750
@Test
@@ -766,7 +765,7 @@ void test_one_quick_fix_wrong_number_of_edits() {
766765
.isInstanceOf(AssertionError.class)
767766
.hasMessageContaining("[Quick Fix] Wrong number of edits for issue on line 1.")
768767
.hasMessageContaining("Expected: {{1}}")
769-
.hasMessageContaining( "but was: {{2}}");
768+
.hasMessageContaining("but was: {{2}}");
770769
}
771770

772771
@Test
@@ -787,7 +786,7 @@ void test_one_quick_fix_wrong_text_replacement() {
787786
.isInstanceOf(AssertionError.class)
788787
.hasMessageContaining("[Quick Fix] Wrong text replacement of edit 1 for issue on line 1.")
789788
.hasMessageContaining("Expected: {{Replacement}}")
790-
.hasMessageContaining( "but was: {{Wrong}}");
789+
.hasMessageContaining("but was: {{Wrong}}");
791790
}
792791

793792
@Test
@@ -877,8 +876,7 @@ void test_two_quick_fix_for_one_issue() {
877876
JavaQuickFix.newQuickFix("Description2")
878877
.addTextEdit(JavaTextEdit.replaceTextSpan(
879878
new AnalyzerMessage.TextSpan(1, 1, 1, 2), "Replacement2"))
880-
.build()
881-
);
879+
.build());
882880

883881
InternalCheckVerifier.newInstance()
884882
.onFile(TEST_FILE_WITH_TWO_QUICK_FIX)
@@ -1015,8 +1013,7 @@ void withCache_effectively_sets_the_caches_for_scanWithoutParsing() throws IOExc
10151013
CacheContext cacheContext = new InternalCacheContext(
10161014
true,
10171015
new JavaReadCacheImpl(readCache),
1018-
new JavaWriteCacheImpl(writeCache)
1019-
);
1016+
new JavaWriteCacheImpl(writeCache));
10201017

10211018
var check = spy(new NoEffectEndOfAnalysisCheck());
10221019

0 commit comments

Comments
 (0)