Skip to content

Commit 8daa162

Browse files
committed
feat: add respectClientCapabilities option for multiple servers supports
#1916 (comment)
1 parent 6352cd3 commit 8daa162

File tree

4 files changed

+36
-30
lines changed

4 files changed

+36
-30
lines changed

extensions/vscode-vue-language-features/src/common.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,7 @@ function getInitializationOptions(
264264
) {
265265
const textDocumentSync = vscode.workspace.getConfiguration('volar').get<'incremental' | 'full' | 'none'>('vueserver.textDocumentSync');
266266
const initializationOptions: VueServerInitializationOptions = {
267+
respectClientCapabilities: true,
267268
serverMode,
268269
diagnosticModel: diagnosticModel() === 'pull' ? DiagnosticModel.Pull : DiagnosticModel.Push,
269270
textDocumentSync: textDocumentSync ? {

packages/language-server/src/registerFeatures.ts

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -47,29 +47,30 @@ export const semanticTokensLegend: vscode.SemanticTokensLegend = {
4747
export function setupSyntacticCapabilities(
4848
params: ClientCapabilities,
4949
server: vscode.ServerCapabilities,
50+
initOptions: LanguageServerInitializationOptions,
5051
) {
51-
if (params.textDocument?.selectionRange) {
52+
if (!initOptions.respectClientCapabilities || params.textDocument?.selectionRange) {
5253
server.selectionRangeProvider = true;
5354
}
54-
if (params.textDocument?.foldingRange) {
55+
if (!initOptions.respectClientCapabilities || params.textDocument?.foldingRange) {
5556
server.foldingRangeProvider = true;
5657
}
57-
if (params.textDocument?.linkedEditingRange) {
58+
if (!initOptions.respectClientCapabilities || params.textDocument?.linkedEditingRange) {
5859
server.linkedEditingRangeProvider = true;
5960
}
60-
if (params.textDocument?.colorProvider) {
61+
if (!initOptions.respectClientCapabilities || params.textDocument?.colorProvider) {
6162
server.colorProvider = true;
6263
}
63-
if (params.textDocument?.documentSymbol) {
64+
if (!initOptions.respectClientCapabilities || params.textDocument?.documentSymbol) {
6465
server.documentSymbolProvider = true;
6566
}
66-
if (params.textDocument?.formatting) {
67+
if (!initOptions.respectClientCapabilities || params.textDocument?.formatting) {
6768
server.documentFormattingProvider = true;
6869
}
69-
if (params.textDocument?.rangeFormatting) {
70+
if (!initOptions.respectClientCapabilities || params.textDocument?.rangeFormatting) {
7071
server.documentRangeFormattingProvider = true;
7172
}
72-
if (params.textDocument?.onTypeFormatting) {
73+
if (!initOptions.respectClientCapabilities || params.textDocument?.onTypeFormatting) {
7374
// https://github.com/microsoft/vscode/blob/ce119308e8fd4cd3f992d42b297588e7abe33a0c/extensions/typescript-language-features/src/languageFeatures/formatting.ts#L99
7475
server.documentOnTypeFormattingProvider = {
7576
firstTriggerCharacter: ';',
@@ -81,33 +82,33 @@ export function setupSyntacticCapabilities(
8182
export function setupSemanticCapabilities(
8283
params: ClientCapabilities,
8384
server: vscode.ServerCapabilities,
84-
options: LanguageServerInitializationOptions,
85+
initOptions: LanguageServerInitializationOptions,
8586
plugins: ReturnType<LanguageServerPlugin>[],
8687
) {
87-
if (params.textDocument?.references) {
88+
if (!initOptions.respectClientCapabilities || params.textDocument?.references) {
8889
server.referencesProvider = true;
8990
}
90-
if (params.textDocument?.implementation) {
91+
if (!initOptions.respectClientCapabilities || params.textDocument?.implementation) {
9192
server.implementationProvider = true;
9293
}
93-
if (params.textDocument?.definition) {
94+
if (!initOptions.respectClientCapabilities || params.textDocument?.definition) {
9495
server.definitionProvider = true;
9596
}
96-
if (params.textDocument?.typeDefinition) {
97+
if (!initOptions.respectClientCapabilities || params.textDocument?.typeDefinition) {
9798
server.typeDefinitionProvider = true;
9899
}
99-
if (params.textDocument?.callHierarchy) {
100+
if (!initOptions.respectClientCapabilities || params.textDocument?.callHierarchy) {
100101
server.callHierarchyProvider = true;
101102
}
102-
if (params.textDocument?.hover) {
103+
if (!initOptions.respectClientCapabilities || params.textDocument?.hover) {
103104
server.hoverProvider = true;
104105
}
105-
if (params.textDocument?.rename) {
106+
if (!initOptions.respectClientCapabilities || params.textDocument?.rename) {
106107
server.renameProvider = {
107108
prepareProvider: true,
108109
};
109110
}
110-
if (params.workspace?.fileOperations) {
111+
if (!initOptions.respectClientCapabilities || params.workspace?.fileOperations) {
111112
server.workspace = {
112113
fileOperations: {
113114
willRename: {
@@ -127,13 +128,13 @@ export function setupSemanticCapabilities(
127128
}
128129
};
129130
}
130-
if (params.textDocument?.signatureHelp) {
131+
if (!initOptions.respectClientCapabilities || params.textDocument?.signatureHelp) {
131132
server.signatureHelpProvider = {
132133
triggerCharacters: ['(', ',', '<'],
133134
retriggerCharacters: [')'],
134135
};
135136
}
136-
if (params.textDocument?.completion) {
137+
if (!initOptions.respectClientCapabilities || params.textDocument?.completion) {
137138
server.completionProvider = {
138139
// triggerCharacters: '!@#$%^&*()_+-=`~{}|[]\:";\'<>?,./ '.split(''), // all symbols on keyboard
139140
// hardcode to fix https://github.com/sublimelsp/LSP-volar/issues/114
@@ -149,23 +150,23 @@ export function setupSemanticCapabilities(
149150
])],
150151
resolveProvider: true,
151152
};
152-
if (options.ignoreTriggerCharacters) {
153+
if (initOptions.ignoreTriggerCharacters) {
153154
server.completionProvider.triggerCharacters = server.completionProvider.triggerCharacters
154-
?.filter(c => !options.ignoreTriggerCharacters!.includes(c));
155+
?.filter(c => !initOptions.ignoreTriggerCharacters!.includes(c));
155156
}
156157
}
157-
if (params.textDocument?.documentHighlight) {
158+
if (!initOptions.respectClientCapabilities || params.textDocument?.documentHighlight) {
158159
server.documentHighlightProvider = true;
159160
}
160-
if (params.textDocument?.documentLink) {
161+
if (!initOptions.respectClientCapabilities || params.textDocument?.documentLink) {
161162
server.documentLinkProvider = {
162163
resolveProvider: false, // TODO
163164
};
164165
}
165-
if (params.workspace?.symbol) {
166+
if (!initOptions.respectClientCapabilities || params.workspace?.symbol) {
166167
server.workspaceSymbolProvider = true;
167168
}
168-
if (params.textDocument?.codeLens) {
169+
if (!initOptions.respectClientCapabilities || params.textDocument?.codeLens) {
169170
server.codeLensProvider = {
170171
resolveProvider: true,
171172
};
@@ -176,14 +177,14 @@ export function setupSemanticCapabilities(
176177
]
177178
};
178179
}
179-
if (params.textDocument?.semanticTokens) {
180+
if (!initOptions.respectClientCapabilities || params.textDocument?.semanticTokens) {
180181
server.semanticTokensProvider = {
181182
range: true,
182183
full: false,
183184
legend: semanticTokensLegend,
184185
};
185186
}
186-
if (params.textDocument?.codeAction) {
187+
if (!initOptions.respectClientCapabilities || params.textDocument?.codeAction) {
187188
server.codeActionProvider = {
188189
codeActionKinds: [
189190
vscode.CodeActionKind.Empty,
@@ -199,10 +200,10 @@ export function setupSemanticCapabilities(
199200
resolveProvider: true,
200201
};
201202
}
202-
if (params.textDocument?.inlayHint) {
203+
if (!initOptions.respectClientCapabilities || params.textDocument?.inlayHint) {
203204
server.inlayHintProvider = true;
204205
}
205-
if (params.textDocument?.diagnostic && (options.diagnosticModel ?? DiagnosticModel.Push) === DiagnosticModel.Pull) {
206+
if (!initOptions.respectClientCapabilities || params.textDocument?.diagnostic && (initOptions.diagnosticModel ?? DiagnosticModel.Push) === DiagnosticModel.Pull) {
206207
server.diagnosticProvider = {
207208
documentSelector: [
208209
...plugins.map(plugin => plugin.extraFileExtensions.map(ext => ({ pattern: `**/*.${ext.extension}` }))).flat(),

packages/language-server/src/server.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ export function createCommonLanguageServer(
5151

5252
const serverMode = options.serverMode ?? ServerMode.Semantic;
5353

54-
setupSyntacticCapabilities(params.capabilities, result.capabilities);
54+
setupSyntacticCapabilities(params.capabilities, result.capabilities, options);
5555
await _createDocumentServiceHost();
5656

5757
if (serverMode === ServerMode.Semantic) {

packages/language-server/src/types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -112,4 +112,8 @@ export interface LanguageServerInitializationOptions {
112112
*/
113113
cancellationPipeName?: string;
114114
noProjectReferences?: boolean;
115+
/**
116+
* Enable this option to make language server setup server capabilities based on client capabilities to support multiple servers.
117+
*/
118+
respectClientCapabilities?: boolean;
115119
}

0 commit comments

Comments
 (0)