Skip to content

Commit f2620c6

Browse files
committed
Add disposeHandlers
These functions assist with object disposal. They add custom behaviour during disposal. The primary usage of disposalHandlers is during testing where some objects should not be disposed in order to avoid testing errors. Additionally, move DisposableObject to the pure folder and create unit tests for it. Also, add `--disable-gpu` to command line options when running tests. It helps to avoid error messages like this: ```- [19141:19141:0425/011526.129520:ERROR:sandbox_linux.cc(374)] InitializeSandbox() called with multiple threads in process gpu-process.``` See also https://askubuntu.com/a/1288969
1 parent c5fe58d commit f2620c6

25 files changed

Lines changed: 213 additions & 31 deletions

extensions/ql-vscode/src/astViewer.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@ import { UrlValue, BqrsId } from './pure/bqrs-cli-types';
1919
import { showLocation } from './interface-utils';
2020
import { isStringLoc, isWholeFileLoc, isLineColumnLoc } from './pure/bqrs-utils';
2121
import { commandRunner } from './commandRunner';
22-
import { DisposableObject } from './vscode-utils/disposable-object';
22+
import { DisposableObject } from './pure/disposable-object';
23+
import { showAndLogErrorMessage } from './helpers';
2324

2425
export interface AstItem {
2526
id: BqrsId;
@@ -129,8 +130,13 @@ export class AstViewer extends DisposableObject {
129130
this.treeDataProvider.db = db;
130131
this.treeDataProvider.refresh();
131132
this.treeView.message = `AST for ${path.basename(fileName)}`;
132-
this.treeView.reveal(roots[0], { focus: false });
133133
this.currentFile = fileName;
134+
// Handle error on reveal. This could happen if
135+
// the tree view is disposed during the reveal.
136+
this.treeView.reveal(roots[0], { focus: false })?.then(
137+
() => { /**/ },
138+
err => showAndLogErrorMessage(err)
139+
);
134140
}
135141

136142
private updateTreeSelection(e: TextEditorSelectionChangeEvent) {
@@ -178,7 +184,12 @@ export class AstViewer extends DisposableObject {
178184

179185
const targetItem = findBest(range, this.treeDataProvider.roots);
180186
if (targetItem) {
181-
this.treeView.reveal(targetItem);
187+
// Handle error on reveal. This could happen if
188+
// the tree view is disposed during the reveal.
189+
this.treeView.reveal(targetItem)?.then(
190+
() => { /**/ },
191+
err => showAndLogErrorMessage(err)
192+
);
182193
}
183194
}
184195
}

extensions/ql-vscode/src/compare/compare-interface.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { DisposableObject } from '../vscode-utils/disposable-object';
1+
import { DisposableObject } from '../pure/disposable-object';
22
import {
33
WebviewPanel,
44
ExtensionContext,

extensions/ql-vscode/src/config.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { DisposableObject } from './vscode-utils/disposable-object';
1+
import { DisposableObject } from './pure/disposable-object';
22
import { workspace, Event, EventEmitter, ConfigurationChangeEvent, ConfigurationTarget } from 'vscode';
33
import { DistributionManager } from './distribution';
44
import { logger } from './logging';

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as path from 'path';
2-
import { DisposableObject } from './vscode-utils/disposable-object';
2+
import { DisposableObject } from './pure/disposable-object';
33
import {
44
Event,
55
EventEmitter,

extensions/ql-vscode/src/databases.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import {
1515
withProgress
1616
} from './commandRunner';
1717
import { zipArchiveScheme, encodeArchiveBasePath, decodeSourceArchiveUri, encodeSourceArchiveUri } from './archive-filesystem-provider';
18-
import { DisposableObject } from './vscode-utils/disposable-object';
18+
import { DisposableObject } from './pure/disposable-object';
1919
import { Logger, logger } from './logging';
2020
import { registerDatabases, Dataset, deregisterDatabases } from './pure/messages';
2121
import { QueryServerClient } from './queryserver-client';

extensions/ql-vscode/src/discovery.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { DisposableObject } from './vscode-utils/disposable-object';
1+
import { DisposableObject } from './pure/disposable-object';
22
import { logger } from './logging';
33

44
/**

extensions/ql-vscode/src/interface.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import * as path from 'path';
22
import * as Sarif from 'sarif';
3-
import { DisposableObject } from './vscode-utils/disposable-object';
3+
import { DisposableObject } from './pure/disposable-object';
44
import * as vscode from 'vscode';
55
import {
66
Diagnostic,

extensions/ql-vscode/src/logging.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { window as Window, OutputChannel, Progress, Disposable } from 'vscode';
2-
import { DisposableObject } from './vscode-utils/disposable-object';
2+
import { DisposableObject } from './pure/disposable-object';
33
import * as fs from 'fs-extra';
44
import * as path from 'path';
55

extensions/ql-vscode/src/vscode-utils/disposable-object.ts renamed to extensions/ql-vscode/src/pure/disposable-object.ts

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
import { Disposable } from 'vscode';
1+
2+
// Avoid explicitly referencing Disposable type in vscode.
3+
// This file cannot have dependencies on the vscode API.
4+
interface Disposable {
5+
dispose(): any;
6+
}
7+
8+
export type DisposeHandler = (disposable: Disposable) => void;
29

310
/**
411
* Base class to make it easier to implement a `Disposable` that owns other disposable object.
@@ -40,21 +47,39 @@ export abstract class DisposableObject implements Disposable {
4047
* @param obj The object to stop tracking.
4148
*/
4249
protected disposeAndStopTracking(obj: Disposable): void {
43-
if (obj !== undefined) {
44-
this.tracked!.delete(obj);
50+
if (obj && this.tracked) {
51+
this.tracked.delete(obj);
4552
obj.dispose();
4653
}
4754
}
4855

49-
public dispose() {
56+
/**
57+
* Dispose this object and all contained objects
58+
*
59+
* @param disposeHandler An optional dispose handler that gets
60+
* passed each element to dispose. The dispose handler
61+
* can choose how (and if) to dispose the object. The
62+
* primary usage is for tests that should not dispose
63+
* all items of a disposable.
64+
*/
65+
public dispose(disposeHandler?: DisposeHandler) {
5066
if (this.tracked !== undefined) {
5167
for (const trackedObject of this.tracked.values()) {
52-
trackedObject.dispose();
68+
if (disposeHandler) {
69+
disposeHandler(trackedObject);
70+
} else {
71+
trackedObject.dispose();
72+
}
5373
}
5474
this.tracked = undefined;
5575
}
5676
while (this.disposables.length > 0) {
57-
this.disposables.pop()!.dispose();
77+
const disposable = this.disposables.pop()!;
78+
if (disposeHandler) {
79+
disposeHandler(disposable);
80+
} else {
81+
disposable.dispose();
82+
}
5883
}
5984
}
6085
}

extensions/ql-vscode/src/query-history.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
import { logger } from './logging';
1414
import { URLSearchParams } from 'url';
1515
import { QueryServerClient } from './queryserver-client';
16-
import { DisposableObject } from './vscode-utils/disposable-object';
16+
import { DisposableObject } from './pure/disposable-object';
1717
import { commandRunner } from './commandRunner';
1818

1919
/**

0 commit comments

Comments
 (0)