Skip to content

Commit c4ca2fb

Browse files
SLVSCODE-966 add a separate notification for publishing taint vulnerabilities
1 parent b8eb8e2 commit c4ca2fb

File tree

6 files changed

+36
-7
lines changed

6 files changed

+36
-7
lines changed

src/main/java/org/sonarsource/sonarlint/ls/DiagnosticPublisher.java

+18-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222
import java.net.URI;
2323
import java.util.Comparator;
2424
import java.util.Map;
25-
import java.util.stream.Stream;
2625
import javax.annotation.Nullable;
2726
import org.eclipse.lsp4j.Diagnostic;
2827
import org.eclipse.lsp4j.DiagnosticSeverity;
@@ -79,6 +78,10 @@ public void publishDiagnostics(URI f, boolean onlyIssues) {
7978
client.publishDiagnostics(createPublishDiagnosticsParams(f));
8079
}
8180

81+
public void publishTaints(URI f) {
82+
client.publishTaintVulnerabilities(createPublishTaintsParams(f));
83+
}
84+
8285
public void publishHotspots(URI f) {
8386
client.publishSecurityHotspots(createPublishSecurityHotspotsParams(f));
8487
}
@@ -198,9 +201,22 @@ private PublishDiagnosticsParams createPublishDiagnosticsParams(URI newUri) {
198201
.stream()
199202
.filter(e -> !e.getValue().isResolved())
200203
.map(this::taintDtoToDiagnostic);
204+
205+
var diagnosticList = localDiagnostics
206+
.sorted(DiagnosticPublisher.byLineNumber())
207+
.toList();
208+
p.setDiagnostics(diagnosticList);
209+
p.setUri(newUri.toString());
210+
211+
return p;
212+
}
213+
214+
private PublishDiagnosticsParams createPublishTaintsParams(URI newUri) {
215+
var p = new PublishDiagnosticsParams();
216+
201217
var taintDiagnostics = taintVulnerabilitiesCache.getAsDiagnostics(newUri, focusOnNewCode);
202218

203-
var diagnosticList = Stream.concat(localDiagnostics, taintDiagnostics)
219+
var diagnosticList = taintDiagnostics
204220
.sorted(DiagnosticPublisher.byLineNumber())
205221
.toList();
206222
p.setDiagnostics(diagnosticList);

src/main/java/org/sonarsource/sonarlint/ls/SonarLintExtendedLanguageClient.java

+3
Original file line numberDiff line numberDiff line change
@@ -768,6 +768,9 @@ public String getReason() {
768768
@JsonNotification("sonarlint/publishSecurityHotspots")
769769
void publishSecurityHotspots(PublishDiagnosticsParams publishDiagnosticsParams);
770770

771+
@JsonNotification("sonarlint/publishTaintVulnerabilities")
772+
void publishTaintVulnerabilities(PublishDiagnosticsParams publishDiagnosticsParams);
773+
771774
@JsonNotification("sonarlint/readyForTests")
772775
void readyForTests();
773776

src/main/java/org/sonarsource/sonarlint/ls/clientapi/SonarLintVSCodeClient.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -456,7 +456,7 @@ private void handleAddedTaints(Map<URI, List<TaintVulnerabilityDto>> addedTaints
456456
addedTaintIssuesForFile.addAll(existingTaintVulnerabilitiesPerFile.get(fileUri));
457457
}
458458
taintVulnerabilitiesCache.reload(fileUri, addedTaintIssuesForFile);
459-
diagnosticPublisher.publishDiagnostics(fileUri, true);
459+
diagnosticPublisher.publishTaints(fileUri);
460460
});
461461
}
462462

@@ -475,7 +475,7 @@ private void handleUpdatedTaints(Map<URI, List<TaintVulnerabilityDto>> updateTai
475475
} else {
476476
taintVulnerabilitiesCache.reload(fileUri, dtosToTaintIssues(folderUri, updates, isSonarCloud));
477477
}
478-
diagnosticPublisher.publishDiagnostics(fileUri, true);
478+
diagnosticPublisher.publishTaints(fileUri);
479479
});
480480
}
481481

