-
Notifications
You must be signed in to change notification settings - Fork 23
/
syntacticLanguageService.ts
51 lines (48 loc) · 1.5 KB
/
syntacticLanguageService.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
import type * as ts from 'typescript';
let currentProjectVersion = -1;
let currentFileName = '';
let currentSnapshot: ts.IScriptSnapshot | undefined;
let languageService: ts.LanguageService | undefined;
let syntaxOnlyLanguageService: ts.LanguageService | undefined;
const host: ts.LanguageServiceHost = {
getProjectVersion: () => currentProjectVersion.toString(),
getScriptFileNames: () => [currentFileName],
getScriptVersion: () => currentProjectVersion.toString(),
getScriptSnapshot: fileName => fileName === currentFileName ? currentSnapshot : undefined,
getCompilationSettings: () => ({}),
getCurrentDirectory: () => '',
getDefaultLibFileName: () => '',
readFile: () => undefined,
fileExists: fileName => fileName === currentFileName,
};
export function getLanguageService(
ts: typeof import('typescript'),
snapshot: ts.IScriptSnapshot,
languageId: string,
syntaxOnly: boolean,
) {
if (currentSnapshot !== snapshot) {
currentSnapshot = snapshot;
currentFileName = '/tmp.' + (
languageId === 'javascript' ? 'js' :
languageId === 'typescriptreact' ? 'tsx' :
languageId === 'javascriptreact' ? 'jsx' :
'ts'
);
currentProjectVersion++;
}
if (syntaxOnly) {
syntaxOnlyLanguageService ??= ts.createLanguageService(host, undefined, ts.LanguageServiceMode.Syntactic);
return {
languageService: syntaxOnlyLanguageService,
fileName: currentFileName,
};
}
else {
languageService ??= ts.createLanguageService(host);
return {
languageService,
fileName: currentFileName,
};
}
}