Skip to content

Commit 0f0e44d

Browse files
committed
improve updating of test explorer
1 parent 2666b85 commit 0f0e44d

File tree

1 file changed

+42
-13
lines changed

1 file changed

+42
-13
lines changed

vscode-client/testcontrollermanager.ts

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,20 @@ class DidChangeEntry {
5858
}
5959
}
6060

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+
6175
export class TestControllerManager {
6276
private _disposables: vscode.Disposable;
6377
public readonly testController: vscode.TestController;
@@ -88,7 +102,13 @@ export class TestControllerManager {
88102
async (request, token) => this.runTests(request, token)
89103
);
90104

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+
};
92112

93113
const fileWatcher = vscode.workspace.createFileSystemWatcher("**/*.{robot,resource}");
94114
fileWatcher.onDidCreate((uri) => this.refreshUri(uri, "create"));
@@ -111,8 +131,9 @@ export class TestControllerManager {
111131
}
112132
}
113133
}),
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));
116137
}),
117138
vscode.workspace.onDidSaveTextDocument((document) => {
118139
this.refreshDocument(document);
@@ -186,7 +207,7 @@ export class TestControllerManager {
186207

187208
private removeWorkspaceFolderItems(folder: vscode.WorkspaceFolder) {
188209
if (this.robotTestItems.has(folder)) {
189-
const robotItems = this.robotTestItems.get(folder);
210+
const robotItems = this.robotTestItems.get(folder)?.items;
190211

191212
this.robotTestItems.delete(folder);
192213

@@ -211,15 +232,15 @@ export class TestControllerManager {
211232
this.testController.dispose();
212233
}
213234

214-
public readonly robotTestItems = new WeakMap<vscode.WorkspaceFolder, RobotTestItem[] | undefined>();
235+
public readonly robotTestItems = new WeakMap<vscode.WorkspaceFolder, WorkspaceFolderEntry | undefined>();
215236

216237
public findRobotItem(item: vscode.TestItem): RobotTestItem | undefined {
217238
if (item.parent) {
218239
return this.findRobotItem(item.parent)?.children?.find((i) => i.id === item.id);
219240
} else {
220241
for (const workspace of vscode.workspace.workspaceFolders ?? []) {
221242
if (this.robotTestItems.has(workspace)) {
222-
const items = this.robotTestItems.get(workspace);
243+
const items = this.robotTestItems.get(workspace)?.items;
223244
if (items) {
224245
for (const i of items) {
225246
if (i.id === item.id) {
@@ -339,17 +360,20 @@ export class TestControllerManager {
339360
} else {
340361
const addedIds = new Set<string>();
341362

342-
for (const workspace of vscode.workspace.workspaceFolders ?? []) {
363+
for (const folder of vscode.workspace.workspaceFolders ?? []) {
343364
if (token?.isCancellationRequested) return;
344365

345-
if (!this.robotTestItems.has(workspace) && this.robotTestItems.get(workspace) === undefined) {
366+
if (this.robotTestItems.get(folder) === undefined || !this.robotTestItems.get(folder)?.valid) {
346367
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+
)
349373
);
350374
}
351375

352-
const tests = this.robotTestItems.get(workspace);
376+
const tests = this.robotTestItems.get(folder)?.items;
353377

354378
if (tests) {
355379
for (const test of tests) {
@@ -443,7 +467,12 @@ export class TestControllerManager {
443467
private async refreshWorkspace(workspace?: vscode.WorkspaceFolder, _reason?: string): Promise<void> {
444468
return this.refreshFromUriMutex.dispatch(async () => {
445469
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+
}
447476
} else {
448477
for (const w of vscode.workspace.workspaceFolders ?? []) {
449478
this.removeWorkspaceFolderItems(w);
@@ -499,7 +528,7 @@ export class TestControllerManager {
499528

500529
for (const ws of vscode.workspace.workspaceFolders ?? []) {
501530
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) {
503532
return ws;
504533
}
505534
}

0 commit comments

Comments
 (0)