@@ -58,6 +58,20 @@ class DidChangeEntry {
58
58
}
59
59
}
60
60
61
+ class WorkspaceFolderEntry {
62
+ private _valid : boolean ;
63
+ public get valid ( ) : boolean {
64
+ return this . _valid ;
65
+ }
66
+ public set valid ( v : boolean ) {
67
+ this . _valid = v ;
68
+ }
69
+
70
+ public constructor ( valid : boolean , readonly items : RobotTestItem [ ] | undefined ) {
71
+ this . _valid = valid ;
72
+ }
73
+ }
74
+
61
75
export class TestControllerManager {
62
76
private _disposables : vscode . Disposable ;
63
77
public readonly testController : vscode . TestController ;
@@ -88,7 +102,13 @@ export class TestControllerManager {
88
102
async ( request , token ) => this . runTests ( request , token )
89
103
) ;
90
104
91
- this . testController . resolveHandler = async ( item ) => this . refresh ( item ) ;
105
+ this . testController . resolveHandler = async ( item ) => {
106
+ if ( item === undefined ) {
107
+ await this . refreshWorkspace ( ) ;
108
+ } else {
109
+ await this . refresh ( item ) ;
110
+ }
111
+ } ;
92
112
93
113
const fileWatcher = vscode . workspace . createFileSystemWatcher ( "**/*.{robot,resource}" ) ;
94
114
fileWatcher . onDidCreate ( ( uri ) => this . refreshUri ( uri , "create" ) ) ;
@@ -111,8 +131,9 @@ export class TestControllerManager {
111
131
}
112
132
}
113
133
} ) ,
114
- vscode . workspace . onDidCloseTextDocument ( ( document ) => {
115
- this . refreshDocument ( document ) ;
134
+ vscode . workspace . onDidCloseTextDocument ( async ( document ) => {
135
+ //this.refreshDocument(document);
136
+ await this . refreshWorkspace ( vscode . workspace . getWorkspaceFolder ( document . uri ) ) ;
116
137
} ) ,
117
138
vscode . workspace . onDidSaveTextDocument ( ( document ) => {
118
139
this . refreshDocument ( document ) ;
@@ -186,7 +207,7 @@ export class TestControllerManager {
186
207
187
208
private removeWorkspaceFolderItems ( folder : vscode . WorkspaceFolder ) {
188
209
if ( this . robotTestItems . has ( folder ) ) {
189
- const robotItems = this . robotTestItems . get ( folder ) ;
210
+ const robotItems = this . robotTestItems . get ( folder ) ?. items ;
190
211
191
212
this . robotTestItems . delete ( folder ) ;
192
213
@@ -211,15 +232,15 @@ export class TestControllerManager {
211
232
this . testController . dispose ( ) ;
212
233
}
213
234
214
- public readonly robotTestItems = new WeakMap < vscode . WorkspaceFolder , RobotTestItem [ ] | undefined > ( ) ;
235
+ public readonly robotTestItems = new WeakMap < vscode . WorkspaceFolder , WorkspaceFolderEntry | undefined > ( ) ;
215
236
216
237
public findRobotItem ( item : vscode . TestItem ) : RobotTestItem | undefined {
217
238
if ( item . parent ) {
218
239
return this . findRobotItem ( item . parent ) ?. children ?. find ( ( i ) => i . id === item . id ) ;
219
240
} else {
220
241
for ( const workspace of vscode . workspace . workspaceFolders ?? [ ] ) {
221
242
if ( this . robotTestItems . has ( workspace ) ) {
222
- const items = this . robotTestItems . get ( workspace ) ;
243
+ const items = this . robotTestItems . get ( workspace ) ?. items ;
223
244
if ( items ) {
224
245
for ( const i of items ) {
225
246
if ( i . id === item . id ) {
@@ -339,17 +360,20 @@ export class TestControllerManager {
339
360
} else {
340
361
const addedIds = new Set < string > ( ) ;
341
362
342
- for ( const workspace of vscode . workspace . workspaceFolders ?? [ ] ) {
363
+ for ( const folder of vscode . workspace . workspaceFolders ?? [ ] ) {
343
364
if ( token ?. isCancellationRequested ) return ;
344
365
345
- if ( ! this . robotTestItems . has ( workspace ) && this . robotTestItems . get ( workspace ) === undefined ) {
366
+ if ( this . robotTestItems . get ( folder ) === undefined || ! this . robotTestItems . get ( folder ) ?. valid ) {
346
367
this . robotTestItems . set (
347
- workspace ,
348
- await this . languageClientsManager . getTestsFromWorkspace ( workspace , [ ] , undefined , token )
368
+ folder ,
369
+ new WorkspaceFolderEntry (
370
+ true ,
371
+ await this . languageClientsManager . getTestsFromWorkspace ( folder , [ ] , undefined , token )
372
+ )
349
373
) ;
350
374
}
351
375
352
- const tests = this . robotTestItems . get ( workspace ) ;
376
+ const tests = this . robotTestItems . get ( folder ) ?. items ;
353
377
354
378
if ( tests ) {
355
379
for ( const test of tests ) {
@@ -443,7 +467,12 @@ export class TestControllerManager {
443
467
private async refreshWorkspace ( workspace ?: vscode . WorkspaceFolder , _reason ?: string ) : Promise < void > {
444
468
return this . refreshFromUriMutex . dispatch ( async ( ) => {
445
469
if ( workspace ) {
446
- this . removeWorkspaceFolderItems ( workspace ) ;
470
+ const entry = this . robotTestItems . get ( workspace ) ;
471
+ if ( entry !== undefined ) {
472
+ entry . valid = false ;
473
+ } else {
474
+ this . removeWorkspaceFolderItems ( workspace ) ;
475
+ }
447
476
} else {
448
477
for ( const w of vscode . workspace . workspaceFolders ?? [ ] ) {
449
478
this . removeWorkspaceFolderItems ( w ) ;
@@ -499,7 +528,7 @@ export class TestControllerManager {
499
528
500
529
for ( const ws of vscode . workspace . workspaceFolders ?? [ ] ) {
501
530
if ( this . robotTestItems . has ( ws ) ) {
502
- if ( this . robotTestItems . get ( ws ) ?. find ( ( w ) => w . id === item . id ) !== undefined ) {
531
+ if ( this . robotTestItems . get ( ws ) ?. items ?. find ( ( w ) => w . id === item . id ) !== undefined ) {
503
532
return ws ;
504
533
}
505
534
}
0 commit comments