@@ -46,43 +46,39 @@ export function nearestParentWorkspace(
46
46
}
47
47
48
48
// This is an intermediate, lazy cache used by `getOuterMostWorkspaceFolder`
49
- // and cleared when VSCode workspaces change.
50
- let _sortedWorkspaceFolders : string [ ] | undefined ;
51
-
52
- function sortedWorkspaceFolders ( ) : string [ ] {
53
- if ( ! _sortedWorkspaceFolders && workspace . workspaceFolders ) {
54
- _sortedWorkspaceFolders = workspace . workspaceFolders
55
- . map ( folder => {
56
- let result = folder . uri . toString ( ) ;
57
- if ( result . charAt ( result . length - 1 ) !== '/' ) {
58
- result = result + '/' ;
59
- }
60
- return result ;
61
- } )
62
- . sort ( ( a , b ) => {
63
- return a . length - b . length ;
64
- } ) ;
65
- }
66
- return _sortedWorkspaceFolders || [ ] ;
67
- }
49
+ // and should be regenerated when VSCode workspaces change.
50
+ let _cachedSortedWorkspaceFolders : string [ ] | undefined ;
68
51
69
52
export function getOuterMostWorkspaceFolder (
70
53
folder : WorkspaceFolder ,
71
54
options ?: { cached : boolean } ,
72
55
) : WorkspaceFolder {
73
- if ( ! options || ! options . cached ) {
74
- _sortedWorkspaceFolders = undefined ;
75
- }
56
+ const recalculate = ! options || ! options . cached ;
57
+ // Sort workspace folders or used already cached result, if possible
58
+ const sortedFolders =
59
+ ! recalculate && _cachedSortedWorkspaceFolders
60
+ ? _cachedSortedWorkspaceFolders
61
+ : ( workspace . workspaceFolders || [ ] )
62
+ . map ( folder => normalizeUriToPathPrefix ( folder . uri ) )
63
+ . sort ( ( a , b ) => a . length - b . length ) ;
64
+ _cachedSortedWorkspaceFolders = sortedFolders ;
76
65
77
- const sorted = sortedWorkspaceFolders ( ) ;
78
- for ( const element of sorted ) {
79
- let uri = folder . uri . toString ( ) ;
80
- if ( uri . charAt ( uri . length - 1 ) !== '/' ) {
81
- uri = uri + '/' ;
82
- }
83
- if ( uri . startsWith ( element ) ) {
84
- return workspace . getWorkspaceFolder ( Uri . parse ( element ) ) || folder ;
85
- }
66
+ const uri = normalizeUriToPathPrefix ( folder . uri ) ;
67
+
68
+ const outermostPath = sortedFolders . find ( prefix => uri . startsWith ( prefix ) ) ;
69
+ return outermostPath
70
+ ? workspace . getWorkspaceFolder ( Uri . parse ( outermostPath ) ) || folder
71
+ : folder ;
72
+ }
73
+
74
+ /**
75
+ * Transforms a given URI to a path prefix, namely ensures that each path
76
+ * segment ends with a path separator `/`.
77
+ */
78
+ function normalizeUriToPathPrefix ( uri : Uri ) : string {
79
+ let result = uri . toString ( ) ;
80
+ if ( result . charAt ( result . length - 1 ) !== '/' ) {
81
+ result = result + '/' ;
86
82
}
87
- return folder ;
83
+ return result ;
88
84
}
0 commit comments