Skip to content

Commit 5fa7f96

Browse files
committed
Move toResource method to IWorkspaceFolder
1 parent 04139fa commit 5fa7f96

21 files changed

Lines changed: 103 additions & 116 deletions

File tree

src/vs/editor/standalone/browser/simpleServices.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import { KeybindingResolver } from 'vs/platform/keybinding/common/keybindingReso
1818
import { IKeybindingEvent, KeybindingSource, IKeyboardEvent } from 'vs/platform/keybinding/common/keybinding';
1919
import { ContextKeyExpr, IContextKeyService } from 'vs/platform/contextkey/common/contextkey';
2020
import { IConfirmation, IMessageService } from 'vs/platform/message/common/message';
21-
import { IWorkspaceContextService, IWorkspace, WorkbenchState, IWorkspaceFolder, IWorkspaceFoldersChangeEvent } from 'vs/platform/workspace/common/workspace';
21+
import { IWorkspaceContextService, IWorkspace, WorkbenchState, IWorkspaceFolder, IWorkspaceFoldersChangeEvent, WorkspaceFolder } from 'vs/platform/workspace/common/workspace';
2222
import * as editorCommon from 'vs/editor/common/editorCommon';
2323
import { ICodeEditor, IDiffEditor } from 'vs/editor/browser/editorBrowser';
2424
import { Selection } from 'vs/editor/common/core/selection';
@@ -535,7 +535,7 @@ export class SimpleWorkspaceContextService implements IWorkspaceContextService {
535535

536536
constructor() {
537537
const resource = URI.from({ scheme: SimpleWorkspaceContextService.SCHEME, authority: 'model', path: '/' });
538-
this.workspace = { id: '4064f6ec-cb38-4ad0-af64-ee6467e63c82', folders: [{ uri: resource, raw: { path: resource.toString() }, name: '', index: 0, }], name: resource.fsPath };
538+
this.workspace = { id: '4064f6ec-cb38-4ad0-af64-ee6467e63c82', folders: [new WorkspaceFolder({ uri: resource, name: '', index: 0 })], name: resource.fsPath };
539539
}
540540

541541
public getWorkspace(): IWorkspace {

src/vs/platform/workspace/common/workspace.ts

Lines changed: 39 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -75,11 +75,6 @@ export interface IWorkspaceContextService {
7575
* Returns if the provided resource is inside the workspace or not.
7676
*/
7777
isInsideWorkspace(resource: URI): boolean;
78-
79-
/**
80-
* Given a workspace relative path and workspace folder, returns the resource with the absolute path.
81-
*/
82-
toResource: (workspaceRelativePath: string, workspaceFolder: IWorkspaceFolder) => URI;
8378
}
8479

8580
export interface IWorkspace {
@@ -105,8 +100,7 @@ export interface IWorkspace {
105100
readonly configuration?: URI;
106101
}
107102

108-
export interface IWorkspaceFolder {
109-
103+
export interface IWorkspaceFolderData {
110104
/**
111105
* The associated URI for this workspace folder.
112106
*/
@@ -122,22 +116,25 @@ export interface IWorkspaceFolder {
122116
* The ordinal number of this workspace folder.
123117
*/
124118
readonly index: number;
119+
}
120+
121+
export interface IWorkspaceFolder extends IWorkspaceFolderData {
125122

126123
/**
127-
* The raw path of this workspace folder
124+
* Given workspace folder relative path, returns the resource with the absolute path.
128125
*/
129-
readonly raw: IStoredWorkspaceFolder;
126+
toResource: (relativePath: string) => URI;
130127
}
131128

132129
export class Workspace implements IWorkspace {
133130

134-
private _foldersMap: TrieMap<IWorkspaceFolder> = new TrieMap<IWorkspaceFolder>();
135-
private _folders: IWorkspaceFolder[];
131+
private _foldersMap: TrieMap<WorkspaceFolder> = new TrieMap<WorkspaceFolder>();
132+
private _folders: WorkspaceFolder[];
136133

137134
constructor(
138135
private _id: string,
139136
private _name: string = '',
140-
folders: IWorkspaceFolder[] = [],
137+
folders: WorkspaceFolder[] = [],
141138
private _configuration: URI = null,
142139
private _ctime?: number
143140
) {
@@ -152,11 +149,11 @@ export class Workspace implements IWorkspace {
152149
this.folders = workspace.folders;
153150
}
154151

155-
public get folders(): IWorkspaceFolder[] {
152+
public get folders(): WorkspaceFolder[] {
156153
return this._folders;
157154
}
158155

159-
public set folders(folders: IWorkspaceFolder[]) {
156+
public set folders(folders: WorkspaceFolder[]) {
160157
this._folders = folders;
161158
this.updateFoldersMap();
162159
}
@@ -194,7 +191,7 @@ export class Workspace implements IWorkspace {
194191
}
195192

196193
private updateFoldersMap(): void {
197-
this._foldersMap = new TrieMap<IWorkspaceFolder>();
194+
this._foldersMap = new TrieMap<WorkspaceFolder>();
198195
for (const folder of this.folders) {
199196
this._foldersMap.insert(folder.uri.toString(), folder);
200197
}
@@ -205,19 +202,41 @@ export class Workspace implements IWorkspace {
205202
}
206203
}
207204

208-
export function toWorkspaceFolders(configuredFolders: IStoredWorkspaceFolder[], relativeTo?: URI): IWorkspaceFolder[] {
205+
export class WorkspaceFolder implements IWorkspaceFolder {
206+
207+
readonly uri: URI;
208+
readonly name: string;
209+
readonly index: number;
210+
211+
constructor(data: IWorkspaceFolderData,
212+
readonly raw?: IStoredWorkspaceFolder) {
213+
this.uri = data.uri;
214+
this.index = data.index;
215+
this.name = data.name;
216+
}
217+
218+
toResource(relativePath: string): URI {
219+
return URI.file(paths.join(this.uri.fsPath, relativePath));
220+
}
221+
222+
public toJSON(): IWorkspaceFolderData {
223+
return { uri: this.uri, name: this.name, index: this.index };
224+
}
225+
}
226+
227+
export function toWorkspaceFolders(configuredFolders: IStoredWorkspaceFolder[], relativeTo?: URI): WorkspaceFolder[] {
209228
let workspaceFolders = parseWorkspaceFolders(configuredFolders, relativeTo);
210229
return ensureUnique(coalesce(workspaceFolders))
211-
.map(({ uri, raw, name }, index) => ({ uri, raw, name: name || paths.basename(uri.fsPath), index }));
230+
.map(({ uri, raw, name }, index) => new WorkspaceFolder({ uri, name: name || paths.basename(uri.fsPath), index }, raw));
212231
}
213232

214-
function parseWorkspaceFolders(configuredFolders: IStoredWorkspaceFolder[], relativeTo: URI): IWorkspaceFolder[] {
233+
function parseWorkspaceFolders(configuredFolders: IStoredWorkspaceFolder[], relativeTo: URI): WorkspaceFolder[] {
215234
return configuredFolders.map((configuredFolder, index) => {
216235
const uri = toUri(configuredFolder.path, relativeTo);
217236
if (!uri) {
218237
return void 0;
219238
}
220-
return { uri, raw: configuredFolder, index, name: configuredFolder.name };
239+
return new WorkspaceFolder({ uri, name: configuredFolder.name, index }, configuredFolder);
221240
});
222241
}
223242

@@ -233,6 +252,6 @@ function toUri(path: string, relativeTo: URI): URI {
233252
return null;
234253
}
235254

236-
function ensureUnique(folders: IWorkspaceFolder[]): IWorkspaceFolder[] {
255+
function ensureUnique(folders: WorkspaceFolder[]): WorkspaceFolder[] {
237256
return distinct(folders, folder => isLinux ? folder.uri.fsPath : folder.uri.fsPath.toLowerCase());
238257
}

src/vs/platform/workspace/test/common/workspace.test.ts

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,40 +6,40 @@
66
'use strict';
77

88
import * as assert from 'assert';
9-
import { Workspace, IWorkspaceFolder, toWorkspaceFolders } from 'vs/platform/workspace/common/workspace';
9+
import { Workspace, toWorkspaceFolders, WorkspaceFolder } from 'vs/platform/workspace/common/workspace';
1010
import URI from 'vs/base/common/uri';
1111

1212
suite('Workspace', () => {
1313

1414
test('getFolder returns the folder with given uri', () => {
15-
const expected = aWorkspaceFolder(URI.file('/src/test'));
16-
let testObject = new Workspace('', '', [aWorkspaceFolder(URI.file('/src/main')), expected, aWorkspaceFolder(URI.file('/src/code'))]);
15+
const expected = new WorkspaceFolder({ uri: URI.file('/src/test'), name: '', index: 2 });
16+
let testObject = new Workspace('', '', [new WorkspaceFolder({ uri: URI.file('/src/main'), name: '', index: 0 }), expected, new WorkspaceFolder({ uri: URI.file('/src/code'), name: '', index: 2 })]);
1717

1818
const actual = testObject.getFolder(expected.uri);
1919

2020
assert.equal(actual, expected);
2121
});
2222

2323
test('getFolder returns the folder if the uri is sub', () => {
24-
const expected = aWorkspaceFolder(URI.file('/src/test'));
25-
let testObject = new Workspace('', '', [expected, aWorkspaceFolder(URI.file('/src/main')), aWorkspaceFolder(URI.file('/src/code'))]);
24+
const expected = new WorkspaceFolder({ uri: URI.file('/src/test'), name: '', index: 0 });
25+
let testObject = new Workspace('', '', [expected, new WorkspaceFolder({ uri: URI.file('/src/main'), name: '', index: 1 }), new WorkspaceFolder({ uri: URI.file('/src/code'), name: '', index: 2 })]);
2626

2727
const actual = testObject.getFolder(URI.file('/src/test/a'));
2828

2929
assert.equal(actual, expected);
3030
});
3131

3232
test('getFolder returns the closest folder if the uri is sub', () => {
33-
const expected = aWorkspaceFolder(URI.file('/src/test'));
34-
let testObject = new Workspace('', '', [aWorkspaceFolder(URI.file('/src/code')), aWorkspaceFolder(URI.file('/src')), expected]);
33+
const expected = new WorkspaceFolder({ uri: URI.file('/src/test'), name: '', index: 2 });
34+
let testObject = new Workspace('', '', [new WorkspaceFolder({ uri: URI.file('/src/main'), name: '', index: 0 }), new WorkspaceFolder({ uri: URI.file('/src/code'), name: '', index: 1 }), expected]);
3535

3636
const actual = testObject.getFolder(URI.file('/src/test/a'));
3737

3838
assert.equal(actual, expected);
3939
});
4040

4141
test('getFolder returns null if the uri is not sub', () => {
42-
let testObject = new Workspace('', '', [aWorkspaceFolder(URI.file('/src/code')), aWorkspaceFolder(URI.file('/src/test'))]);
42+
let testObject = new Workspace('', '', [new WorkspaceFolder({ uri: URI.file('/src/test'), name: '', index: 0 }), new WorkspaceFolder({ uri: URI.file('/src/code'), name: '', index: 1 })]);
4343

4444
const actual = testObject.getFolder(URI.file('/src/main/a'));
4545

@@ -190,11 +190,4 @@ suite('Workspace', () => {
190190
assert.equal(actual[2].index, 2);
191191
assert.equal(actual[2].name, 'test1');
192192
});
193-
194-
function aWorkspaceFolder(uri: URI, index: number = 0): IWorkspaceFolder {
195-
return {
196-
uri, raw: { path: uri.fsPath }, index, name: ''
197-
};
198-
}
199-
200193
});

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ import { ITreeItem } from 'vs/workbench/common/views';
4747
import { ThemeColor } from 'vs/platform/theme/common/themeService';
4848
import { IDisposable } from 'vs/base/common/lifecycle';
4949
import { SerializedError } from 'vs/base/common/errors';
50-
import { IWorkspaceFolder } from 'vs/platform/workspace/common/workspace';
50+
import { IWorkspaceFolderData } from 'vs/platform/workspace/common/workspace';
5151
import { IStat, IFileChange } from 'vs/platform/files/common/files';
5252

5353
export interface IEnvironment {
@@ -65,7 +65,7 @@ export interface IEnvironment {
6565
export interface IWorkspaceData {
6666
id: string;
6767
name: string;
68-
folders: IWorkspaceFolder[];
68+
folders: IWorkspaceFolderData[];
6969
}
7070

7171
export interface IInitData {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import Event, { Emitter } from 'vs/base/common/event';
99
import { normalize } from 'vs/base/common/paths';
1010
import { delta } from 'vs/base/common/arrays';
1111
import { relative } from 'path';
12-
import { Workspace } from 'vs/platform/workspace/common/workspace';
12+
import { Workspace, WorkspaceFolder } from 'vs/platform/workspace/common/workspace';
1313
import { IWorkspaceData, ExtHostWorkspaceShape, MainContext, MainThreadWorkspaceShape, IMainContext } from './extHost.protocol';
1414
import * as vscode from 'vscode';
1515
import { compare } from 'vs/base/common/strings';
@@ -25,7 +25,7 @@ class Workspace2 extends Workspace {
2525
private readonly _structure = new TrieMap<vscode.WorkspaceFolder>(s => s.split('/'));
2626

2727
private constructor(data: IWorkspaceData) {
28-
super(data.id, data.name, data.folders);
28+
super(data.id, data.name, data.folders.map(folder => new WorkspaceFolder(folder)));
2929

3030
// setup the workspace folder data structure
3131
this.folders.forEach(({ name, uri, index }) => {

src/vs/workbench/parts/debug/browser/linkDetector.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ export class LinkDetector {
5050
if (workspaceFolder) {
5151
try {
5252
resource = (match && !strings.startsWith(match[0], 'http'))
53-
&& (match[2] || strings.startsWith(match[1], '/') ? uri.file(match[1]) : this.contextService.toResource(match[1], workspaceFolder)); // TODO@Michel TODO@Isidor (https://github.com/Microsoft/vscode/issues/29190)
53+
&& (match[2] || strings.startsWith(match[1], '/') ? uri.file(match[1]) : workspaceFolder.toResource(match[1])); // TODO@Michel TODO@Isidor (https://github.com/Microsoft/vscode/issues/29190)
5454
} catch (e) { }
5555
}
5656

src/vs/workbench/parts/extensions/browser/extensionsActions.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1370,7 +1370,7 @@ export class ConfigureWorkspaceRecommendedExtensionsAction extends AbstractConfi
13701370
public run(event: any): TPromise<any> {
13711371
switch (this.contextService.getWorkbenchState()) {
13721372
case WorkbenchState.FOLDER:
1373-
return this.openExtensionsFile(this.contextService.toResource(paths.join('.vscode', 'extensions.json'), this.contextService.getWorkspace().folders[0]));
1373+
return this.openExtensionsFile(this.contextService.getWorkspace().folders[0].toResource(paths.join('.vscode', 'extensions.json')));
13741374
case WorkbenchState.WORKSPACE:
13751375
return this.openWorkspaceConfigurationFile(this.contextService.getWorkspace().configuration);
13761376
}
@@ -1413,7 +1413,7 @@ export class ConfigureWorkspaceFolderRecommendedExtensionsAction extends Abstrac
14131413
return this.commandService.executeCommand<IWorkspaceFolder>(PICK_WORKSPACE_FOLDER_COMMAND)
14141414
.then(workspaceFolder => {
14151415
if (workspaceFolder) {
1416-
return this.openExtensionsFile(this.contextService.toResource(paths.join('.vscode', 'extensions.json'), workspaceFolder));
1416+
return this.openExtensionsFile(workspaceFolder.toResource(paths.join('.vscode', 'extensions.json')));
14171417
}
14181418
return null;
14191419
});

src/vs/workbench/parts/extensions/electron-browser/extensionTipsService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ export class ExtensionTipsService implements IExtensionTipsService {
8585
}
8686

8787
private resolveWorkspaceFolderRecommendations(workspaceFolder: IWorkspaceFolder): TPromise<string[]> {
88-
return this.fileService.resolveContent(this.contextService.toResource(paths.join('.vscode', 'extensions.json'), workspaceFolder))
88+
return this.fileService.resolveContent(workspaceFolder.toResource(paths.join('.vscode', 'extensions.json')))
8989
.then(content => this.processWorkspaceRecommendations(json.parse(content.value, [])), err => []);
9090
}
9191

src/vs/workbench/parts/preferences/browser/preferencesService.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -320,10 +320,10 @@ export class PreferencesService extends Disposable implements IPreferencesServic
320320
return null;
321321
}
322322
const workspace = this.contextService.getWorkspace();
323-
return workspace.configuration || this.contextService.toResource(paths.join('.vscode', 'settings.json'), workspace.folders[0]);
323+
return workspace.configuration || workspace.folders[0].toResource(paths.join('.vscode', 'settings.json'));
324324
case ConfigurationTarget.FOLDER:
325325
const folder = this.contextService.getWorkspaceFolder(resource);
326-
return folder ? this.contextService.toResource(paths.join('.vscode', 'settings.json'), folder) : null;
326+
return folder ? folder.toResource(paths.join('.vscode', 'settings.json')) : null;
327327
}
328328
return null;
329329
}

src/vs/workbench/parts/tasks/electron-browser/task.contribution.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ abstract class OpenTaskConfigurationAction extends Action {
118118
}
119119
let sideBySide = !!(event && (event.ctrlKey || event.metaKey));
120120
let configFileCreated = false;
121-
return this.fileService.resolveFile(this.contextService.toResource('.vscode/tasks.json', this.contextService.getWorkspace().folders[0])).then((success) => { // TODO@Dirk (https://github.com/Microsoft/vscode/issues/29454)
121+
return this.fileService.resolveFile(this.contextService.getWorkspace().folders[0].toResource('.vscode/tasks.json')).then((success) => { // TODO@Dirk (https://github.com/Microsoft/vscode/issues/29454)
122122

123123
return success;
124124
}, (err: any) => {
@@ -169,7 +169,7 @@ abstract class OpenTaskConfigurationAction extends Action {
169169
content = content.replace(/(\n)(\t+)/g, (_, s1, s2) => s1 + strings.repeat(' ', s2.length * editorConfig.editor.tabSize));
170170
}
171171
configFileCreated = true;
172-
return this.fileService.createFile(this.contextService.toResource('.vscode/tasks.json', this.contextService.getWorkspace().folders[0]), content).then((result) => {
172+
return this.fileService.createFile(this.contextService.getWorkspace().folders[0].toResource('.vscode/tasks.json'), content).then((result) => {
173173
this.telemetryService.publicLog(TaskService.TemplateTelemetryEventName, {
174174
templateId: selection.id,
175175
autoDetect: selection.autoDetect
@@ -1166,7 +1166,7 @@ class TaskService extends EventEmitter implements ITaskService {
11661166
if (editorConfig.editor.insertSpaces) {
11671167
content = content.replace(/(\n)(\t+)/g, (_, s1, s2) => s1 + strings.repeat(' ', s2.length * editorConfig.editor.tabSize));
11681168
}
1169-
promise = this.fileService.createFile(this.contextService.toResource('.vscode/tasks.json', workspaceFolder), content).then(() => { });
1169+
promise = this.fileService.createFile(workspaceFolder.toResource('.vscode/tasks.json'), content).then(() => { });
11701170
} else {
11711171
let value: IConfigurationValue = { key: undefined, value: undefined };
11721172
// We have a global task configuration
@@ -1205,7 +1205,7 @@ class TaskService extends EventEmitter implements ITaskService {
12051205
};
12061206
this.telemetryService.publicLog(TaskService.CustomizationTelemetryEventName, event);
12071207
if (openConfig) {
1208-
let resource = this.contextService.toResource('.vscode/tasks.json', workspaceFolder);
1208+
let resource = workspaceFolder.toResource('.vscode/tasks.json');
12091209
this.editorService.openEditor({
12101210
resource: resource,
12111211
options: {
@@ -1228,7 +1228,7 @@ class TaskService extends EventEmitter implements ITaskService {
12281228
}
12291229

12301230
public openConfig(task: CustomTask): TPromise<void> {
1231-
let resource = this.contextService.toResource(task._source.config.file, Task.getWorkspaceFolder(task));
1231+
let resource = Task.getWorkspaceFolder(task).toResource(task._source.config.file);
12321232
return this.editorService.openEditor({
12331233
resource: resource,
12341234
options: {

0 commit comments

Comments
 (0)