diff --git a/backend/core/src/main/java/org/sonarsource/sonarlint/core/analysis/AnalysisService.java b/backend/core/src/main/java/org/sonarsource/sonarlint/core/analysis/AnalysisService.java index 955377e73a..1d43e3d197 100644 --- a/backend/core/src/main/java/org/sonarsource/sonarlint/core/analysis/AnalysisService.java +++ b/backend/core/src/main/java/org/sonarsource/sonarlint/core/analysis/AnalysisService.java @@ -779,17 +779,20 @@ private CompletableFuture schedule(String configScopeId, Analyze schedulerCache.getOrCreateAnalysisScheduler(configScopeId, command.getTrace())); startChild(trace, "post", "schedule", () -> scheduler.post(command)); var result = command.getFutureResult(); - result.exceptionally(exception -> { - eventPublisher.publishEvent(new AnalysisFailedEvent(analysisId)); - if (exception instanceof CancellationException) { - LOG.debug("Analysis canceled"); - } else { - LOG.error("Error during analysis", exception); - } - return null; - }); return result + .exceptionally(exception -> { + eventPublisher.publishEvent(new AnalysisFailedEvent(analysisId)); + if (exception instanceof CancellationException) { + LOG.debug("Analysis canceled"); + } else { + LOG.error("Error during analysis", exception); + } + return null; + }) .thenApply(analysisResults -> { + if (analysisResults == null) { + return null; + } var languagePerFile = analysisResults.languagePerFile().entrySet().stream().collect(HashMap::new, (map, entry) -> map.put(entry.getKey().uri(), entry.getValue()), HashMap::putAll); logSummary(rawIssues, analysisResults.getDuration()); diff --git a/backend/rpc-impl/src/main/java/org/sonarsource/sonarlint/core/rpc/impl/AnalysisRpcServiceDelegate.java b/backend/rpc-impl/src/main/java/org/sonarsource/sonarlint/core/rpc/impl/AnalysisRpcServiceDelegate.java index 789084047b..c306d45d91 100644 --- a/backend/rpc-impl/src/main/java/org/sonarsource/sonarlint/core/rpc/impl/AnalysisRpcServiceDelegate.java +++ b/backend/rpc-impl/src/main/java/org/sonarsource/sonarlint/core/rpc/impl/AnalysisRpcServiceDelegate.java @@ -24,6 +24,7 @@ import java.util.concurrent.CompletableFuture; import org.eclipse.lsp4j.jsonrpc.ResponseErrorException; import org.eclipse.lsp4j.jsonrpc.messages.ResponseError; +import org.eclipse.lsp4j.jsonrpc.messages.ResponseErrorCode; import org.sonarsource.sonarlint.core.analysis.AnalysisResult; import org.sonarsource.sonarlint.core.analysis.AnalysisService; import org.sonarsource.sonarlint.core.analysis.NodeJsService; @@ -141,7 +142,12 @@ public CompletableFuture analyzeFilesAndTrack(AnalyzeFiles return requestFutureAsync(cancelChecker -> getBean(AnalysisService.class) .scheduleAnalysis(params.getConfigurationScopeId(), params.getAnalysisId(), Set.copyOf(params.getFilesToAnalyze()), params.getExtraProperties(), params.isShouldFetchServerIssues(), TriggerType.FORCED_WITH_EXCLUSIONS, cancelChecker) - .thenApply(AnalysisRpcServiceDelegate::generateAnalyzeFilesResponse), configurationScopeId); + .thenApply(analysisResults -> { + if (analysisResults == null) { + throw new ResponseErrorException(new ResponseError(ResponseErrorCode.RequestCancelled, "Analysis was cancelled", null)); + } + return generateAnalyzeFilesResponse(analysisResults); + }), configurationScopeId); } @Override