@@ -543,7 +543,7 @@ private void initializeTaintCache(Set<String> configurationScopeIds) {
543543
taintsByFile.forEach((fileUri, t) -> {
544544
var vulnerabilities = dtosToTaintIssues(configurationScopeId, t, isSonarCloud);
545545
taintVulnerabilitiesCache.reload(fileUri, vulnerabilities);
546-
diagnosticPublisher.publishDiagnostics(fileUri, true);
546+
diagnosticPublisher.publishTaints(fileUri);
547547
});
548548

549549
return null;

src/test/java/org/sonarsource/sonarlint/ls/clientapi/SonarLintVSCodeClientTests.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -743,7 +743,7 @@ void shouldPopulateTaintsCacheOnAnalysisReadinessChangedAndPublishDiagnostics()
743743
assertThat(taintIssues).hasSize(2);
744744
assertThat(((TaintIssue) taintIssues.get(0)).getId()).isEqualTo(uuid1);
745745
assertThat(((TaintIssue) taintIssues.get(1)).getId()).isEqualTo(uuid2);
746-
verify(diagnosticPublisher).publishDiagnostics(URIUtils.getFullFileUriFromFragments(workspaceFolderPath.toUri().toString(), filePath), true);
746+
verify(diagnosticPublisher).publishTaints(URIUtils.getFullFileUriFromFragments(workspaceFolderPath.toUri().toString(), filePath));
747747
}
748748

749749
@Test

src/test/java/org/sonarsource/sonarlint/ls/mediumtests/AbstractLanguageServerMediumTests.java

+10
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,7 @@ protected static void awaitLatch(CountDownLatch latch) {
336336
protected static class FakeLanguageClient implements SonarLintExtendedLanguageClient {
337337

338338
Map<String, List<Diagnostic>> diagnostics = new ConcurrentHashMap<>();
339+
Map<String, List<Diagnostic>> taints = new ConcurrentHashMap<>();
339340
Map<String, List<Diagnostic>> hotspots = new ConcurrentHashMap<>();
340341
Queue<MessageParams> logs = new ConcurrentLinkedQueue<>();
341342
Map<String, Object> globalSettings = new HashMap<>();
@@ -392,6 +393,10 @@ List<Diagnostic> getDiagnostics(String uri) {
392393
return diagnostics.getOrDefault(uri, List.of());
393394
}
394395

396+
List<Diagnostic> getTaints(String uri) {
397+
return taints.getOrDefault(uri, List.of());
398+
}
399+
395400
List<Diagnostic> getHotspots(String uri) {
396401
return hotspots.getOrDefault(uri, List.of());
397402
}
@@ -406,6 +411,11 @@ public void publishSecurityHotspots(PublishDiagnosticsParams diagnostics) {
406411
this.hotspots.put(diagnostics.getUri(), diagnostics.getDiagnostics());
407412
}
408413

414+
@Override
415+
public void publishTaintVulnerabilities(PublishDiagnosticsParams publishDiagnosticsParams) {
416+
this.taints.put(publishDiagnosticsParams.getUri(), publishDiagnosticsParams.getDiagnostics());
417+
}
418+
409419
@Override
410420
public void showMessage(MessageParams messageParams) {
411421
shownMessages.add(messageParams);

src/test/java/org/sonarsource/sonarlint/ls/mediumtests/ConnectedModeMediumTests.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -1432,7 +1432,7 @@ void shouldReportTaintIssues() {
14321432
var content = "def foo():\n toto = 0\n plouf = 0\n";
14331433
didOpen(fileUri, "python", content);
14341434

1435-
awaitUntilAsserted(() -> assertThat(client.getDiagnostics(fileUri))
1435+
awaitUntilAsserted(() -> assertThat(client.getTaints(fileUri))
14361436
.extracting(startLine(), startCharacter(), endLine(), endCharacter(), code(), Diagnostic::getSource, Diagnostic::getMessage,
14371437
Diagnostic::getSeverity)
14381438
.contains(tuple(0, 1, 0, 2, "ruleKey", "Latest SonarQube Server Analysis", "message", DiagnosticSeverity.Warning)));

0 commit comments

Comments
 (0)