diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index ccc90b2f95825..15d30bbcb0a70 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -5198,6 +5198,32 @@ declare module 'vscode' { */ export const onDidChangeWorkspaceFolders: Event; + /** + * Adds workspace folders to the currently opened workspace. Will ignore workspace + * folders that are already part of the workspace. + * + * Note: if this workspace had no folder opened, all extensions will be restarted + * so that the (deprecated) `rootPath` property is updated to point to the first workspace + * folder. + * + * @param folders a list of workspace folders to add. + */ + export function addWorkspaceFolders(folders: { uri: Uri, name?: string }[]): Thenable; + + /** + * Removes workspace folders from the currently opened workspace if they are part of the + * workspace. + * + * This method will be a no-op when called while not having a workspace opened. + * + * Note: if the first workspace folder is removed, all extensions will be restarted + * so that the (deprecated) `rootPath` property is updated to point to the first workspace + * folder. + * + * @param folders a list of [workspace folders](#WorkspaceFolder) to remove. + */ + export function removeWorkspaceFolders(folders: WorkspaceFolder[]): Thenable; + /** * Returns the [workspace folder](#WorkspaceFolder) that contains a given uri. * * returns `undefined` when the given uri doesn't match any workspace folder diff --git a/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts b/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts index 69e0970574381..ccfb7915c192c 100644 --- a/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts +++ b/src/vs/workbench/api/electron-browser/mainThreadWorkspace.ts @@ -52,6 +52,14 @@ export class MainThreadWorkspace implements MainThreadWorkspaceShape { this._proxy.$acceptWorkspaceData(this._contextService.getWorkbenchState() === WorkbenchState.EMPTY ? null : this._contextService.getWorkspace()); } + $addFolders(folders: { uri: URI, name?: string }[]): Thenable { + return this._contextService.addFolders(folders); + } + + $removeFolders(folders: URI[]): Thenable { + return this._contextService.removeFolders(folders); + } + // --- search --- $startSearch(include: string | IRelativePattern, exclude: string | IRelativePattern, maxResults: number, requestId: number): Thenable { diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index ea70995107947..6f6d3906230e9 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -397,6 +397,12 @@ export function createApiFactory( get workspaceFolders() { return extHostWorkspace.getWorkspaceFolders(); }, + addWorkspaceFolders(folders) { + return extHostWorkspace.addWorkspaceFolders(folders); + }, + removeWorkspaceFolders(folders) { + return extHostWorkspace.removeWorkspaceFolders(folders); + }, onDidChangeWorkspaceFolders: function (listener, thisArgs?, disposables?) { return extHostWorkspace.onDidChangeWorkspace(listener, thisArgs, disposables); }, diff --git a/src/vs/workbench/api/node/extHost.protocol.ts b/src/vs/workbench/api/node/extHost.protocol.ts index 2e14b41c060b4..9141a5a8770e0 100644 --- a/src/vs/workbench/api/node/extHost.protocol.ts +++ b/src/vs/workbench/api/node/extHost.protocol.ts @@ -326,6 +326,8 @@ export interface MainThreadWorkspaceShape extends IDisposable { $startSearch(include: string | IRelativePattern, exclude: string | IRelativePattern, maxResults: number, requestId: number): Thenable; $cancelSearch(requestId: number): Thenable; $saveAll(includeUntitled?: boolean): Thenable; + $addFolders(folders: { uri: URI, name?: string }[]): Thenable; + $removeFolders(folders: URI[]): Thenable; } export interface MainThreadFileSystemShape extends IDisposable { diff --git a/src/vs/workbench/api/node/extHostWorkspace.ts b/src/vs/workbench/api/node/extHostWorkspace.ts index 654d088c5defe..5da0def7f7d7f 100644 --- a/src/vs/workbench/api/node/extHostWorkspace.ts +++ b/src/vs/workbench/api/node/extHostWorkspace.ts @@ -78,6 +78,17 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape { } } + addWorkspaceFolders(folders: { uri: URI, name?: string }[]): Thenable { + return this._proxy.$addFolders(folders); + } + + removeWorkspaceFolders(folders: vscode.WorkspaceFolder[]): Thenable { + const existingWorkspaceFolders = this.getWorkspaceFolders(); + const folderUrisToRemove = folders.filter(folder => existingWorkspaceFolders.indexOf(folder) >= 0).map(f => f.uri); + + return this._proxy.$removeFolders(folderUrisToRemove); + } + getWorkspaceFolder(uri: vscode.Uri, resolveParent?: boolean): vscode.WorkspaceFolder { if (!this._workspace) { return undefined;