Skip to content

Commit 4790e47

Browse files
committed
Provide additional workspace API to add/remove workspace folders (for #35407)
1 parent a7b743e commit 4790e47

File tree

5 files changed

+53
-0
lines changed

5 files changed

+53
-0
lines changed

src/vs/vscode.d.ts

+26
Original file line numberDiff line numberDiff line change
@@ -5198,6 +5198,32 @@ declare module 'vscode' {
51985198
*/
51995199
export const onDidChangeWorkspaceFolders: Event<WorkspaceFoldersChangeEvent>;
52005200

5201+
/**
5202+
* Adds workspace folders to the currently opened workspace. Will ignore workspace
5203+
* folders that are already part of the workspace.
5204+
*
5205+
* Note: if this workspace had no folder opened, all extensions will be restarted
5206+
* so that the (deprecated) `rootPath` property is updated to point to the first workspace
5207+
* folder.
5208+
*
5209+
* @param folders a list of workspace folders to add.
5210+
*/
5211+
export function addWorkspaceFolders(folders: { uri: Uri, name?: string }[]): Thenable<void>;
5212+
5213+
/**
5214+
* Removes workspace folders from the currently opened workspace if they are part of the
5215+
* workspace.
5216+
*
5217+
* This method will be a no-op when called while not having a workspace opened.
5218+
*
5219+
* Note: if the first workspace folder is removed, all extensions will be restarted
5220+
* so that the (deprecated) `rootPath` property is updated to point to the first workspace
5221+
* folder.
5222+
*
5223+
* @param folders a list of [workspace folders](#WorkspaceFolder) to remove.
5224+
*/
5225+
export function removeWorkspaceFolders(folders: WorkspaceFolder[]): Thenable<void>;
5226+
52015227
/**
52025228
* Returns the [workspace folder](#WorkspaceFolder) that contains a given uri.
52035229
* * returns `undefined` when the given uri doesn't match any workspace folder

src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts

+8
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,14 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape {
5252
this._proxy.$acceptWorkspaceData(this._contextService.getWorkbenchState() === WorkbenchState.EMPTY ? null : this._contextService.getWorkspace());
5353
}
5454

55+
$addFolders(folders: { uri: URI, name?: string }[]): Thenable<void> {
56+
return this._contextService.addFolders(folders);
57+
}
58+
59+
$removeFolders(folders: URI[]): Thenable<void> {
60+
return this._contextService.removeFolders(folders);
61+
}
62+
5563
// --- search ---
5664

5765
$startSearch(include: string | IRelativePattern, exclude: string | IRelativePattern, maxResults: number, requestId: number): Thenable<URI[]> {

src/vs/workbench/api/node/extHost.api.impl.ts

+6
Original file line numberDiff line numberDiff line change
@@ -397,6 +397,12 @@ export function createApiFactory(
397397
get workspaceFolders() {
398398
return extHostWorkspace.getWorkspaceFolders();
399399
},
400+
addWorkspaceFolders(folders) {
401+
return extHostWorkspace.addWorkspaceFolders(folders);
402+
},
403+
removeWorkspaceFolders(folders) {
404+
return extHostWorkspace.removeWorkspaceFolders(folders);
405+
},
400406
onDidChangeWorkspaceFolders: function (listener, thisArgs?, disposables?) {
401407
return extHostWorkspace.onDidChangeWorkspace(listener, thisArgs, disposables);
402408
},

src/vs/workbench/api/node/extHost.protocol.ts

+2
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,8 @@ export interface MainThreadWorkspaceShape extends IDisposable {
326326
$startSearch(include: string | IRelativePattern, exclude: string | IRelativePattern, maxResults: number, requestId: number): Thenable<URI[]>;
327327
$cancelSearch(requestId: number): Thenable<boolean>;
328328
$saveAll(includeUntitled?: boolean): Thenable<boolean>;
329+
$addFolders(folders: { uri: URI, name?: string }[]): Thenable<void>;
330+
$removeFolders(folders: URI[]): Thenable<void>;
329331
}
330332

331333
export interface MainThreadFileSystemShape extends IDisposable {

src/vs/workbench/api/node/extHostWorkspace.ts

+11
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,17 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape {
7878
}
7979
}
8080

81+
addWorkspaceFolders(folders: { uri: URI, name?: string }[]): Thenable<void> {
82+
return this._proxy.$addFolders(folders);
83+
}
84+
85+
removeWorkspaceFolders(folders: vscode.WorkspaceFolder[]): Thenable<void> {
86+
const existingWorkspaceFolders = this.getWorkspaceFolders();
87+
const folderUrisToRemove = folders.filter(folder => existingWorkspaceFolders.indexOf(folder) >= 0).map(f => f.uri);
88+
89+
return this._proxy.$removeFolders(folderUrisToRemove);
90+
}
91+
8192
getWorkspaceFolder(uri: vscode.Uri, resolveParent?: boolean): vscode.WorkspaceFolder {
8293
if (!this._workspace) {
8394
return undefined;

0 commit comments

Comments
 (0)