-
Notifications
You must be signed in to change notification settings - Fork 385
Expand file tree
/
Copy pathworkspaceFolder.ts
More file actions
56 lines (52 loc) · 2.67 KB
/
workspaceFolder.ts
File metadata and controls
56 lines (52 loc) · 2.67 KB
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
/* --------------------------------------------------------------------------------------------
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
* ------------------------------------------------------------------------------------------ */
'use strict';
import {
Event, Emitter, Disposable, ClientCapabilities, WorkspaceFolder, WorkspaceFoldersChangeEvent, DidChangeWorkspaceFoldersNotification,
WorkspaceFoldersRequest, ServerCapabilities, WorkspaceFoldersClientCapabilities
} from 'vscode-languageserver-protocol';
import type { Feature, _RemoteWorkspace } from './server';
export interface WorkspaceFolders {
getWorkspaceFolders(): Promise<WorkspaceFolder[] | null>;
onDidChangeWorkspaceFolders: Event<WorkspaceFoldersChangeEvent>;
}
export const WorkspaceFoldersFeature: Feature<_RemoteWorkspace, WorkspaceFolders> = (Base) => {
return class extends Base {
private _onDidChangeWorkspaceFolders: Emitter<WorkspaceFoldersChangeEvent> | undefined;
private _unregistration: Promise<Disposable> | undefined;
private _notificationIsAutoRegistered: boolean;
public constructor() {
super();
this._notificationIsAutoRegistered = false;
}
public initialize(capabilities: ClientCapabilities): void {
super.initialize(capabilities);
const workspaceCapabilities = capabilities.workspace;
if (workspaceCapabilities && (workspaceCapabilities.workspaceFolders as WorkspaceFoldersClientCapabilities).changeNotifications) {
this._onDidChangeWorkspaceFolders = new Emitter<WorkspaceFoldersChangeEvent>();
this.connection.onNotification(DidChangeWorkspaceFoldersNotification.type, (params) => {
this._onDidChangeWorkspaceFolders!.fire(params.event);
});
}
}
public fillServerCapabilities(capabilities: ServerCapabilities): void {
super.fillServerCapabilities(capabilities);
const changeNotifications = capabilities.workspace?.workspaceFolders?.changeNotifications;
this._notificationIsAutoRegistered = changeNotifications === true || typeof changeNotifications === 'string';
}
getWorkspaceFolders(): Promise<WorkspaceFolder[] | null> {
return this.connection.sendRequest(WorkspaceFoldersRequest.type);
}
get onDidChangeWorkspaceFolders(): Event<WorkspaceFoldersChangeEvent> {
if (!this._onDidChangeWorkspaceFolders) {
throw new Error('Client doesn\'t support sending workspace folder change events.');
}
if (!this._notificationIsAutoRegistered && !this._unregistration) {
this._unregistration = this.connection.client.register(DidChangeWorkspaceFoldersNotification.type);
}
return this._onDidChangeWorkspaceFolders.event;
}
};
};