Skip to content

Commit 401da63

Browse files
committed
Keep track of opened variant analysis views
To be able to send messages to the open view for a variant analysis, we need to have a reference to the view. This is done by keeping track of all open views in a dictionary indexed by their variant analysis ID. We currently only allow one view per variant analysis, but do allow multiple variant analysis views to be open at a time. In the future, we may want to allow multiple views per variant analysis (such that e.g. "Split right" works), but this is not supported yet. The reason for the indirection through the interfaces is to prevent circular dependencies between the variant analysis view and the manager.
1 parent ab9cf46 commit 401da63

4 files changed

Lines changed: 46 additions & 10 deletions

File tree

extensions/ql-vscode/src/extension.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,6 @@ import { LogScannerService } from './log-insights/log-scanner-service';
104104
import { createInitialQueryInfo } from './run-queries-shared';
105105
import { LegacyQueryRunner } from './legacy-query-server/legacyRunner';
106106
import { QueryRunner } from './queryRunner';
107-
import { VariantAnalysisView } from './remote-queries/variant-analysis-view';
108107
import { VariantAnalysis } from './remote-queries/shared/variant-analysis';
109108
import {
110109
VariantAnalysis as VariantAnalysisApiResponse,
@@ -935,16 +934,14 @@ async function activateWithInstalledDistribution(
935934

936935
ctx.subscriptions.push(
937936
commandRunner('codeQL.mockVariantAnalysisView', async () => {
938-
const variantAnalysisView = new VariantAnalysisView(ctx, 1);
939-
variantAnalysisView.openView();
937+
await variantAnalysisManager.showView(1);
940938
})
941939
);
942940

943941
// The "openVariantAnalysisView" command is internal-only.
944942
ctx.subscriptions.push(
945943
commandRunner('codeQL.openVariantAnalysisView', async (variantAnalysisId: number) => {
946-
const variantAnalysisView = new VariantAnalysisView(ctx, variantAnalysisId);
947-
variantAnalysisView.openView();
944+
await variantAnalysisManager.showView(variantAnalysisId);
948945
})
949946
);
950947

extensions/ql-vscode/src/remote-queries/variant-analysis-manager.ts

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,12 @@ import {
1313
} from './gh-api/variant-analysis';
1414
import { VariantAnalysis } from './shared/variant-analysis';
1515
import { getErrorMessage } from '../pure/helpers-pure';
16+
import { VariantAnalysisView } from './variant-analysis-view';
17+
import { VariantAnalysisViewManager } from './variant-analysis-view-manager';
1618

17-
export class VariantAnalysisManager extends DisposableObject {
19+
export class VariantAnalysisManager extends DisposableObject implements VariantAnalysisViewManager<VariantAnalysisView> {
1820
private readonly variantAnalysisMonitor: VariantAnalysisMonitor;
21+
private readonly views = new Map<number, VariantAnalysisView>();
1922

2023
constructor(
2124
private readonly ctx: ExtensionContext,
@@ -25,6 +28,29 @@ export class VariantAnalysisManager extends DisposableObject {
2528
this.variantAnalysisMonitor = new VariantAnalysisMonitor(ctx, logger);
2629
}
2730

31+
public async showView(variantAnalysisId: number): Promise<void> {
32+
if (!this.views.has(variantAnalysisId)) {
33+
// The view will register itself with the manager, so we don't need to do anything here.
34+
new VariantAnalysisView(this.ctx, variantAnalysisId, this);
35+
}
36+
37+
const variantAnalysisView = this.views.get(variantAnalysisId)!;
38+
await variantAnalysisView.openView();
39+
return;
40+
}
41+
42+
public registerView(view: VariantAnalysisView): void {
43+
if (this.views.has(view.variantAnalysisId)) {
44+
throw new Error(`View for variant analysis with id: ${view.variantAnalysisId} already exists`);
45+
}
46+
47+
this.views.set(view.variantAnalysisId, view);
48+
}
49+
50+
public unregisterView(view: VariantAnalysisView): void {
51+
this.views.delete(view.variantAnalysisId);
52+
}
53+
2854
public async monitorVariantAnalysis(
2955
variantAnalysis: VariantAnalysis,
3056
cancellationToken: CancellationToken
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
export interface VariantAnalysisViewInterface {
2+
variantAnalysisId: number;
3+
openView(): Promise<void>;
4+
}
5+
6+
export interface VariantAnalysisViewManager<T extends VariantAnalysisViewInterface> {
7+
registerView(view: T): void;
8+
unregisterView(view: T): void;
9+
}

extensions/ql-vscode/src/remote-queries/variant-analysis-view.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,20 @@ import { ExtensionContext, ViewColumn } from 'vscode';
22
import { AbstractWebview, WebviewPanelConfig } from '../abstract-webview';
33
import { WebviewMessage } from '../interface-utils';
44
import { logger } from '../logging';
5+
import { VariantAnalysisViewInterface, VariantAnalysisViewManager } from './variant-analysis-view-manager';
56

6-
export class VariantAnalysisView extends AbstractWebview<WebviewMessage, WebviewMessage> {
7+
export class VariantAnalysisView extends AbstractWebview<WebviewMessage, WebviewMessage> implements VariantAnalysisViewInterface {
78
public constructor(
89
ctx: ExtensionContext,
9-
private readonly variantAnalysisId: number,
10+
public readonly variantAnalysisId: number,
11+
private readonly manager: VariantAnalysisViewManager<VariantAnalysisView>,
1012
) {
1113
super(ctx);
14+
15+
manager.registerView(this);
1216
}
1317

14-
public openView() {
18+
public async openView() {
1519
this.getPanel().reveal(undefined, true);
1620
}
1721

@@ -26,7 +30,7 @@ export class VariantAnalysisView extends AbstractWebview<WebviewMessage, Webview
2630
}
2731

2832
protected onPanelDispose(): void {
29-
// Nothing to dispose currently.
33+
this.manager.unregisterView(this);
3034
}
3135

3236
protected async onMessage(msg: WebviewMessage): Promise<void> {

0 commit comments

Comments
 (0)