/
LanguageResolver.ts
74 lines (69 loc) · 2.35 KB
/
LanguageResolver.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
import * as prettier from "prettier";
import { Uri } from "vscode";
import { ModuleResolver } from "./ModuleResolver";
export class LanguageResolver {
constructor(private moduleResolver: ModuleResolver) {}
public async getParserFromLanguageId(
uri: Uri,
languageId: string
): Promise<prettier.BuiltInParserName | string | undefined> {
// This is a workaround for when the vscodeLanguageId is duplicated in multiple
// prettier languages. In these cases the first match is not the preferred match
// so we override with the parser that exactly matches the languageId.
// Specific undesired cases here are:
// `html` matching to `angular`
// `json` matching to `json-stringify`
const languageParsers = ["html", "json"];
if (uri.scheme === "untitled" && languageParsers.includes(languageId)) {
return languageId;
}
const language = (await this.getSupportLanguages(uri.fsPath)).find(
(lang) =>
lang &&
lang.extensions &&
Array.isArray(lang.vscodeLanguageIds) &&
lang.vscodeLanguageIds.includes(languageId)
);
if (language && language.parsers?.length > 0) {
return language.parsers[0];
}
}
public async getSupportedLanguages(fsPath?: string): Promise<string[]> {
const enabledLanguages: string[] = [];
(await this.getSupportLanguages(fsPath)).forEach((lang) => {
if (lang && lang.vscodeLanguageIds) {
enabledLanguages.push(...lang.vscodeLanguageIds);
}
});
return enabledLanguages.filter((value, index, self) => {
return self.indexOf(value) === index;
});
}
public getRangeSupportedLanguages(): string[] {
return [
"javascript",
"javascriptreact",
"typescript",
"typescriptreact",
"json",
"graphql",
];
}
public async getSupportedFileExtensions(fsPath?: string) {
const extensions: string[] = [];
(await this.getSupportLanguages(fsPath)).forEach((lang) => {
if (lang && lang.extensions) {
extensions.push(...lang.extensions);
}
});
return extensions.filter((value, index, self) => {
return self.indexOf(value) === index;
});
}
private async getSupportLanguages(fsPath?: string) {
const prettierInstance = await this.moduleResolver.getPrettierInstance(
fsPath
);
return prettierInstance.getSupportInfo().languages;
}
}