@vtsls/language-server
Version:
LSP wrapper for typescript extension of vscode
240 lines (236 loc) • 9.48 kB
JavaScript
;
// src/index.ts
var import_language_service2 = require("@vtsls/language-service");
var import_node2 = require("vscode-languageserver/node");
var import_vscode_uri = require("vscode-uri");
// src/capabilities.ts
var import_language_service = require("@vtsls/language-service");
var import_node = require("vscode-languageserver/node");
function getTsLspDefaultCapabilities() {
return {
textDocumentSync: {
openClose: true,
change: import_node.TextDocumentSyncKind.Incremental,
willSave: false,
willSaveWaitUntil: false,
save: false
},
completionProvider: {
triggerCharacters: import_language_service.completionTriggerCharacters,
resolveProvider: true,
completionItem: {
labelDetailsSupport: true
}
},
hoverProvider: true,
signatureHelpProvider: {
triggerCharacters: import_language_service.signatureHelpTriggerCharacters,
retriggerCharacters: import_language_service.signatureHelpReTriggerCharacters
},
declarationProvider: false,
definitionProvider: true,
typeDefinitionProvider: true,
implementationProvider: true,
referencesProvider: true,
documentHighlightProvider: true,
documentSymbolProvider: {
label: "typescript"
},
codeActionProvider: {
codeActionKinds: import_language_service.codeActionKinds,
resolveProvider: true
},
codeLensProvider: { resolveProvider: true },
// documentLinkProvider: { resolveProvider: false },
documentLinkProvider: void 0,
colorProvider: false,
workspaceSymbolProvider: { resolveProvider: false },
documentFormattingProvider: true,
documentRangeFormattingProvider: true,
documentOnTypeFormattingProvider: {
firstTriggerCharacter: import_language_service.onTypeFormatFirstTriggerCharacter,
moreTriggerCharacter: import_language_service.onTypeFormatMoreTriggerCharacter
},
renameProvider: {
prepareProvider: true
},
foldingRangeProvider: true,
selectionRangeProvider: true,
executeCommandProvider: {
commands: import_language_service.commands
},
callHierarchyProvider: true,
linkedEditingRangeProvider: true,
semanticTokensProvider: {
legend: {
tokenTypes: import_language_service.semanticTokenTypes,
tokenModifiers: import_language_service.semanticTokenModifiers
},
full: true,
range: true
},
monikerProvider: false,
typeHierarchyProvider: false,
inlineValueProvider: false,
inlayHintProvider: true,
workspace: {
workspaceFolders: {
supported: true,
changeNotifications: true
},
fileOperations: {
didRename: {
filters: [
{
scheme: "file",
pattern: {
glob: "**/*.{ts,cts,mts,tsx,js,cjs,mjs,jsx}",
matches: "file"
}
},
{
scheme: "file",
pattern: {
glob: "**/*",
matches: "folder"
}
}
]
}
}
}
};
}
// src/index.ts
function createLanguageServer() {
const conn = (0, import_node2.createConnection)(import_node2.ProposedFeatures.all);
conn.onInitialize((params) => {
return onServerInitialize(conn, params);
});
conn.listen();
}
function onServerInitialize(conn, params) {
var _a, _b, _c, _d;
const clientCapabilities = params.capabilities;
const root = params.rootUri ?? (params.rootPath ? import_vscode_uri.URI.file(params.rootPath).toString() : void 0);
const folders = params.workspaceFolders ?? (typeof root == "string" ? [{ name: root, uri: root }] : void 0);
const service = (0, import_language_service2.createTSLanguageService)({
locale: params.locale,
workspaceFolders: folders,
clientCapabilities,
hostInfo: (_a = params.initializationOptions) == null ? void 0 : _a.hostInfo,
tsExtLogPath: (_b = params.initializationOptions) == null ? void 0 : _b.tsLogPath
});
async function initializeService() {
var _a2;
try {
if ((_a2 = clientCapabilities.workspace) == null ? void 0 : _a2.configuration) {
const config = await conn.sendRequest(import_node2.ConfigurationRequest.type, {
items: [{ section: "" }]
});
await service.initialize(Array.isArray(config) ? config[0] : {});
} else {
await service.initialize({});
}
} catch (e) {
conn.console.error(`Server initialization failed: ${String(e)}`);
conn.dispose();
}
}
conn.onInitialized(() => {
bindServiceHandlers(conn, service, clientCapabilities);
void initializeService();
});
process.on("exit", () => service.dispose());
const capabilities = getTsLspDefaultCapabilities();
if (!((_d = (_c = clientCapabilities.textDocument) == null ? void 0 : _c.codeAction) == null ? void 0 : _d.codeActionLiteralSupport)) {
capabilities.codeActionProvider = true;
}
return {
capabilities,
serverInfo: { name: "vtsls", version: "0.2.9" }
};
}
function bindServiceHandlers(conn, service, clientCapabilities) {
var _a, _b, _c, _d, _e, _f;
service.onLogMessage((params) => void conn.sendNotification(import_node2.LogMessageNotification.type, params));
service.onLogTrace((params) => void conn.tracer.log(params.message));
if ((_a = clientCapabilities.window) == null ? void 0 : _a.showMessage) {
service.onShowMessage((params) => conn.sendRequest(import_node2.ShowMessageRequest.type, params));
}
if ((_b = clientCapabilities.window) == null ? void 0 : _b.showDocument) {
service.onShowDocument(
async (params) => (await conn.sendRequest(import_node2.ShowDocumentRequest.type, params)).success
);
}
if ((_c = clientCapabilities.window) == null ? void 0 : _c.workDoneProgress) {
service.onWorkDoneProgress(() => conn.window.createWorkDoneProgress());
}
if ((_d = clientCapabilities.workspace) == null ? void 0 : _d.applyEdit) {
service.onApplyWorkspaceEdit((params) => conn.workspace.applyEdit(params));
}
if ((_e = clientCapabilities.textDocument) == null ? void 0 : _e.publishDiagnostics) {
service.onDiagnostics((params) => conn.sendDiagnostics(params));
}
conn.onExit(() => service.dispose());
conn.onShutdown(() => service.dispose());
function safeRun(handler, fallback, catchProviderNotFound = false) {
return async (...args) => {
try {
return await handler(...args);
} catch (e) {
if (catchProviderNotFound && e instanceof import_language_service2.ProviderNotFoundError) {
conn.console.warn(e.message);
return fallback;
} else if (e instanceof import_language_service2.DocumentNotOpenedError) {
return fallback;
}
throw e;
}
};
}
conn.onDidOpenTextDocument(service.openTextDocument);
conn.onDidCloseTextDocument(service.closeTextDocument);
conn.onDidChangeTextDocument(service.changeTextDocument);
conn.onDidChangeConfiguration(service.changeConfiguration);
conn.workspace.onDidRenameFiles(service.renameFiles);
if ((_f = clientCapabilities.workspace) == null ? void 0 : _f.workspaceFolders) {
conn.workspace.onDidChangeWorkspaceFolders(
(event) => service.changeWorkspaceFolders({ event })
);
}
conn.onCompletion(safeRun(service.completion, null));
conn.onCompletionResolve(service.completionItemResolve);
conn.onDocumentHighlight(safeRun(service.documentHighlight, null));
conn.onSignatureHelp(safeRun(service.signatureHelp, null));
conn.onDefinition(safeRun(service.definition, null));
conn.onReferences(safeRun(service.references, null));
conn.onHover(safeRun(service.hover, null));
conn.onDocumentSymbol(safeRun(service.documentSymbol, null));
conn.onWorkspaceSymbol(safeRun(service.workspaceSymbol, null));
conn.onCodeAction(safeRun(service.codeAction, null));
conn.onCodeActionResolve(service.codeActionResolve);
conn.onExecuteCommand(safeRun(service.executeCommand, null));
conn.onImplementation(safeRun(service.implementation, null));
conn.onTypeDefinition(safeRun(service.typeDefinition, null));
conn.onDocumentFormatting(safeRun(service.documentFormatting, null));
conn.onDocumentRangeFormatting(safeRun(service.documentRangeFormatting, null));
conn.onDocumentOnTypeFormatting(safeRun(service.documentOnTypeFormatting, null));
conn.onPrepareRename(safeRun(service.prepareRename, null));
conn.onRenameRequest(safeRun(service.rename, null));
conn.onFoldingRanges(safeRun(service.foldingRanges, null));
conn.onSelectionRanges(safeRun(service.selectionRanges, null));
conn.onCodeLens(safeRun(service.codeLens, null));
conn.onCodeLensResolve(service.codeLensResolve);
conn.languages.callHierarchy.onPrepare(safeRun(service.prepareCallHierarchy, null, true));
conn.languages.callHierarchy.onIncomingCalls(safeRun(service.incomingCalls, null, true));
conn.languages.callHierarchy.onOutgoingCalls(safeRun(service.outgoingCalls, null, true));
conn.languages.inlayHint.on(safeRun(service.inlayHint, null, true));
conn.languages.onLinkedEditingRange(safeRun(service.linkedEditingRange, null, true));
const nullSemanticTokens = { data: [] };
conn.languages.semanticTokens.on(safeRun(service.semanticTokensFull, nullSemanticTokens, true));
conn.languages.semanticTokens.onRange(
safeRun(service.semanticTokensRange, nullSemanticTokens, true)
);
}
createLanguageServer();