diff --git a/src/vs/vscode.d.ts b/src/vs/vscode.d.ts index 10fb6183c6e..d86b316c267 100644 --- a/src/vs/vscode.d.ts +++ b/src/vs/vscode.d.ts @@ -5041,8 +5041,9 @@ declare module 'vscode' { export const onDidChangeWorkspaceFolders: Event; /** - * Returns a [workspace folder](#WorkspaceFolder) for the provided resource. When the resource - * is a workspace folder itself, its parent workspace folder or `undefined` is returned. + * Returns the [workspace folder](#WorkspaceFolder) that contains a given uri. + * * returns `undefined` when the given uri doesn't match any workspace folder + * * returns the *input* when the given uri is a workspace folder itself * * @param uri An uri. * @return A workspace folder or `undefined` diff --git a/src/vs/workbench/api/node/extHostWorkspace.ts b/src/vs/workbench/api/node/extHostWorkspace.ts index 1d7fd1b940f..69cc5ec3634 100644 --- a/src/vs/workbench/api/node/extHostWorkspace.ts +++ b/src/vs/workbench/api/node/extHostWorkspace.ts @@ -40,11 +40,9 @@ class Workspace2 extends Workspace { return this._workspaceFolders.slice(0); } - getWorkspaceFolder(uri: URI): vscode.WorkspaceFolder { - let folder = this._structure.lookUp(uri); - if (folder) { - // `uri` is a workspace folder so we check for - // its parent + getWorkspaceFolder(uri: URI, resolveParent?: boolean): vscode.WorkspaceFolder { + if (resolveParent && this._structure.lookUp(uri)) { + // `uri` is a workspace folder so we check for its parent uri = uri.with({ path: dirname(uri.path) }); } return this._structure.findSubstr(uri); @@ -80,11 +78,11 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape { } } - getWorkspaceFolder(uri: vscode.Uri): vscode.WorkspaceFolder { + getWorkspaceFolder(uri: vscode.Uri, resolveParent?: boolean): vscode.WorkspaceFolder { if (!this._workspace) { return undefined; } - return this._workspace.getWorkspaceFolder(uri); + return this._workspace.getWorkspaceFolder(uri, resolveParent); } getPath(): string { @@ -114,9 +112,9 @@ export class ExtHostWorkspace implements ExtHostWorkspaceShape { return path; } - const folder = this.getWorkspaceFolder(typeof pathOrUri === 'string' - ? URI.file(pathOrUri) - : pathOrUri + const folder = this.getWorkspaceFolder( + typeof pathOrUri === 'string' ? URI.file(pathOrUri) : pathOrUri, + true ); if (!folder) { 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 d9874115a7c..ee457705998 100644 --- a/src/vs/workbench/test/electron-browser/api/extHostWorkspace.test.ts +++ b/src/vs/workbench/test/electron-browser/api/extHostWorkspace.test.ts @@ -112,7 +112,15 @@ suite('ExtHostWorkspace', function () { }); test('getContainingWorkspaceFolder', function () { - const ws = new ExtHostWorkspace(new TestThreadService(), { id: 'foo', name: 'Test', folders: [aWorkspaceFolderData(URI.file('/Coding/One'), 0), aWorkspaceFolderData(URI.file('/Coding/Two'), 1), aWorkspaceFolderData(URI.file('/Coding/Two/Nested'), 2)] }); + const ws = new ExtHostWorkspace(new TestThreadService(), { + id: 'foo', + name: 'Test', + folders: [ + aWorkspaceFolderData(URI.file('/Coding/One'), 0), + aWorkspaceFolderData(URI.file('/Coding/Two'), 1), + aWorkspaceFolderData(URI.file('/Coding/Two/Nested'), 2) + ] + }); let folder = ws.getWorkspaceFolder(URI.file('/foo/bar')); assert.equal(folder, undefined); @@ -132,14 +140,23 @@ suite('ExtHostWorkspace', function () { folder = ws.getWorkspaceFolder(URI.file('/Coding/Two/Nested/f')); assert.equal(folder.name, 'Nested'); - folder = ws.getWorkspaceFolder(URI.file('/Coding/Two/Nested')); + folder = ws.getWorkspaceFolder(URI.file('/Coding/Two/Nested'), true); assert.equal(folder.name, 'Two'); + folder = ws.getWorkspaceFolder(URI.file('/Coding/Two/Nested/'), true); + assert.equal(folder.name, 'Two'); + + folder = ws.getWorkspaceFolder(URI.file('/Coding/Two/Nested')); + assert.equal(folder.name, 'Nested'); + folder = ws.getWorkspaceFolder(URI.file('/Coding/Two/Nested/')); - assert.equal(folder.name, 'Two'); + assert.equal(folder.name, 'Nested'); - folder = ws.getWorkspaceFolder(URI.file('/Coding/Two')); + folder = ws.getWorkspaceFolder(URI.file('/Coding/Two'), true); assert.equal(folder, undefined); + + folder = ws.getWorkspaceFolder(URI.file('/Coding/Two'), false); + assert.equal(folder.name, 'Two'); }); test('Multiroot change event should have a delta, #29641', function () {