Skip to content

Commit b28da61

Browse files
committed
feat: add vtsls and eslint lsp
1 parent f6e1728 commit b28da61

File tree

2 files changed

+149
-7
lines changed

2 files changed

+149
-7
lines changed

src/cm/lsp/clientManager.js

Lines changed: 57 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,17 @@ import { getIndentUnit, indentUnit } from "@codemirror/language";
22
import {
33
LSPClient,
44
LSPPlugin,
5-
languageServerExtensions,
5+
findReferencesKeymap,
6+
formatKeymap,
7+
hoverTooltips,
8+
jumpToDefinitionKeymap,
9+
renameKeymap,
10+
serverCompletion,
11+
serverDiagnostics,
12+
signatureHelp,
613
} from "@codemirror/lsp-client";
714
import { MapMode } from "@codemirror/state";
15+
import { keymap } from "@codemirror/view";
816
import Uri from "utils/Uri";
917
import { ensureServerRunning } from "./serverLauncher";
1018
import serverRegistry from "./serverRegistry";
@@ -24,6 +32,35 @@ function safeString(value) {
2432
return value != null ? String(value) : "";
2533
}
2634

35+
const defaultKeymaps = keymap.of([
36+
...formatKeymap,
37+
...renameKeymap,
38+
...jumpToDefinitionKeymap,
39+
...findReferencesKeymap,
40+
]);
41+
42+
function buildBuiltinExtensions({
43+
includeHover = true,
44+
includeCompletion = true,
45+
includeSignature = true,
46+
includeKeymaps = true,
47+
includeDiagnostics = true,
48+
} = {}) {
49+
const extensions = [];
50+
let diagnosticsExtension = null;
51+
52+
if (includeCompletion) extensions.push(serverCompletion());
53+
if (includeHover) extensions.push(hoverTooltips());
54+
if (includeKeymaps) extensions.push(defaultKeymaps);
55+
if (includeSignature) extensions.push(signatureHelp());
56+
if (includeDiagnostics) {
57+
diagnosticsExtension = serverDiagnostics();
58+
extensions.push(diagnosticsExtension);
59+
}
60+
61+
return { extensions, diagnosticsExtension };
62+
}
63+
2764
export class LspClientManager {
2865
constructor(options = {}) {
2966
this.options = { ...options };
@@ -173,22 +210,35 @@ export class LspClientManager {
173210
};
174211

175212
const clientConfig = { ...(server.clientConfig || {}) };
213+
const builtinConfig = clientConfig.builtinExtensions || {};
214+
const useDefaultExtensions = clientConfig.useDefaultExtensions !== false;
215+
const { extensions: defaultExtensions, diagnosticsExtension } =
216+
useDefaultExtensions
217+
? buildBuiltinExtensions({
218+
includeHover: builtinConfig.hover !== false,
219+
includeCompletion: builtinConfig.completion !== false,
220+
includeSignature: builtinConfig.signature !== false,
221+
includeKeymaps: builtinConfig.keymaps !== false,
222+
includeDiagnostics: builtinConfig.diagnostics !== false,
223+
})
224+
: { extensions: [], diagnosticsExtension: null };
176225

177226
const extraExtensions = asArray(this.options.clientExtensions);
178227
const serverExtensions = asArray(clientConfig.extensions);
179-
const builtinExtensions = languageServerExtensions();
180228
const wantsCustomDiagnostics = [
181229
...extraExtensions,
182230
...serverExtensions,
183231
].some(
184232
(ext) => !!ext?.clientCapabilities?.textDocument?.publishDiagnostics,
185233
);
234+
235+
const filteredBuiltins =
236+
wantsCustomDiagnostics && diagnosticsExtension
237+
? defaultExtensions.filter((ext) => ext !== diagnosticsExtension)
238+
: defaultExtensions;
239+
186240
const mergedExtensions = [
187-
...(wantsCustomDiagnostics
188-
? builtinExtensions.filter(
189-
(ext) => !ext?.clientCapabilities?.textDocument?.publishDiagnostics,
190-
)
191-
: builtinExtensions),
241+
...filteredBuiltins,
192242
...extraExtensions,
193243
...serverExtensions,
194244
];

src/cm/lsp/serverRegistry.js

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,24 @@ function sanitizeDefinition(definition) {
179179
return sanitized;
180180
}
181181

182+
function resolveJsTsLanguageId(languageId, languageName) {
183+
const lang = toKey(languageId || languageName);
184+
switch (lang) {
185+
case "tsx":
186+
case "typescriptreact":
187+
return "typescriptreact";
188+
case "jsx":
189+
case "javascriptreact":
190+
return "javascriptreact";
191+
case "ts":
192+
return "typescript";
193+
case "js":
194+
return "javascript";
195+
default:
196+
return lang || null;
197+
}
198+
}
199+
182200
function notify(event, payload) {
183201
listeners.forEach((fn) => {
184202
try {
@@ -282,6 +300,40 @@ function registerBuiltinServers() {
282300
},
283301
},
284302
enabled: false,
303+
resolveLanguageId: ({ languageId, languageName }) =>
304+
resolveJsTsLanguageId(languageId, languageName),
305+
},
306+
{
307+
id: "vtsls",
308+
label: "TypeScript / JavaScript (vtsls)",
309+
languages: [
310+
"javascript",
311+
"javascriptreact",
312+
"typescript",
313+
"typescriptreact",
314+
"tsx",
315+
"jsx",
316+
],
317+
transport: {
318+
kind: "websocket",
319+
url: "ws://127.0.0.1:2095",
320+
},
321+
launcher: {
322+
bridge: {
323+
kind: "axs",
324+
port: 2095,
325+
command: "vtsls",
326+
args: ["--stdio"],
327+
},
328+
checkCommand: "which vtsls",
329+
install: {
330+
command:
331+
"apk add --no-cache nodejs npm && npm install -g @vtsls/language-server",
332+
},
333+
},
334+
enabled: false,
335+
resolveLanguageId: ({ languageId, languageName }) =>
336+
resolveJsTsLanguageId(languageId, languageName),
285337
},
286338
{
287339
id: "python",
@@ -311,6 +363,46 @@ function registerBuiltinServers() {
311363
},
312364
enabled: false,
313365
},
366+
{
367+
id: "eslint",
368+
label: "ESLint",
369+
languages: [
370+
"javascript",
371+
"javascriptreact",
372+
"typescript",
373+
"typescriptreact",
374+
"tsx",
375+
"jsx",
376+
],
377+
transport: {
378+
kind: "websocket",
379+
url: "ws://127.0.0.1:2096",
380+
},
381+
launcher: {
382+
bridge: {
383+
kind: "axs",
384+
port: 2096,
385+
command: "vscode-eslint-language-server",
386+
args: ["--stdio"],
387+
},
388+
checkCommand: "which vscode-eslint-language-server",
389+
install: {
390+
command:
391+
"apk add --no-cache nodejs npm && npm install -g vscode-langservers-extracted",
392+
},
393+
},
394+
enabled: false,
395+
clientConfig: {
396+
builtinExtensions: {
397+
hover: false,
398+
completion: false,
399+
signature: false,
400+
keymaps: false,
401+
},
402+
},
403+
resolveLanguageId: ({ languageId, languageName }) =>
404+
resolveJsTsLanguageId(languageId, languageName),
405+
},
314406
{
315407
id: "clangd",
316408
label: "C / C++ (clangd)",

0 commit comments

Comments
 (0)