From 8e746dfdc71f687c07aad5f5efd8c28b889fe94d Mon Sep 17 00:00:00 2001 From: Johannes Rieken Date: Wed, 21 Jun 2017 11:22:31 +0200 Subject: [PATCH] very first proposed API for multiple roots, #28526 --- src/vs/vscode.proposed.d.ts | 7 +++++++ src/vs/workbench/api/node/extHost.api.impl.ts | 13 +++++++++++++ src/vs/workbench/api/node/extHostWorkspace.ts | 14 +++++++++----- 3 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index fecdcb110fc..85e2d258d49 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -7,6 +7,13 @@ declare module 'vscode' { + export namespace workspace { + + export const onDidChangeWorkspaceFolders: Event; + + export let workspaceFolders: Uri[] | undefined; + } + /** * Controls the behaviour of the terminal's visibility. */ diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index fbaaaaa5897..4222e4ede3d 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -54,6 +54,12 @@ export interface IExtensionApiFactory { (extension: IExtensionDescription): typeof vscode; } +function assertProposedApi(extension: IExtensionDescription): void { + if (!extension.enableProposedApi) { + throw new Error(`[${extension.id}]: Proposed API is only available when running out of dev or with the following command line switch: --enable-proposed-api ${extension.id}`); + } +} + function proposedApiFunction(extension: IExtensionDescription, fn: T): T { if (extension.enableProposedApi) { return fn; @@ -348,6 +354,13 @@ export function createApiFactory( set rootPath(value) { throw errors.readonly(); }, + get workspaceFolders() { + assertProposedApi(extension); + return extHostWorkspace.getRoots(); + }, + onDidChangeWorkspaceFolders: proposedApiFunction(extension, (listener, thisArgs?, disposables?) => { + return extHostWorkspace.onDidChangeWorkspace(listener, thisArgs, disposables); + }), asRelativePath: (pathOrUri) => { return extHostWorkspace.getRelativePath(pathOrUri); }, diff --git a/src/vs/workbench/api/node/extHostWorkspace.ts b/src/vs/workbench/api/node/extHostWorkspace.ts index 5c44d1b052d..f5633e1df63 100644 --- a/src/vs/workbench/api/node/extHostWorkspace.ts +++ b/src/vs/workbench/api/node/extHostWorkspace.ts @@ -21,11 +21,11 @@ export class ExtHostWorkspace extends ExtHostWorkspaceShape { private static _requestIdPool = 0; - private readonly _onDidChangeWorkspace = new Emitter(); + private readonly _onDidChangeWorkspace = new Emitter(); private readonly _proxy: MainThreadWorkspaceShape; private _workspace: Workspace; - readonly onDidChangeWorkspace: Event = this._onDidChangeWorkspace.event; + readonly onDidChangeWorkspace: Event = this._onDidChangeWorkspace.event; constructor(threadService: IThreadService, data: IWorkspaceData) { super(); @@ -35,8 +35,12 @@ export class ExtHostWorkspace extends ExtHostWorkspaceShape { // --- workspace --- - get workspace(): Workspace { - return this._workspace; + getRoots(): URI[] { + if (!this._workspace) { + return undefined; + } else { + return this._workspace.roots.slice(0); + } } getPath(): string { @@ -85,7 +89,7 @@ export class ExtHostWorkspace extends ExtHostWorkspaceShape { $acceptWorkspaceData(data: IWorkspaceData): void { this._workspace = data ? new Workspace(data.id, data.name, data.roots) : null; - this._onDidChangeWorkspace.fire(this); + this._onDidChangeWorkspace.fire(this.getRoots()); } // --- search --- -- GitLab