-
-
Notifications
You must be signed in to change notification settings - Fork 41
/
createFormatter.ts
47 lines (39 loc) 路 1.27 KB
/
createFormatter.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
import { FormattingOptions, LanguagePlugin, LanguageServicePlugin, createLanguage, createLanguageService } from '@volar/language-service';
import * as ts from 'typescript';
import { TextDocument } from 'vscode-languageserver-textdocument';
import { createServiceEnvironment } from './createServiceEnvironment';
export function createFormatter(
languages: LanguagePlugin[],
services: LanguageServicePlugin[]
) {
let fakeUri = 'file:///dummy.txt';
let settings = {};
const env = createServiceEnvironment(() => settings);
const language = createLanguage(languages, false, () => { });
const service = createLanguageService(
language,
services,
env,
);
return {
env,
format,
get settings() {
return settings;
},
set settings(v) {
settings = v;
},
};
async function format(content: string, languageId: string, options: FormattingOptions): Promise<string> {
const snapshot = ts.ScriptSnapshot.fromString(content);
language.scripts.set(fakeUri, languageId, snapshot);
const document = service.context.documents.get(fakeUri, languageId, snapshot);
const edits = await service.format(fakeUri, options, undefined, undefined);
if (edits?.length) {
const newString = TextDocument.applyEdits(document, edits);
return newString;
}
return content;
}
}