Skip to content

Commit 8e9709d

Browse files
authored
Fixes regression introduced in latest next version (#1171)
* Fix document selector priority * Add test for computing the document selector
1 parent f906cd9 commit 8e9709d

File tree

2 files changed

+101
-6
lines changed

2 files changed

+101
-6
lines changed

client-node-tests/src/integration.test.ts

Lines changed: 97 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import * as vscode from 'vscode';
1010
import * as lsclient from 'vscode-languageclient/node';
1111
import { MemoryFileSystemProvider } from './memoryFileSystemProvider';
1212
import { vsdiag, DiagnosticProviderMiddleware } from 'vscode-languageclient/lib/common/diagnostic';
13-
import { LanguageClient } from 'vscode-languageclient/node';
1413

1514
namespace GotNotifiedRequest {
1615
export const method: 'testing/gotNotified' = 'testing/gotNotified';
@@ -67,6 +66,102 @@ function isFullDocumentDiagnosticReport(value: vsdiag.DocumentDiagnosticReport):
6766
assert.ok(value.kind === vsdiag.DocumentDiagnosticReportKind.full);
6867
}
6968

69+
interface FoldingRangeTestFeature {
70+
getRegistration(documentSelector: lsclient.DocumentSelector | undefined, capability: undefined | lsclient.FoldingRangeOptions | (lsclient.FoldingRangeRegistrationOptions & lsclient.StaticRegistrationOptions)): [string | undefined, (lsclient.FoldingRangeRegistrationOptions & { documentSelector: lsclient.DocumentSelector }) | undefined];
71+
getRegistrationOptions(documentSelector: lsclient.DocumentSelector | undefined, capability: undefined | lsclient.FoldingRangeOptions) : (lsclient.FoldingRangeRegistrationOptions & { documentSelector: lsclient.DocumentSelector }) | undefined;
72+
}
73+
74+
suite ('Client Features', () => {
75+
76+
const documentSelector: lsclient.DocumentSelector = [{ scheme: 'lsptests', language: 'bat' }];
77+
78+
function createClient(selector: lsclient.DocumentSelector | undefined): lsclient.LanguageClient {
79+
const serverModule = path.join(__dirname, './servers/nullServer.js');
80+
const serverOptions: lsclient.ServerOptions = {
81+
run: { module: serverModule, transport: lsclient.TransportKind.ipc },
82+
debug: { module: serverModule, transport: lsclient.TransportKind.ipc, options: { execArgv: ['--nolazy', '--inspect=6014'] } }
83+
};
84+
85+
const clientOptions: lsclient.LanguageClientOptions = {
86+
documentSelector: selector,
87+
synchronize: {},
88+
initializationOptions: {},
89+
middleware: {},
90+
};
91+
(clientOptions as ({ $testMode?: boolean })).$testMode = true;
92+
93+
const result = new lsclient.LanguageClient('test svr', 'Test Language Server', serverOptions, clientOptions);
94+
result.registerProposedFeatures();
95+
return result;
96+
}
97+
98+
test('Document Selector - Client only', () => {
99+
const client = createClient(documentSelector);
100+
101+
const feature = client.getFeature(lsclient.FoldingRangeRequest.method) as unknown as FoldingRangeTestFeature;
102+
{
103+
const [, options] = feature.getRegistration(documentSelector, {});
104+
isDefined(options);
105+
const filter = options.documentSelector[0] as lsclient.TextDocumentFilter;
106+
assert.strictEqual(filter.scheme, 'lsptests');
107+
assert.strictEqual(filter.language, 'bat');
108+
}
109+
110+
{
111+
const options = feature.getRegistrationOptions(documentSelector, {});
112+
isDefined(options);
113+
const filter = options.documentSelector[0] as lsclient.TextDocumentFilter;
114+
assert.strictEqual(filter.scheme, 'lsptests');
115+
assert.strictEqual(filter.language, 'bat');
116+
}
117+
});
118+
119+
test('Document Selector - Server null', () => {
120+
const client = createClient(documentSelector);
121+
122+
const feature = client.getFeature(lsclient.FoldingRangeRequest.method) as unknown as FoldingRangeTestFeature;
123+
const [, options] = feature.getRegistration(documentSelector, { documentSelector: null });
124+
isDefined(options);
125+
const filter = options.documentSelector[0] as lsclient.TextDocumentFilter;
126+
assert.strictEqual(filter.scheme, 'lsptests');
127+
assert.strictEqual(filter.language, 'bat');
128+
});
129+
130+
test('Document Selector - Client and server', () => {
131+
const client = createClient(documentSelector);
132+
133+
const feature = client.getFeature(lsclient.FoldingRangeRequest.method) as unknown as FoldingRangeTestFeature;
134+
{
135+
const [, options] = feature.getRegistration(documentSelector, { documentSelector: [{ scheme: 'file', language: 'test' }] });
136+
isDefined(options);
137+
const filter = options.documentSelector[0] as lsclient.TextDocumentFilter;
138+
assert.strictEqual(filter.scheme, 'file');
139+
assert.strictEqual(filter.language, 'test');
140+
}
141+
142+
{
143+
// Note that the old registration spec has no support for providing a document selector.
144+
// So ensure that even if we pass one in we will not honor it.
145+
const options = feature.getRegistrationOptions(documentSelector, { documentSelector: [{ scheme: 'file', language: 'test' }] } as any);
146+
isDefined(options);
147+
const filter = options.documentSelector[0] as lsclient.TextDocumentFilter;
148+
assert.strictEqual(filter.scheme, 'lsptests');
149+
assert.strictEqual(filter.language, 'bat');
150+
}
151+
});
152+
153+
test('Document Selector - Server only', () => {
154+
const client = createClient(undefined);
155+
156+
const feature = client.getFeature(lsclient.FoldingRangeRequest.method) as unknown as FoldingRangeTestFeature;
157+
const [, options] = feature.getRegistration(undefined, { documentSelector: [{ scheme: 'file', language: 'test' }] });
158+
isDefined(options);
159+
const filter = options.documentSelector[0] as lsclient.TextDocumentFilter;
160+
assert.strictEqual(filter.scheme, 'file');
161+
assert.strictEqual(filter.language, 'test');
162+
});
163+
});
164+
70165
suite('Client integration', () => {
71166

72167
let client!: lsclient.LanguageClient;
@@ -1800,7 +1895,7 @@ suite('Server activation', () => {
18001895
}, /Client got disposed and can't be restarted./);
18011896
});
18021897

1803-
async function checkServerStart(client: LanguageClient, disposable: vscode.Disposable): Promise<void> {
1898+
async function checkServerStart(client: lsclient.LanguageClient, disposable: vscode.Disposable): Promise<void> {
18041899
return new Promise((resolve, reject) => {
18051900
const timeout = setTimeout(() => {
18061901
reject(new Error(`Server didn't start in 1000 ms.`));

client/src/common/features.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -493,7 +493,7 @@ export abstract class TextDocumentLanguageFeature<PO, RO extends TextDocumentReg
493493
}
494494
}
495495

496-
public get registrationType(): RegistrationType<RO> {
496+
public get registrationType(): RegistrationType<RO> {
497497
return this._registrationType;
498498
}
499499

@@ -530,15 +530,15 @@ export abstract class TextDocumentLanguageFeature<PO, RO extends TextDocumentReg
530530
return [undefined, undefined];
531531
} else if (TextDocumentRegistrationOptions.is(capability)) {
532532
const id = StaticRegistrationOptions.hasId(capability) ? capability.id : UUID.generateUuid();
533-
const selector = capability.documentSelector || documentSelector;
533+
const selector = capability.documentSelector ?? documentSelector;
534534
if (selector) {
535-
return [id, Object.assign({}, { documentSelector: selector }, capability)];
535+
return [id, Object.assign({}, capability, { documentSelector: selector })];
536536
}
537537
} else if (Is.boolean(capability) && capability === true || WorkDoneProgressOptions.is(capability)) {
538538
if (!documentSelector) {
539539
return [undefined, undefined];
540540
}
541-
const options: RO & { documentSelector: DocumentSelector } = (Is.boolean(capability) && capability === true ? { documentSelector } : Object.assign({}, { documentSelector }, capability)) as any;
541+
const options: RO & { documentSelector: DocumentSelector } = (Is.boolean(capability) && capability === true ? { documentSelector } : Object.assign({}, capability, { documentSelector })) as any;
542542
return [UUID.generateUuid(), options];
543543
}
544544
return [undefined, undefined];

0 commit comments

Comments
 (0)