/
registerlanguageFeatures.ts
116 lines (115 loc) · 2.85 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
115
116
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,
) {
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: '**/*.md' } },
{ 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) {
server.completionProvider = {
triggerCharacters: '!@#$%^&*()_+-=`~{}|[]\:";\'<>?,./ '.split(''), // all symbols on keyboard
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,
};
}
if (features.inlayHints) {
server.inlayHintProvider = true;
}
}