Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions client/src/webview/views/context/context.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ export type ContextSectionState = {
export function renderContextView(context: LJContext, currentFile: string, sectionState: ContextSectionState, errorAtCursor?: RefinementMismatchError): string {
if (!context || !currentFile) return "";

const allVars = context.allVars;
const ghosts = context.ghosts.filter(ghost => ghost.file === currentFile);
const aliases = context.aliases;
const allVars = context.allVars || [];
const ghosts = context.ghosts?.filter(ghost => ghost.file === currentFile) || [];
const aliases = context.aliases || [];
const total = allVars.length + ghosts.length + aliases.length;
return /*html*/`
<div>
Expand Down
30 changes: 27 additions & 3 deletions server/src/main/java/LJDiagnosticsService.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import java.io.File;
import java.net.URI;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.stream.Collectors;
import java.util.stream.Stream;

Expand All @@ -24,6 +27,11 @@ public class LJDiagnosticsService implements TextDocumentService, WorkspaceServi

private LJLanguageClient client;
private String workspaceRoot;
private final ExecutorService diagnosticsExecutor = Executors.newSingleThreadExecutor(r -> {
Thread thread = new Thread(r, "liquidjava-diagnostics");
thread.setDaemon(true);
return thread;
});

public void setClient(LJLanguageClient client) {
this.client = client;
Expand Down Expand Up @@ -63,6 +71,22 @@ public void generateDiagnostics(String uri) {
this.client.sendContext(ContextHistoryConverter.convertToDTO(ContextHistory.getInstance()));
}

/**
* Schedules diagnostics generation without blocking the LSP thread
* @param uri the URI of the document
* @return a future that completes when diagnostics are published
*/
public CompletableFuture<Void> generateDiagnosticsAsync(String uri) {
return CompletableFuture.runAsync(() -> generateDiagnostics(uri), diagnosticsExecutor);
}

/**
* Stops background diagnostics work
*/
public void shutdown() {
diagnosticsExecutor.shutdownNow();
}

/**
* Clear a diagnostic for a specific URI
* @param uri the URI of the document
Expand All @@ -82,7 +106,7 @@ public void didOpen(DidOpenTextDocumentParams params) {
String uri = params.getTextDocument().getUri();
if (!PathUtils.isFileInDirectory(uri, workspaceRoot)) return;
System.out.println("Document opened — checking diagnostics");
generateDiagnostics(uri);
generateDiagnosticsAsync(uri);
}

/**
Expand All @@ -95,7 +119,7 @@ public void didSave(DidSaveTextDocumentParams params) {
if (!PathUtils.isFileInDirectory(uri, workspaceRoot)) return;
System.out.println("Document saved — checking diagnostics");
clearDiagnostic(uri);
generateDiagnostics(uri);
generateDiagnosticsAsync(uri);
}

/**
Expand Down Expand Up @@ -130,4 +154,4 @@ public void didChangeConfiguration(DidChangeConfigurationParams params) {
public void didChangeWatchedFiles(DidChangeWatchedFilesParams params) {
// do nothing, ignore
}
}
}
16 changes: 12 additions & 4 deletions server/src/main/java/LJLanguageServer.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.eclipse.lsp4j.InitializeParams;
import org.eclipse.lsp4j.InitializeResult;
Expand All @@ -19,9 +21,15 @@
public class LJLanguageServer implements LanguageServer {

private final LJDiagnosticsService diagnosticsService;
private final ExecutorService stateMachineExecutor;

public LJLanguageServer() {
this.diagnosticsService = new LJDiagnosticsService();
this.stateMachineExecutor = Executors.newSingleThreadExecutor(r -> {
Thread thread = new Thread(r, "liquidjava-fsm");
thread.setDaemon(true);
return thread;
});
}

/**
Expand Down Expand Up @@ -57,6 +65,8 @@ public CompletableFuture<InitializeResult> initialize(InitializeParams params) {
}

public CompletableFuture<Object> shutdown() {
diagnosticsService.shutdown();
stateMachineExecutor.shutdownNow();
return CompletableFuture.completedFuture(null);
}

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

@JsonRequest("liquidjava/fsm")
public CompletableFuture<StateMachine> fsm(Uri uri) {
return CompletableFuture.supplyAsync(() -> {
return StateMachineParser.parse(uri.uri());
});
return CompletableFuture.supplyAsync(() -> StateMachineParser.parse(uri.uri()), stateMachineExecutor);
}

@JsonNotification("liquidjava/verify")
public void verify(Uri uri) {
diagnosticsService.generateDiagnostics(uri.uri());
diagnosticsService.generateDiagnosticsAsync(uri.uri());
}
}