Repository navigation
Expand file tree
/
Copy pathextension.ts
More file actions
140 lines (125 loc) · 4.93 KB
/
Copy pathextension.ts
File metadata and controls
140 lines (125 loc) · 4.93 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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
import * as vscode from "vscode";
import { registerLogger } from "./services/logger";
import { applyItalicOverlay } from "./services/decorators";
import { findJavaExecutable } from "./utils/utils";
import { extension } from "./state";
import { registerCommands } from "./services/commands";
import { registerStatusBar, updateStatusBar } from "./services/status-bar";
import { registerWebview } from "./services/webview";
import { registerHover } from "./services/hover";
import { registerEvents } from "./services/events";
import { registerAutocomplete } from "./services/autocomplete";
import { refreshCodeLenses, registerCodeLens } from "./services/codelens";
import { runLanguageServer, stopLanguageServer } from "./lsp/server";
import { runClient, stopClient } from "./lsp/client";
import type { LiquidJavaTestApi } from "./types/test-api";
/**
* Activates the LiquidJava extension
* @param context The extension context
*/
export async function activate(context: vscode.ExtensionContext): Promise<LiquidJavaTestApi> {
context.subscriptions.push(extension.diagnosticsEmitter, extension.failureEmitter);
registerLogger(context);
extension.logger!.client.info("Activating LiquidJava extension...");
registerStatusBar(context);
registerCommands(context);
registerEvents(context);
registerWebview(context);
registerAutocomplete(context);
registerCodeLens(context);
registerHover();
await applyItalicOverlay();
await startExtension(context);
const ready = extension.client?.isRunning()
? Promise.resolve()
: Promise.reject(new Error("LiquidJava language client did not start"));
// keep activation behavior while callers observe startup failures through ready
void ready.catch(() => {});
return {
ready,
onDiagnostics: extension.diagnosticsEmitter.event,
onFailure: extension.failureEmitter.event,
getState: () => ({
status: extension.status,
diagnostics: [...(extension.diagnostics ?? [])],
serverPid: extension.serverProcess?.pid,
}),
onWebviewMessage: extension.webview!.onWebviewMessage,
};
}
/**
* Deactivates the LiquidJava extension
*/
export async function deactivate() {
extension.logger?.client.info("Deactivating LiquidJava extension...");
await stopClient("Extension was deactivated");
await stopLanguageServer();
resetExtension();
}
/**
* Starts the LiquidJava language server and client
* @param context The extension context
*/
export async function startExtension(context: vscode.ExtensionContext) {
// check if already running
if (extension.client || extension.serverProcess) {
extension.logger!.client.info("LiquidJava is already running");
return;
}
extension.logger!.client.info("Starting LiquidJava...");
updateStatusBar("loading");
// find java executable path
const javaExecutablePath = findJavaExecutable();
if (!javaExecutablePath) {
vscode.window.showErrorMessage("LiquidJava - Java Runtime Not Found in JAVA_HOME or PATH");
extension.logger!.client.error("Java Runtime not found in JAVA_HOME or PATH");
updateStatusBar("stopped");
return;
}
extension.logger!.client.info("Using Java at: " + javaExecutablePath);
// start server
extension.logger!.client.info("Starting LiquidJava language server...");
const port = await runLanguageServer(context, javaExecutablePath);
// start client
extension.logger!.client.info("Starting LiquidJava client...");
await runClient(context, port);
}
/**
* Stops the LiquidJava language server and client
*/
export async function stopExtension() {
if (!extension.client && !extension.serverProcess) {
extension.logger?.client.info("LiquidJava is not running");
return;
}
extension.logger?.client.info("Stopping LiquidJava...");
resetExtension();
await stopClient("Extension stop command");
await stopLanguageServer();
}
/**
* Restarts the LiquidJava language server and client
* @param context The extension context
*/
export async function restartExtension(context: vscode.ExtensionContext) {
extension.logger?.client.info("Restarting LiquidJava...");
// stop if running
if (extension.client || extension.serverProcess) {
await stopExtension();
// ensure clean shutdown
await new Promise(resolve => setTimeout(resolve, 500));
}
// start again
await startExtension(context);
}
export function isExtensionRunning(): boolean {
return extension.status !== "stopped" && Boolean(extension.client);
}
export function resetExtension() {
extension.diagnostics = [];
extension.errorAtCursor = undefined;
refreshCodeLenses();
extension.webview?.sendMessage({ type: "diagnostics", diagnostics: [] });
if (extension.context)
extension.webview?.sendMessage({ type: "context", context: extension.context, errorAtCursor: extension.errorAtCursor });
}