@@ -28,8 +28,11 @@ import { checkForRls, ensureToolchain, rustupUpdate } from './rustup';
28
28
import { startSpinner , stopSpinner } from './spinner' ;
29
29
import { activateTaskProvider , Execution , runRlsCommand } from './tasks' ;
30
30
import { withWsl } from './utils/child_process' ;
31
+ import {
32
+ getOuterMostWorkspaceFolder ,
33
+ nearestParentWorkspace ,
34
+ } from './utils/workspace' ;
31
35
import { uriWindowsToWsl , uriWslToWindows } from './utils/wslpath' ;
32
- import * as workspace_util from './workspace_util' ;
33
36
34
37
/**
35
38
* Parameter type to `window/progress` request as issued by the RLS.
@@ -82,7 +85,7 @@ function whenOpeningTextDocument(document: TextDocument) {
82
85
. get < boolean > ( 'rust-client.nestedMultiRootConfigInOutermost' , true ) ;
83
86
84
87
if ( inMultiProjectMode ) {
85
- folder = workspace_util . nearestParentWorkspace ( folder , document . uri . fsPath ) ;
88
+ folder = nearestParentWorkspace ( folder , document . uri . fsPath ) ;
86
89
} else if ( inNestedOuterProjectMode ) {
87
90
folder = getOuterMostWorkspaceFolder ( folder ) ;
88
91
}
@@ -105,50 +108,11 @@ function whenOpeningTextDocument(document: TextDocument) {
105
108
}
106
109
}
107
110
108
- // This is an intermediate, lazy cache used by `getOuterMostWorkspaceFolder`
109
- // and cleared when VSCode workspaces change.
110
- let _sortedWorkspaceFolders : string [ ] | undefined ;
111
-
112
- function sortedWorkspaceFolders ( ) : string [ ] {
113
- // TODO: decouple the global state such that it can be moved to workspace_util
114
- if ( ! _sortedWorkspaceFolders && workspace . workspaceFolders ) {
115
- _sortedWorkspaceFolders = workspace . workspaceFolders
116
- . map ( folder => {
117
- let result = folder . uri . toString ( ) ;
118
- if ( result . charAt ( result . length - 1 ) !== '/' ) {
119
- result = result + '/' ;
120
- }
121
- return result ;
122
- } )
123
- . sort ( ( a , b ) => {
124
- return a . length - b . length ;
125
- } ) ;
126
- }
127
- return _sortedWorkspaceFolders || [ ] ;
128
- }
129
-
130
- function getOuterMostWorkspaceFolder ( folder : WorkspaceFolder ) : WorkspaceFolder {
131
- // TODO: decouple the global state such that it can be moved to workspace_util
132
- const sorted = sortedWorkspaceFolders ( ) ;
133
- for ( const element of sorted ) {
134
- let uri = folder . uri . toString ( ) ;
135
- if ( uri . charAt ( uri . length - 1 ) !== '/' ) {
136
- uri = uri + '/' ;
137
- }
138
- if ( uri . startsWith ( element ) ) {
139
- return workspace . getWorkspaceFolder ( Uri . parse ( element ) ) || folder ;
140
- }
141
- }
142
- return folder ;
143
- }
144
-
145
111
function whenChangingWorkspaceFolders ( e : WorkspaceFoldersChangeEvent ) {
146
- _sortedWorkspaceFolders = undefined ;
147
-
148
112
// If a VSCode workspace has been added, check to see if it is part of an existing one, and
149
113
// if not, and it is a Rust project (i.e., has a Cargo.toml), then create a new client.
150
114
for ( let folder of e . added ) {
151
- folder = getOuterMostWorkspaceFolder ( folder ) ;
115
+ folder = getOuterMostWorkspaceFolder ( folder , { cached : false } ) ;
152
116
if ( workspaces . has ( folder . uri . toString ( ) ) ) {
153
117
continue ;
154
118
}
0 commit comments