Skip to content

Commit 7961816

Browse files
committed
Only clear problems view when a database is removed
This commit adds DatabaseChangedEvent and ensures that all events fired by the DatabaseManager includes one of these kinds. Currently, the only kind that we care about is `Remove`. We ensure that the problems view is only cleared on Remove events.
1 parent 672b20d commit 7961816

3 files changed

Lines changed: 61 additions & 29 deletions

File tree

extensions/ql-vscode/src/databases-ui.ts

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import * as fs from 'fs-extra';
1616

1717
import * as cli from './cli';
1818
import {
19+
DatabaseChangedEvent,
1920
DatabaseItem,
2021
DatabaseManager,
2122
getUpgradesDirectories,
@@ -72,9 +73,7 @@ class DatabaseTreeDataProvider extends DisposableObject
7273
implements TreeDataProvider<DatabaseItem> {
7374
private _sortOrder = SortOrder.NameAsc;
7475

75-
private readonly _onDidChangeTreeData = new EventEmitter<
76-
DatabaseItem | undefined
77-
>();
76+
private readonly _onDidChangeTreeData = new EventEmitter<DatabaseItem | undefined>();
7877
private currentDatabaseItem: DatabaseItem | undefined;
7978

8079
constructor(
@@ -101,19 +100,19 @@ class DatabaseTreeDataProvider extends DisposableObject
101100
return this._onDidChangeTreeData.event;
102101
}
103102

104-
private handleDidChangeDatabaseItem = (
105-
databaseItem: DatabaseItem | undefined
106-
): void => {
107-
this._onDidChangeTreeData.fire(databaseItem);
103+
private handleDidChangeDatabaseItem = (event: DatabaseChangedEvent): void => {
104+
// Note that events from the databse manager are instances of DatabaseChangedEvent
105+
// and events fired by the UI are instances of DatabaseItem
106+
this._onDidChangeTreeData.fire(event.item);
108107
};
109108

110109
private handleDidChangeCurrentDatabaseItem = (
111-
databaseItem: DatabaseItem | undefined
110+
event: DatabaseChangedEvent
112111
): void => {
113112
if (this.currentDatabaseItem) {
114113
this._onDidChangeTreeData.fire(this.currentDatabaseItem);
115114
}
116-
this.currentDatabaseItem = databaseItem;
115+
this.currentDatabaseItem = event.item;
117116
if (this.currentDatabaseItem) {
118117
this._onDidChangeTreeData.fire(this.currentDatabaseItem);
119118
}

extensions/ql-vscode/src/databases.ts

Lines changed: 45 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,24 @@ export interface DatabaseItem {
249249
belongsToSourceArchiveExplorerUri(uri: vscode.Uri): boolean;
250250
}
251251

252+
export enum DatabaseEventKind {
253+
Add = 'Add',
254+
Remove = 'Remove',
255+
256+
// Fired when databases are refreshed from persisted state
257+
Refresh = 'Refresh',
258+
259+
// Fired when the current database changes
260+
Change = 'Change',
261+
262+
Rename = 'Rename'
263+
}
264+
265+
export interface DatabaseChangedEvent {
266+
kind: DatabaseEventKind;
267+
item: DatabaseItem | undefined;
268+
}
269+
252270
class DatabaseItemImpl implements DatabaseItem {
253271
private _error: Error | undefined = undefined;
254272
private _contents: DatabaseContents | undefined;
@@ -257,7 +275,7 @@ class DatabaseItemImpl implements DatabaseItem {
257275

258276
public constructor(public readonly databaseUri: vscode.Uri,
259277
contents: DatabaseContents | undefined, private options: FullDatabaseOptions,
260-
private readonly onChanged: (item: DatabaseItemImpl) => void) {
278+
private readonly onChanged: (event: DatabaseChangedEvent) => void) {
261279

262280
this._contents = contents;
263281
}
@@ -312,7 +330,10 @@ class DatabaseItemImpl implements DatabaseItem {
312330
}
313331
}
314332
finally {
315-
this.onChanged(this);
333+
this.onChanged({
334+
kind: DatabaseEventKind.Refresh,
335+
item: this
336+
});
316337
}
317338
}
318339

@@ -452,11 +473,11 @@ function eventFired<T>(event: vscode.Event<T>, timeoutMs = 1000): Promise<T | un
452473
}
453474

454475
export class DatabaseManager extends DisposableObject {
455-
private readonly _onDidChangeDatabaseItem = this.push(new vscode.EventEmitter<DatabaseItem | undefined>());
476+
private readonly _onDidChangeDatabaseItem = this.push(new vscode.EventEmitter<DatabaseChangedEvent>());
456477

457478
readonly onDidChangeDatabaseItem = this._onDidChangeDatabaseItem.event;
458479

459-
private readonly _onDidChangeCurrentDatabaseItem = this.push(new vscode.EventEmitter<DatabaseItem | undefined>());
480+
private readonly _onDidChangeCurrentDatabaseItem = this.push(new vscode.EventEmitter<DatabaseChangedEvent>());
460481
readonly onDidChangeCurrentDatabaseItem = this._onDidChangeCurrentDatabaseItem.event;
461482

462483
private readonly _databaseItems: DatabaseItemImpl[] = [];
@@ -484,8 +505,8 @@ export class DatabaseManager extends DisposableObject {
484505
displayName: realOptions.displayName,
485506
dateAdded: realOptions.dateAdded || Date.now()
486507
};
487-
const databaseItem = new DatabaseItemImpl(uri, contents, fullOptions, (item) => {
488-
this._onDidChangeDatabaseItem.fire(item);
508+
const databaseItem = new DatabaseItemImpl(uri, contents, fullOptions, (event) => {
509+
this._onDidChangeDatabaseItem.fire(event);
489510
});
490511
await this.addDatabaseItem(databaseItem);
491512
await this.addDatabaseSourceArchiveFolder(databaseItem);
@@ -556,8 +577,8 @@ export class DatabaseManager extends DisposableObject {
556577
dateAdded
557578
};
558579
const item = new DatabaseItemImpl(vscode.Uri.parse(state.uri), undefined, fullOptions,
559-
(item) => {
560-
this._onDidChangeDatabaseItem.fire(item);
580+
(event) => {
581+
this._onDidChangeDatabaseItem.fire(event);
561582
});
562583
await this.addDatabaseItem(item);
563584

@@ -605,7 +626,10 @@ export class DatabaseManager extends DisposableObject {
605626
if (this._currentDatabaseItem !== item) {
606627
this._currentDatabaseItem = item;
607628
this.updatePersistedCurrentDatabaseItem();
608-
this._onDidChangeCurrentDatabaseItem.fire(item);
629+
this._onDidChangeCurrentDatabaseItem.fire({
630+
item,
631+
kind: DatabaseEventKind.Change
632+
});
609633
}
610634
}
611635

@@ -631,13 +655,19 @@ export class DatabaseManager extends DisposableObject {
631655
private async addDatabaseItem(item: DatabaseItemImpl) {
632656
this._databaseItems.push(item);
633657
this.updatePersistedDatabaseList();
634-
this._onDidChangeDatabaseItem.fire(undefined);
658+
this._onDidChangeDatabaseItem.fire({
659+
item: undefined,
660+
kind: DatabaseEventKind.Add
661+
});
635662
}
636663

637664
public async renameDatabaseItem(item: DatabaseItem, newName: string) {
638665
item.name = newName;
639666
this.updatePersistedDatabaseList();
640-
this._onDidChangeDatabaseItem.fire(item);
667+
this._onDidChangeDatabaseItem.fire({
668+
item,
669+
kind: DatabaseEventKind.Rename
670+
});
641671
}
642672

643673
public removeDatabaseItem(item: DatabaseItem) {
@@ -664,7 +694,10 @@ export class DatabaseManager extends DisposableObject {
664694
e => logger.log(`Failed to delete '${item.databaseUri.path}'. Reason: ${e.message}`));
665695
}
666696

667-
this._onDidChangeDatabaseItem.fire(undefined);
697+
this._onDidChangeDatabaseItem.fire({
698+
item: undefined,
699+
kind: DatabaseEventKind.Remove
700+
});
668701
}
669702

670703
private updatePersistedCurrentDatabaseItem(): void {

extensions/ql-vscode/src/interface.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
} from 'vscode';
1414
import * as cli from './cli';
1515
import { CodeQLCliServer } from './cli';
16-
import { DatabaseItem, DatabaseManager } from './databases';
16+
import { DatabaseEventKind, DatabaseItem, DatabaseManager } from './databases';
1717
import { showAndLogErrorMessage } from './helpers';
1818
import { assertNever } from './helpers-pure';
1919
import {
@@ -134,13 +134,13 @@ export class InterfaceManager extends DisposableObject {
134134
);
135135

136136
this.push(
137-
this.databaseManager.onDidChangeDatabaseItem(() => {
138-
// Consider only clearing database items when a database
139-
// is removed and only clearing items from that database.
140-
this._diagnosticCollection.clear();
141-
this.postMessage({
142-
t: 'untoggleShowProblems'
143-
});
137+
this.databaseManager.onDidChangeDatabaseItem(({ kind }) => {
138+
if (kind === DatabaseEventKind.Remove) {
139+
this._diagnosticCollection.clear();
140+
this.postMessage({
141+
t: 'untoggleShowProblems'
142+
});
143+
}
144144
})
145145
);
146146
}

0 commit comments

Comments
 (0)