Skip to content

Commit 1cb07f5

Browse files
authored
Parallelize Verification and FSM (#66)
1 parent 927e085 commit 1cb07f5

File tree

3 files changed

+42
-10
lines changed

3 files changed

+42
-10
lines changed

client/src/webview/views/context/context.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,9 @@ export type ContextSectionState = {
1414
export function renderContextView(context: LJContext, currentFile: string, sectionState: ContextSectionState, errorAtCursor?: RefinementMismatchError): string {
1515
if (!context || !currentFile) return "";
1616

17-
const allVars = context.allVars;
18-
const ghosts = context.ghosts.filter(ghost => ghost.file === currentFile);
19-
const aliases = context.aliases;
17+
const allVars = context.allVars || [];
18+
const ghosts = context.ghosts?.filter(ghost => ghost.file === currentFile) || [];
19+
const aliases = context.aliases || [];
2020
const total = allVars.length + ghosts.length + aliases.length;
2121
return /*html*/`
2222
<div>

server/src/main/java/LJDiagnosticsService.java

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import java.io.File;
22
import java.net.URI;
33
import java.util.List;
4+
import java.util.concurrent.CompletableFuture;
5+
import java.util.concurrent.ExecutorService;
6+
import java.util.concurrent.Executors;
47
import java.util.stream.Collectors;
58
import 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+
}

server/src/main/java/LJLanguageServer.java

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import java.util.concurrent.CompletableFuture;
2+
import java.util.concurrent.ExecutorService;
3+
import java.util.concurrent.Executors;
24

35
import org.eclipse.lsp4j.InitializeParams;
46
import org.eclipse.lsp4j.InitializeResult;
@@ -19,9 +21,15 @@
1921
public class LJLanguageServer implements LanguageServer {
2022

2123
private final LJDiagnosticsService diagnosticsService;
24+
private final ExecutorService stateMachineExecutor;
2225

2326
public LJLanguageServer() {
2427
this.diagnosticsService = new LJDiagnosticsService();
28+
this.stateMachineExecutor = Executors.newSingleThreadExecutor(r -> {
29+
Thread thread = new Thread(r, "liquidjava-fsm");
30+
thread.setDaemon(true);
31+
return thread;
32+
});
2533
}
2634

2735
/**
@@ -57,6 +65,8 @@ public CompletableFuture<InitializeResult> initialize(InitializeParams params) {
5765
}
5866

5967
public CompletableFuture<Object> shutdown() {
68+
diagnosticsService.shutdown();
69+
stateMachineExecutor.shutdownNow();
6070
return CompletableFuture.completedFuture(null);
6171
}
6272

@@ -84,13 +94,11 @@ public void setTrace(Object params) {
8494

8595
@JsonRequest("liquidjava/fsm")
8696
public CompletableFuture<StateMachine> fsm(Uri uri) {
87-
return CompletableFuture.supplyAsync(() -> {
88-
return StateMachineParser.parse(uri.uri());
89-
});
97+
return CompletableFuture.supplyAsync(() -> StateMachineParser.parse(uri.uri()), stateMachineExecutor);
9098
}
9199

92100
@JsonNotification("liquidjava/verify")
93101
public void verify(Uri uri) {
94-
diagnosticsService.generateDiagnostics(uri.uri());
102+
diagnosticsService.generateDiagnosticsAsync(uri.uri());
95103
}
96104
}

0 commit comments

Comments
 (0)