11import java .io .File ;
22import java .net .URI ;
33import java .util .List ;
4+ import java .util .concurrent .CompletableFuture ;
5+ import java .util .concurrent .ExecutorService ;
6+ import java .util .concurrent .Executors ;
47import java .util .stream .Collectors ;
58import java .util .stream .Stream ;
69
@@ -24,6 +27,11 @@ public class LJDiagnosticsService implements TextDocumentService, WorkspaceServi
2427
2528 private LJLanguageClient client ;
2629 private String workspaceRoot ;
30+ private final ExecutorService diagnosticsExecutor = Executors .newSingleThreadExecutor (r -> {
31+ Thread thread = new Thread (r , "liquidjava-diagnostics" );
32+ thread .setDaemon (true );
33+ return thread ;
34+ });
2735
2836 public void setClient (LJLanguageClient client ) {
2937 this .client = client ;
@@ -63,6 +71,22 @@ public void generateDiagnostics(String uri) {
6371 this .client .sendContext (ContextHistoryConverter .convertToDTO (ContextHistory .getInstance ()));
6472 }
6573
74+ /**
75+ * Schedules diagnostics generation without blocking the LSP thread
76+ * @param uri the URI of the document
77+ * @return a future that completes when diagnostics are published
78+ */
79+ public CompletableFuture <Void > generateDiagnosticsAsync (String uri ) {
80+ return CompletableFuture .runAsync (() -> generateDiagnostics (uri ), diagnosticsExecutor );
81+ }
82+
83+ /**
84+ * Stops background diagnostics work
85+ */
86+ public void shutdown () {
87+ diagnosticsExecutor .shutdownNow ();
88+ }
89+
6690 /**
6791 * Clear a diagnostic for a specific URI
6892 * @param uri the URI of the document
@@ -82,7 +106,7 @@ public void didOpen(DidOpenTextDocumentParams params) {
82106 String uri = params .getTextDocument ().getUri ();
83107 if (!PathUtils .isFileInDirectory (uri , workspaceRoot )) return ;
84108 System .out .println ("Document opened — checking diagnostics" );
85- generateDiagnostics (uri );
109+ generateDiagnosticsAsync (uri );
86110 }
87111
88112 /**
@@ -95,7 +119,7 @@ public void didSave(DidSaveTextDocumentParams params) {
95119 if (!PathUtils .isFileInDirectory (uri , workspaceRoot )) return ;
96120 System .out .println ("Document saved — checking diagnostics" );
97121 clearDiagnostic (uri );
98- generateDiagnostics (uri );
122+ generateDiagnosticsAsync (uri );
99123 }
100124
101125 /**
@@ -130,4 +154,4 @@ public void didChangeConfiguration(DidChangeConfigurationParams params) {
130154 public void didChangeWatchedFiles (DidChangeWatchedFilesParams params ) {
131155 // do nothing, ignore
132156 }
133- }
157+ }
0 commit comments