-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathLJLanguageServer.java
More file actions
104 lines (87 loc) · 3.96 KB
/
LJLanguageServer.java
File metadata and controls
104 lines (87 loc) · 3.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
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;
import org.eclipse.lsp4j.ServerCapabilities;
import org.eclipse.lsp4j.TextDocumentSyncKind;
import org.eclipse.lsp4j.WorkspaceFoldersOptions;
import org.eclipse.lsp4j.WorkspaceServerCapabilities;
import org.eclipse.lsp4j.jsonrpc.services.JsonNotification;
import org.eclipse.lsp4j.jsonrpc.services.JsonRequest;
import org.eclipse.lsp4j.services.LanguageServer;
import org.eclipse.lsp4j.services.TextDocumentService;
import org.eclipse.lsp4j.services.WorkspaceService;
import dtos.uri.Uri;
import fsm.StateMachine;
import fsm.StateMachineParser;
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;
});
}
/**
* Initializes the language server with the given parameters
* @param params the initialize parameters
* @return CompletableFuture with the InitializeResult
*/
public CompletableFuture<InitializeResult> initialize(InitializeParams params) {
CompletableFuture<InitializeResult> completableFuture = new CompletableFuture<>();
ServerCapabilities capabilities = new ServerCapabilities();
WorkspaceServerCapabilities workspaceServerCapabilities = new WorkspaceServerCapabilities();
WorkspaceFoldersOptions workspaceFoldersOptions = new WorkspaceFoldersOptions();
// extract workspace root from initialization params
if (params.getWorkspaceFolders() != null && !params.getWorkspaceFolders().isEmpty()) {
String workspaceRoot = params.getWorkspaceFolders().get(0).getUri();
diagnosticsService.setWorkspaceRoot(workspaceRoot);
}
// set options
workspaceFoldersOptions.setChangeNotifications(true);
workspaceFoldersOptions.setSupported(true);
workspaceServerCapabilities.setWorkspaceFolders(workspaceFoldersOptions);
capabilities.setWorkspace(workspaceServerCapabilities);
capabilities.setDocumentSymbolProvider(false);
capabilities.setTextDocumentSync(TextDocumentSyncKind.Full);
capabilities.setDocumentLinkProvider(null); // new DocumentLinkOptions(true));
// More in:
// https://github.com/nedap/archetype-languageserver/blob/24b0890c0f046c6c1af8269a5c9770a8860a96b3/src/main/java/com/nedap/openehr/lsp/ADL2LanguageServer.java
completableFuture.complete(new InitializeResult(capabilities));
return completableFuture;
}
public CompletableFuture<Object> shutdown() {
diagnosticsService.shutdown();
stateMachineExecutor.shutdownNow();
return CompletableFuture.completedFuture(null);
}
public void exit() {
System.exit(1);
}
public TextDocumentService getTextDocumentService() {
return diagnosticsService;
}
public WorkspaceService getWorkspaceService() {
return diagnosticsService;
}
public void connect(LJLanguageClient client) {
diagnosticsService.setClient(client);
}
@SuppressWarnings("unused")
@JsonNotification("$/setTraceNotification")
public void setTrace(Object params) {
// suppress notification
}
@JsonRequest("liquidjava/fsm")
public CompletableFuture<StateMachine> fsm(Uri uri) {
return CompletableFuture.supplyAsync(() -> StateMachineParser.parse(uri.uri()), stateMachineExecutor);
}
@JsonNotification("liquidjava/verify")
public void verify(Uri uri) {
diagnosticsService.generateDiagnosticsAsync(uri.uri());
}
}