返回 slidev
languageClient.ts
根目录 / packages / vscode / src / languageClient.ts
1 import type { ServerOptions } from '@volar/vscode/node'
2 import { createLabsInfo } from '@volar/vscode'
3 import { LanguageClient, TransportKind } from '@volar/vscode/node'
4 import { computed, extensionContext, watch } from 'reactive-vscode'
5 import { Uri, window } from 'vscode'
6 import * as serverProtocol from '../language-server/protocol'
7 import { slidevFiles } from './projects'
8 import { logger } from './views/logger'
9
10 export function useLanguageClient() {
11 const serverModule = Uri.joinPath(extensionContext.value!.extensionUri, 'dist', 'language-server.cjs')
12 const runOptions = { execArgv: <string[]>[] }
13 const debugOptions = { execArgv: ['--nolazy', `--inspect=${6009}`] }
14 const serverOptions: ServerOptions = {
15 run: {
16 module: serverModule.fsPath,
17 transport: TransportKind.ipc,
18 options: runOptions,
19 },
20 debug: {
21 module: serverModule.fsPath,
22 transport: TransportKind.ipc,
23 options: debugOptions,
24 },
25 }
26
27 const documentSelector = computed(() => slidevFiles.value.map(path => ({ language: 'markdown', pattern: path })))
28
29 logger.info('Starting Slidev language server...')
30 const client = new LanguageClient(
31 'slidev-language-server',
32 'Slidev Language Server',
33 serverOptions,
34 { documentSelector: documentSelector.value },
35 )
36
37 async function doStart(shouldStop: boolean) {
38 if (shouldStop)
39 await client.stop()
40 client.clientOptions.documentSelector = documentSelector.value
41 await client.start()
42 }
43
44 let restartPromise: Promise<void> | undefined
45 async function start(shouldStop: boolean) {
46 await restartPromise
47 restartPromise = doStart(shouldStop)
48 await restartPromise
49 }
50
51 let shouldStop = false
52 watch(
53 () => slidevFiles.value.join('\n'),
54 (files) => {
55 if (files.length === 0 && !shouldStop)
56 return
57 if (shouldStop)
58 window.setStatusBarMessage(`Restarting Slidev language server...`, start(true))
59 else
60 start(false)
61 shouldStop = true
62 },
63 )
64
65 const labsInfo = createLabsInfo(serverProtocol)
66 labsInfo.addLanguageClient(client)
67 return labsInfo.extensionExports
68 }
69
69 lines TYPESCRIPT