55'use strict' ;
66
77import URI from 'vs/base/common/uri' ;
8+ import * as paths from 'vs/base/common/paths' ;
89import { createDecorator } from 'vs/platform/instantiation/common/instantiation' ;
910import { TrieMap } from 'vs/base/common/map' ;
1011import Event from 'vs/base/common/event' ;
12+ import { ISingleFolderWorkspaceIdentifier , IWorkspaceIdentifier , IStoredWorkspaceFolder } from 'vs/platform/workspaces/common/workspaces' ;
13+ import { coalesce , distinct } from 'vs/base/common/arrays' ;
1114import { isLinux } from 'vs/base/common/platform' ;
12- import { distinct } from 'vs/base/common/arrays' ;
13- import { ISingleFolderWorkspaceIdentifier , IWorkspaceIdentifier } from 'vs/platform/workspaces/common/workspaces' ;
1415
1516export const IWorkspaceContextService = createDecorator < IWorkspaceContextService > ( 'contextService' ) ;
1617
@@ -52,7 +53,7 @@ export interface IWorkspaceContextService {
5253 * Returns the folder for the given resource from the workspace.
5354 * Can be null if there is no workspace or the resource is not inside the workspace.
5455 */
55- getWorkspaceFolder ( resource : URI ) : URI ;
56+ getWorkspaceFolder ( resource : URI ) : WorkspaceFolder ;
5657
5758 /**
5859 * Return `true` if the current workspace has the given identifier otherwise `false`.
@@ -85,39 +86,59 @@ export interface IWorkspace {
8586 /**
8687 * Folders in the workspace.
8788 */
88- readonly folders : URI [ ] ;
89+ readonly folders : WorkspaceFolder [ ] ;
8990
9091 /**
9192 * the location of the workspace configuration
9293 */
9394 readonly configuration ?: URI ;
9495}
9596
97+ export interface WorkspaceFolder {
98+
99+ /**
100+ * The associated URI for this workspace folder.
101+ */
102+ readonly uri : URI ;
103+
104+ /**
105+ * The name of this workspace folder. Defaults to
106+ * the basename its [uri-path](#Uri.path)
107+ */
108+ readonly name : string ;
109+
110+ /**
111+ * The ordinal number of this workspace folder.
112+ */
113+ readonly index : number ;
114+
115+ /**
116+ * The raw path of this workspace folder
117+ */
118+ readonly raw : string ;
119+ }
120+
96121export class Workspace implements IWorkspace {
97122
98- private _foldersMap : TrieMap < URI > = new TrieMap < URI > ( ) ;
99- private _folders : URI [ ] ;
123+ private _foldersMap : TrieMap < WorkspaceFolder > = new TrieMap < WorkspaceFolder > ( ) ;
124+ private _folders : WorkspaceFolder [ ] ;
100125
101126 constructor (
102127 public readonly id : string ,
103128 private _name : string ,
104- folders : URI [ ] ,
129+ folders : WorkspaceFolder [ ] ,
105130 private _configuration : URI = null ,
106131 public readonly ctime ?: number
107132 ) {
108133 this . folders = folders ;
109134 }
110135
111- private ensureUnique ( folders : URI [ ] ) : URI [ ] {
112- return distinct ( folders , folder => isLinux ? folder . fsPath : folder . fsPath . toLowerCase ( ) ) ;
113- }
114-
115- public get folders ( ) : URI [ ] {
136+ public get folders ( ) : WorkspaceFolder [ ] {
116137 return this . _folders ;
117138 }
118139
119- public set folders ( folders : URI [ ] ) {
120- this . _folders = this . ensureUnique ( folders ) ;
140+ public set folders ( folders : WorkspaceFolder [ ] ) {
141+ this . _folders = folders ;
121142 this . updateFoldersMap ( ) ;
122143 }
123144
@@ -137,7 +158,7 @@ export class Workspace implements IWorkspace {
137158 this . _configuration = configuration ;
138159 }
139160
140- public getFolder ( resource : URI ) : URI {
161+ public getFolder ( resource : URI ) : WorkspaceFolder {
141162 if ( ! resource ) {
142163 return null ;
143164 }
@@ -146,13 +167,45 @@ export class Workspace implements IWorkspace {
146167 }
147168
148169 private updateFoldersMap ( ) : void {
149- this . _foldersMap = new TrieMap < URI > ( ) ;
170+ this . _foldersMap = new TrieMap < WorkspaceFolder > ( ) ;
150171 for ( const folder of this . folders ) {
151- this . _foldersMap . insert ( folder . fsPath , folder ) ;
172+ this . _foldersMap . insert ( folder . uri . fsPath , folder ) ;
152173 }
153174 }
154175
155176 public toJSON ( ) : IWorkspace {
156177 return { id : this . id , folders : this . folders , name : this . name } ;
157178 }
158179}
180+
181+ export function toWorkspaceFolders ( configuredFolders : IStoredWorkspaceFolder [ ] , relativeTo ?: URI ) : WorkspaceFolder [ ] {
182+ let workspaceFolders = parseWorkspaceFolders ( configuredFolders , relativeTo ) ;
183+ return ensureUnique ( coalesce ( workspaceFolders ) )
184+ . map ( ( { uri, raw, name } , index ) => ( { uri, raw, name : name || paths . basename ( uri . fsPath ) , index } ) ) ;
185+ }
186+
187+ function parseWorkspaceFolders ( configuredFolders : IStoredWorkspaceFolder [ ] , relativeTo : URI ) : WorkspaceFolder [ ] {
188+ return configuredFolders . map ( ( { path, name } , index ) => {
189+ const uri = toUri ( path , relativeTo ) ;
190+ if ( ! uri ) {
191+ return void 0 ;
192+ }
193+ return { uri, raw : path , index, name } ;
194+ } ) ;
195+ }
196+
197+ function toUri ( path : string , relativeTo : URI ) : URI {
198+ if ( path ) {
199+ if ( paths . isAbsolute ( path ) ) {
200+ return URI . file ( path ) ;
201+ }
202+ if ( relativeTo ) {
203+ return URI . file ( paths . join ( relativeTo . fsPath , path ) ) ;
204+ }
205+ }
206+ return null ;
207+ }
208+
209+ function ensureUnique ( folders : WorkspaceFolder [ ] ) : WorkspaceFolder [ ] {
210+ return distinct ( folders , folder => isLinux ? folder . uri . fsPath : folder . uri . fsPath . toLowerCase ( ) ) ;
211+ }
0 commit comments