/
syntaxServicesHost.ts
65 lines (57 loc) · 1.84 KB
/
syntaxServicesHost.ts
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
import * as embedded from '@volar/language-service';
import { URI } from 'vscode-uri';
import { LanguageServerInitializationOptions, LanguageServerPlugin, RuntimeEnvironment } from '../types';
import { loadServerConfig } from './utils/serverConfig';
// fix build
import type * as _ from 'vscode-languageserver-textdocument';
export function createSyntaxServicesHost(
runtimeEnv: RuntimeEnvironment,
plugins: ReturnType<LanguageServerPlugin>[],
ts: typeof import('typescript/lib/tsserverlibrary'),
configHost: embedded.ConfigurationHost | undefined,
initOptions: LanguageServerInitializationOptions,
) {
const services = new Map<string, embedded.DocumentService>();
const untitledService = create(URI.from({ scheme: 'untitled' }));
return {
add,
remove,
get,
};
function add(rootUri: URI) {
services.set(rootUri.toString(), create(rootUri));
}
function remove(rootUri: URI) {
services.delete(rootUri.toString());
}
function get(documentUri: string) {
for (const [rootUri, service] of services) {
if (documentUri.startsWith(rootUri)) {
return service;
}
}
return untitledService;
}
function create(rootUri: URI) {
const env: embedded.LanguageServicePluginContext['env'] = {
rootUri,
configurationHost: configHost,
fileSystemProvider: runtimeEnv.fileSystemProvide,
};
const serverConfig = loadServerConfig(rootUri.fsPath, initOptions.configFilePath);
const serviceContext = embedded.createDocumentServiceContext({
ts,
env,
getLanguageModules() {
return plugins.map(plugin => plugin.syntacticService?.getLanguageModules?.(ts, env) ?? []).flat();
},
getPlugins() {
return [
...serverConfig?.plugins ?? [],
...plugins.map(plugin => plugin.syntacticService?.getServicePlugins?.(serviceContext) ?? []).flat(),
];
},
});
return embedded.createDocumentService(serviceContext);
}
}