-
-
Notifications
You must be signed in to change notification settings - Fork 371
/
registerlanguageFeatures.ts
114 lines (113 loc) · 2.79 KB
/
registerlanguageFeatures.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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import * as shared from '@volar/shared';
import * as vue from '@volar/vue-language-service';
import * as vscode from 'vscode-languageserver';
export function register(
features: NonNullable<shared.ServerInitializationOptions['languageFeatures']>,
legend: vscode.SemanticTokensLegend,
server: vscode.ServerCapabilities,
tsVersion: string,
) {
if (features.references) {
server.referencesProvider = true;
}
if (features.implementation) {
server.implementationProvider = true;
}
if (features.definition) {
server.definitionProvider = true;
}
if (features.typeDefinition) {
server.typeDefinitionProvider = true;
}
if (features.callHierarchy) {
server.callHierarchyProvider = true;
}
if (features.hover) {
server.hoverProvider = true;
}
if (features.rename) {
server.renameProvider = {
prepareProvider: true,
};
}
if (features.renameFileRefactoring) {
server.workspace = {
fileOperations: {
willRename: {
filters: [
{ pattern: { glob: '**/*.vue' } },
{ pattern: { glob: '**/*.js' } },
{ pattern: { glob: '**/*.ts' } },
{ pattern: { glob: '**/*.jsx' } },
{ pattern: { glob: '**/*.tsx' } },
{ pattern: { glob: '**/*.json' } },
]
}
}
}
}
if (features.signatureHelp) {
server.signatureHelpProvider = {
triggerCharacters: ['(', ',', '<'],
retriggerCharacters: [')'],
};
}
if (features.completion) {
const triggerCharacters = vue.getTriggerCharacters(tsVersion);
server.completionProvider = {
triggerCharacters: Object.values(triggerCharacters).flat(),
resolveProvider: true,
};
server.executeCommandProvider = {
commands: [
...(server.executeCommandProvider?.commands ?? []),
'volar.server.convertTagNameCasing',
]
};
}
if (features.documentHighlight) {
server.documentHighlightProvider = true;
}
if (features.documentLink) {
server.documentLinkProvider = {
resolveProvider: false, // TODO
};
}
if (features.workspaceSymbol) {
server.workspaceSymbolProvider = true;
}
if (features.codeLens) {
server.codeLensProvider = {
resolveProvider: true,
};
server.executeCommandProvider = {
commands: [
...(server.executeCommandProvider?.commands ?? []),
vue.executePluginCommand,
]
};
}
if (features.semanticTokens) {
server.semanticTokensProvider = {
range: true,
full: false,
legend,
};
}
if (features.codeAction) {
server.codeActionProvider = {
codeActionKinds: [
vscode.CodeActionKind.Empty,
vscode.CodeActionKind.QuickFix,
vscode.CodeActionKind.Refactor,
vscode.CodeActionKind.RefactorExtract,
vscode.CodeActionKind.RefactorInline,
vscode.CodeActionKind.RefactorRewrite,
vscode.CodeActionKind.Source,
vscode.CodeActionKind.SourceFixAll,
vscode.CodeActionKind.SourceOrganizeImports,
],
resolveProvider: true,
};
}
}