99using System . Text . Json ;
1010using System . Text . RegularExpressions ;
1111using Flow . Plugin . VSCodeWorkspaces . VSCodeHelper ;
12+ using JetBrains . Annotations ;
1213using Microsoft . Data . Sqlite ;
1314
1415namespace Flow . Plugin . VSCodeWorkspaces . WorkspacesHelper
@@ -19,45 +20,43 @@ public VSCodeWorkspacesApi()
1920 {
2021 }
2122
22- public static VSCodeWorkspace ParseVSCodeUri ( string uri , VSCodeInstance vscodeInstance )
23+ public static VsCodeWorkspace ParseVSCodeUri ( string uri , VSCodeInstance vscodeInstance )
2324 {
24- if ( uri != null && uri is string )
25+ if ( uri is not null )
2526 {
26- string unescapeUri = Uri . UnescapeDataString ( uri ) ;
27+ var unescapeUri = Uri . UnescapeDataString ( uri ) ;
2728 var typeWorkspace = WorkspacesHelper . ParseVSCodeUri . GetTypeWorkspace ( unescapeUri ) ;
28- if ( typeWorkspace . TypeWorkspace . HasValue )
29- {
30- var folderName = Path . GetFileName ( unescapeUri ) ;
29+ if ( ! typeWorkspace . workspaceLocation . HasValue ) return null ;
30+ var folderName = Path . GetFileName ( unescapeUri ) ;
3131
32- // Check we haven't returned '' if we have a path like C:\
33- if ( string . IsNullOrEmpty ( folderName ) )
34- {
35- DirectoryInfo dirInfo = new DirectoryInfo ( unescapeUri ) ;
36- folderName = dirInfo . Name . TrimEnd ( ':' ) ;
37- }
38-
39- return new VSCodeWorkspace ( )
40- {
41- Path = unescapeUri ,
42- RelativePath = typeWorkspace . Path ,
43- FolderName = folderName ,
44- ExtraInfo = typeWorkspace . MachineName ,
45- TypeWorkspace = typeWorkspace . TypeWorkspace . Value ,
46- VSCodeInstance = vscodeInstance ,
47- } ;
32+ // Check we haven't returned '' if we have a path like C:\
33+ if ( string . IsNullOrEmpty ( folderName ) )
34+ {
35+ DirectoryInfo dirInfo = new DirectoryInfo ( unescapeUri ) ;
36+ folderName = dirInfo . Name . TrimEnd ( ':' ) ;
4837 }
38+
39+ return new VsCodeWorkspace ( )
40+ {
41+ Path = unescapeUri ,
42+ RelativePath = typeWorkspace . Path ,
43+ FolderName = folderName ,
44+ ExtraInfo = typeWorkspace . MachineName ,
45+ WorkspaceLocation = typeWorkspace . workspaceLocation . Value ,
46+ VSCodeInstance = vscodeInstance ,
47+ } ;
4948 }
5049
5150 return null ;
5251 }
5352
54- public Regex workspaceLabelParser = new Regex ( "(.+?)(\\ [.+\\ ])" ) ;
53+ public readonly Regex WorkspaceLabelParser = new Regex ( "(.+?)(\\ [.+\\ ])" ) ;
5554
56- public List < VSCodeWorkspace > Workspaces
55+ public List < VsCodeWorkspace > Workspaces
5756 {
5857 get
5958 {
60- var results = new List < VSCodeWorkspace > ( ) ;
59+ var results = new List < VsCodeWorkspace > ( ) ;
6160
6261 foreach ( var vscodeInstance in VSCodeInstances . Instances )
6362 {
@@ -81,7 +80,7 @@ public List<VSCodeWorkspace> Workspaces
8180 vscodeStorageFile . OpenedPathsList . Workspaces3
8281 . Select ( workspaceUri => ParseVSCodeUri ( workspaceUri , vscodeInstance ) )
8382 . Where ( uri => uri != null )
84- . Select ( uri => ( VSCodeWorkspace ) uri ) ) ;
83+ . Select ( uri => ( VsCodeWorkspace ) uri ) ) ;
8584 }
8685
8786 // vscode v1.55.0 or later
@@ -116,29 +115,73 @@ public List<VSCodeWorkspace> Workspaces
116115 continue ;
117116 foreach ( var entry in entries . EnumerateArray ( ) )
118117 {
119- if ( ! entry . TryGetProperty ( "folderUri" , out var folderUri ) )
120- continue ;
121- var workspaceUri = folderUri . GetString ( ) ;
122- var workspace = ParseVSCodeUri ( workspaceUri , vscodeInstance ) ;
123- if ( workspace == null )
124- continue ;
125-
126- if ( entry . TryGetProperty ( "label" , out var label ) )
118+ if ( entry . TryGetProperty ( "folderUri" , out var folderUri ) &&
119+ ParseFolderEntry ( folderUri , vscodeInstance , entry ) is { } folderWorkspace )
127120 {
128- var labelString = label . GetString ( ) ! ;
129- var matchGroup = workspaceLabelParser . Match ( labelString ) ;
130- workspace = workspace with {
131- Lable = $ "{ matchGroup . Groups [ 2 ] } { matchGroup . Groups [ 1 ] } "
132- } ;
121+ results . Add ( folderWorkspace ) ;
122+ }
123+ else if ( entry . TryGetProperty ( "workspace" , out var workspaceInfo ) &&
124+ ParseWorkspaceEntry ( workspaceInfo , vscodeInstance , entry ) is { } workspace )
125+ {
126+ results . Add ( workspace ) ;
133127 }
134-
135- results . Add ( workspace ) ;
136128 }
137129 }
138130 }
139131
140132 return results ;
141133 }
142134 }
135+
136+ [ CanBeNull ]
137+ private VsCodeWorkspace ParseWorkspaceEntry ( JsonElement workspaceInfo , VSCodeInstance vscodeInstance ,
138+ JsonElement entry )
139+ {
140+ if ( workspaceInfo . TryGetProperty ( "configPath" , out var configPath ) )
141+ {
142+ var workspace = ParseVSCodeUri ( configPath . GetString ( ) , vscodeInstance ) ;
143+ if ( workspace == null )
144+ return null ;
145+
146+ if ( entry . TryGetProperty ( "label" , out var label ) )
147+ {
148+ var labelString = label . GetString ( ) ! ;
149+ var matchGroup = WorkspaceLabelParser . Match ( labelString ) ;
150+ workspace = workspace with
151+ {
152+ Lable = $ "{ matchGroup . Groups [ 2 ] } { matchGroup . Groups [ 1 ] } ",
153+ WorkspaceType = WorkspaceType . Workspace
154+ } ;
155+ }
156+
157+ return workspace ;
158+ }
159+
160+ return null ;
161+ }
162+
163+
164+ [ CanBeNull ]
165+ private VsCodeWorkspace ParseFolderEntry ( JsonElement folderUri , VSCodeInstance vscodeInstance ,
166+ JsonElement entry )
167+ {
168+ var workspaceUri = folderUri . GetString ( ) ;
169+ var workspace = ParseVSCodeUri ( workspaceUri , vscodeInstance ) ;
170+ if ( workspace == null )
171+ return null ;
172+
173+ if ( entry . TryGetProperty ( "label" , out var label ) )
174+ {
175+ var labelString = label . GetString ( ) ! ;
176+ var matchGroup = WorkspaceLabelParser . Match ( labelString ) ;
177+ workspace = workspace with
178+ {
179+ Lable = $ "{ matchGroup . Groups [ 2 ] } { matchGroup . Groups [ 1 ] } ",
180+ WorkspaceType = WorkspaceType . Workspace
181+ } ;
182+ }
183+
184+ return workspace ;
185+ }
143186 }
144187}
0 commit comments