diff --git a/src/vs/platform/workspace/common/workspace.ts b/src/vs/platform/workspace/common/workspace.ts index 608b859f16b..2a922761192 100644 --- a/src/vs/platform/workspace/common/workspace.ts +++ b/src/vs/platform/workspace/common/workspace.ts @@ -131,7 +131,7 @@ export class LegacyWorkspace implements ILegacyWorkspace { export class Workspace implements IWorkspace { - private _rootsMap: TrieMap = new TrieMap(TrieMap.PathSplitter); + protected _rootsMap: TrieMap = new TrieMap(TrieMap.PathSplitter); constructor( public readonly id: string, @@ -177,4 +177,4 @@ export class Workspace implements IWorkspace { public toJSON(): IWorkspace { return { id: this.id, roots: this.roots, name: this.name }; } -} \ No newline at end of file +} diff --git a/src/vs/vscode.proposed.d.ts b/src/vs/vscode.proposed.d.ts index 4c30adbfb12..f736281035a 100644 --- a/src/vs/vscode.proposed.d.ts +++ b/src/vs/vscode.proposed.d.ts @@ -53,13 +53,12 @@ declare module 'vscode' { export const onDidChangeWorkspaceFolders: Event; /** - * Returns a [workspace folder](#WorkspaceFolder) that is containing the provided - * resource. + * Returns a [workspace folder](#WorkspaceFolder) for the provided resource. * * @param uri An uri. * @return A workspace folder or `undefined` */ - export function getContainingWorkspaceFolder(uri: Uri): WorkspaceFolder | undefined; + export function getWorkspaceFolder(uri: Uri): WorkspaceFolder | undefined; } export interface WorkspaceConfiguration2 extends WorkspaceConfiguration { diff --git a/src/vs/workbench/api/node/extHost.api.impl.ts b/src/vs/workbench/api/node/extHost.api.impl.ts index fd47c95109a..cae3571f267 100644 --- a/src/vs/workbench/api/node/extHost.api.impl.ts +++ b/src/vs/workbench/api/node/extHost.api.impl.ts @@ -367,8 +367,8 @@ export function createApiFactory( set rootPath(value) { throw errors.readonly(); }, - getContainingWorkspaceFolder(resource) { - return extHostWorkspace.getEnclosingWorkspaceFolder(resource); + getWorkspaceFolder(resource) { + return extHostWorkspace.getWorkspaceFolder(resource); }, get workspaceFolders() { // proposed api diff --git a/src/vs/workbench/api/node/extHostWorkspace.ts b/src/vs/workbench/api/node/extHostWorkspace.ts index 09ad94258f7..2ef49280a8e 100644 --- a/src/vs/workbench/api/node/extHostWorkspace.ts +++ b/src/vs/workbench/api/node/extHostWorkspace.ts @@ -16,33 +16,37 @@ import { TPromise } from 'vs/base/common/winjs.base'; import { fromRange, EndOfLine } from 'vs/workbench/api/node/extHostTypeConverters'; import { IWorkspaceData, ExtHostWorkspaceShape, MainContext, MainThreadWorkspaceShape } from './extHost.protocol'; import * as vscode from 'vscode'; -import { compare } from "vs/base/common/strings"; +import { compare } from 'vs/base/common/strings'; - -class Workspace2 { +class Workspace2 extends Workspace { static fromData(data: IWorkspaceData) { return data ? new Workspace2(data) : null; } - readonly workspace: Workspace; - readonly folders: vscode.WorkspaceFolder[]; + private readonly _folder = new Map(); private constructor(data: IWorkspaceData) { - this.workspace = new Workspace(data.id, data.name, data.roots); - this.folders = this.workspace.roots.map((uri, index) => ({ name: basename(uri.fsPath), uri, index })); + super(data.id, data.name, data.roots); + + this.roots.forEach((uri, index) => { + this._folder.set(uri, { + name: basename(uri.fsPath), + uri, + index + }); + }); } - getRoot(uri: URI): vscode.WorkspaceFolder { - const root = this.workspace.getRoot(uri); - if (root) { - for (const folder of this.folders) { - if (folder.uri.toString() === root.toString()) { - return folder; - } - } - } - return undefined; + get folders(): vscode.WorkspaceFolder[] { + const ret: vscode.WorkspaceFolder[] = []; + this._folder.forEach(value => ret.push(value)); + return ret; + } + + getWorkspaceFolder(uri: URI): vscode.WorkspaceFolder { + let root = this._rootsMap.findSubstr(uri.fsPath); + return root && this._folder.get(root); } } @@ -65,7 +69,7 @@ export class ExtHostWorkspace extends ExtHostWorkspaceShape { // --- workspace --- get workspace(): Workspace { - return this._workspace && this._workspace.workspace; + return this._workspace; } getWorkspaceFolders(): vscode.WorkspaceFolder[] { @@ -76,11 +80,11 @@ export class ExtHostWorkspace extends ExtHostWorkspaceShape { } } - getEnclosingWorkspaceFolder(uri: vscode.Uri): vscode.WorkspaceFolder { + getWorkspaceFolder(uri: vscode.Uri): vscode.WorkspaceFolder { if (!this._workspace) { return undefined; } - return this._workspace.getRoot(uri); + return this._workspace.getWorkspaceFolder(uri); } getPath(): string { @@ -90,7 +94,7 @@ export class ExtHostWorkspace extends ExtHostWorkspaceShape { if (!this._workspace) { return undefined; } - const { roots } = this._workspace.workspace; + const { roots } = this._workspace; if (roots.length === 0) { return undefined; } @@ -115,11 +119,11 @@ export class ExtHostWorkspace extends ExtHostWorkspaceShape { return path; } - if (!this._workspace || isFalsyOrEmpty(this._workspace.workspace.roots)) { + if (!this._workspace || isFalsyOrEmpty(this._workspace.roots)) { return normalize(path); } - for (const { fsPath } of this._workspace.workspace.roots) { + for (const { fsPath } of this._workspace.roots) { let result = relative(fsPath, path); if (!result || result.indexOf('..') === 0) { continue; diff --git a/src/vs/workbench/test/electron-browser/api/extHostWorkspace.test.ts b/src/vs/workbench/test/electron-browser/api/extHostWorkspace.test.ts index 0fb1ffb22e8..c9a5e9cdd24 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostWorkspace.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostWorkspace.test.ts @@ -80,22 +80,28 @@ suite('ExtHostWorkspace', function () { test('getContainingWorkspaceFolder', function () { const ws = new ExtHostWorkspace(new TestThreadService(), { id: 'foo', name: 'Test', roots: [URI.file('/Coding/One'), URI.file('/Coding/Two'), URI.file('/Coding/Two/Nested')] }); - let folder = ws.getEnclosingWorkspaceFolder(URI.file('/foo/bar')); + let folder = ws.getWorkspaceFolder(URI.file('/foo/bar')); assert.equal(folder, undefined); - folder = ws.getEnclosingWorkspaceFolder(URI.file('/Coding/One/file/path.txt')); + folder = ws.getWorkspaceFolder(URI.file('/Coding/One/file/path.txt')); assert.equal(folder.name, 'One'); - folder = ws.getEnclosingWorkspaceFolder(URI.file('/Coding/Two/file/path.txt')); + folder = ws.getWorkspaceFolder(URI.file('/Coding/Two/file/path.txt')); assert.equal(folder.name, 'Two'); - folder = ws.getEnclosingWorkspaceFolder(URI.file('/Coding/Two/Nest')); + folder = ws.getWorkspaceFolder(URI.file('/Coding/Two/Nest')); assert.equal(folder.name, 'Two'); - folder = ws.getEnclosingWorkspaceFolder(URI.file('/Coding/Two/Nested/file')); + folder = ws.getWorkspaceFolder(URI.file('/Coding/Two/Nested/file')); assert.equal(folder.name, 'Nested'); - // folder = ws.getEnclosingWorkspaceFolder(URI.file('/Coding/Two/Nested')); + folder = ws.getWorkspaceFolder(URI.file('/Coding/Two/Nested/f')); + assert.equal(folder.name, 'Nested'); + + // folder = ws.getWorkspaceFolder(URI.file('/Coding/Two/Nested')); + // assert.equal(folder.name, 'Two'); + + // folder = ws.getWorkspaceFolder(URI.file('/Coding/Two/Nested/')); // assert.equal(folder.name, 'Two'); });