/
documentService.ts
78 lines (71 loc) · 2.37 KB
/
documentService.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
66
67
68
69
70
71
72
73
74
75
76
77
78
import useCssPlugin from '@volar-plugins/css';
import useHtmlPlugin from '@volar-plugins/html';
import useJsonPlugin from '@volar-plugins/json';
import usePugPlugin from '@volar-plugins/pug';
import usePugFormatPlugin from '@volar-plugins/pug-beautify';
import useTsPlugin from '@volar-plugins/typescript';
import { DocumentServiceRuntimeContext } from '@volar/language-service';
import useVuePlugin from './plugins/vue';
import useAutoWrapParenthesesPlugin from './plugins/vue-autoinsert-parentheses';
import useAutoAddSpacePlugin from './plugins/vue-autoinsert-space';
import * as embeddedLS from '@volar/language-service';
import * as vue from '@volar/vue-language-core';
import * as shared from '@volar/shared';
import type * as _1 from 'vscode-languageserver-protocol';
import type * as _2 from 'vscode-languageserver-textdocument';
import { VueFile } from '@volar/vue-language-core';
export function getDocumentServicePlugins(
context: DocumentServiceRuntimeContext
) {
const getVueFile = (document: _2.TextDocument) => {
context.update(document);
const virtualFile = context.documents.getVirtualFileByUri(document.uri);
if (virtualFile instanceof VueFile) {
return virtualFile;
}
};
const vuePlugin = useVuePlugin({ getVueFile });
const htmlPlugin = useHtmlPlugin();
const pugPlugin = usePugPlugin();
const cssPlugin = useCssPlugin();
const jsonPlugin = useJsonPlugin();
const tsPlugin = useTsPlugin();
const autoWrapParenthesesPlugin = useAutoWrapParenthesesPlugin({ getVueFile });
const autoAddSpacePlugin = useAutoAddSpacePlugin();
const pugFormatPlugin = usePugFormatPlugin();
return [
vuePlugin,
htmlPlugin,
pugPlugin,
pugFormatPlugin,
cssPlugin,
jsonPlugin,
tsPlugin,
autoWrapParenthesesPlugin,
autoAddSpacePlugin,
];
}
export function createDocumentService(
ts: typeof import('typescript/lib/tsserverlibrary'),
env: embeddedLS.LanguageServicePluginContext['env'],
) {
const vueLanguageModules = vue.createLanguageModules(
ts,
shared.getPathOfUri(env.rootUri.toString()),
{},
{},
);
const languageServiceContext = embeddedLS.createDocumentServiceContext({
ts,
env,
getLanguageModules() {
return vueLanguageModules;
},
getPlugins() {
return plugins;
},
});
const plugins = getDocumentServicePlugins(languageServiceContext);
const languageService = embeddedLS.createDocumentService(languageServiceContext);
return languageService;
}