1- import  {  writeFileSync  }  from  'fs' ; 
1+ import  { 
2+ 	existsSync , 
3+ 	mkdirSync , 
4+ 	readdirSync , 
5+ 	rmSync , 
6+ 	statSync , 
7+ 	symlinkSync , 
8+ 	writeFileSync , 
9+ }  from  'fs' ; 
10+ import  {  homedir  }  from  'os' ; 
11+ import  {  sep  }  from  'path' ; 
212import  { 
313	commands , 
414	ConfigurationTarget , 
@@ -15,8 +25,9 @@ import { getVscodeConfig, getWorkspaceRoot } from './util';
1525export  namespace  ProjectViewManager  { 
1626	const  workspaceRoot  =  getWorkspaceRoot ( ) ; 
1727	const  workspaceRootName  =  workspaceRoot . split ( '/' ) . reverse ( ) [ 0 ] ; 
28+ 	const  projectRootSymlinks  =  `${ homedir } ${ sep } ${ workspaceRootName }  ` ; 
1829
19- 	function  isMultiRoot ( ) : boolean  { 
30+ 	export   function  isMultiRoot ( ) : boolean  { 
2031		return  ! ! workspace . workspaceFile ; 
2132	} 
2233
@@ -42,7 +53,7 @@ export namespace ProjectViewManager {
4253						} ; 
4354						writeFileSync ( 
4455							`${ workspaceRoot }  /workspace.code-workspace` , 
45- 							Buffer . from ( JSON . stringify ( workspaceFile ,  null ,  2 ) ) 
56+ 							JSON . stringify ( workspaceFile ,  null ,  2 ) 
4657						) ; 
4758
4859						// cleanup all old single root workspace files 
@@ -83,7 +94,8 @@ export namespace ProjectViewManager {
8394	async  function  getDisplayFolders ( ) : Promise < string [ ] >  { 
8495		let  displayFolders  =  new  Set < string > ( [ '.eclipse' ] ) ;  // TODO bubble this out to a setting 
8596		if  ( isMultiRoot ( ) )  { 
86- 			displayFolders . add ( '.' ) ; 
97+ 			syncWorkspaceRoot ( ) ; 
98+ 			displayFolders . add ( projectRootSymlinks ) ; 
8799		} 
88100		try  { 
89101			const  bazelProjectFile  =  await  getBazelProjectFile ( ) ; 
@@ -141,18 +153,17 @@ export namespace ProjectViewManager {
141153			0 , 
142154			workspace . workspaceFolders ?. length , 
143155			...displayFolders . map ( ( f )  =>  { 
144- 				const  moduleUri  =  Uri . file ( `${ workspaceRoot }  /${ f }  ` ) ; 
145- 				let  moduleName  =  f ; 
146- 				if  ( moduleName  ===  '.' )  { 
147- 					moduleName  =  workspaceRootName ; 
148- 				} 
149- 				if  ( f . includes ( '/' ) )  { 
150- 					moduleName  =  f . replaceAll ( '/' ,  ' ⇾ ' ) ; 
156+ 				if  ( f  ===  projectRootSymlinks )  { 
157+ 					return  { 
158+ 						uri : Uri . file ( projectRootSymlinks ) , 
159+ 						name : workspaceRootName , 
160+ 					} ; 
161+ 				}  else  { 
162+ 					return  { 
163+ 						uri : Uri . file ( `${ workspaceRoot }  /${ f }  ` ) , 
164+ 						name : f . replaceAll ( sep ,  ' ⇾ ' ) , 
165+ 					} ; 
151166				} 
152- 				return  { 
153- 					uri : moduleUri , 
154- 					name : moduleName , 
155- 				} ; 
156167			} ) 
157168		) ; 
158169		return  Promise . resolve ( displayFolders ) ; 
@@ -176,7 +187,12 @@ export namespace ProjectViewManager {
176187
177188		const  fileWatcherExcludePattern  =  viewAll 
178189			? '' 
179- 			: `**/!(${ Array . from ( displayFolders . filter ( ( s )  =>  s  !==  '.' ) . sort ( ) ) . join ( '|' ) }  )/**` ; 
190+ 			: `**/!(${ Array . from (  
191+ 					displayFolders  
192+ 						. filter ( ( e )  =>  e  !==  '' )  
193+ 						. filter ( ( s )  =>  s  !==  '.' )  
194+ 						. sort ( )  
195+ 				) . join ( '|' ) }  )/**`; 
180196
181197		if  ( viewAll )  { 
182198			// if viewAll and existing config doesn't contain .eclipse return 
@@ -242,4 +258,24 @@ export namespace ProjectViewManager {
242258	function  rootDirOnly ( dirs : string [ ] ) : string [ ]  { 
243259		return  dirs . map ( ( d )  =>  d . split ( '/' ) [ 0 ] ) ; 
244260	} 
261+ 
262+ 	export  function  syncWorkspaceRoot ( )  { 
263+ 		if  ( existsSync ( projectRootSymlinks ) )  { 
264+ 			rmSync ( projectRootSymlinks ,  {  recursive : true  } ) ;  // delete 
265+ 		} 
266+ 
267+ 		mkdirSync ( projectRootSymlinks ) ; 
268+ 
269+ 		readdirSync ( workspaceRoot ) . forEach ( ( f )  =>  { 
270+ 			const  fpath  =  `${ workspaceRoot } ${ sep } ${ f }  ` ; 
271+ 			if  ( existsSync ( fpath ) )  { 
272+ 				const  stats  =  statSync ( fpath ) ; 
273+ 				if  ( stats . isFile ( ) )  { 
274+ 					symlinkSync ( fpath ,  `${ projectRootSymlinks } ${ sep } ${ f }  ` ) ; 
275+ 				} 
276+ 			} 
277+ 		} ) ; 
278+ 
279+ 		commands . executeCommand ( 'workbench.files.action.refreshFilesExplorer' ) ; 
280+ 	} 
245281} 
0 commit comments