Skip to content

Commit 088e9aa

Browse files
committed
Add command manager to app
1 parent 61974a7 commit 088e9aa

7 files changed

Lines changed: 46 additions & 17 deletions

File tree

extensions/ql-vscode/src/common/app.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { Disposable } from "../pure/disposable-object";
33
import { AppEventEmitter } from "./events";
44
import { Logger } from "./logging";
55
import { Memento } from "./memento";
6+
import { ExtensionCommandManager } from "./commands";
67

78
export interface App {
89
createEventEmitter<T>(): AppEventEmitter<T>;
@@ -15,6 +16,7 @@ export interface App {
1516
readonly workspaceStoragePath?: string;
1617
readonly workspaceState: Memento;
1718
readonly credentials: Credentials;
19+
readonly commandManager: ExtensionCommandManager;
1820
}
1921

2022
export enum AppMode {
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { CommandManager } from "../packages/commands";
2+
3+
export type ExtensionCommands = {
4+
"codeQL.openVariantAnalysisLogs": (
5+
variantAnalysisId: number,
6+
) => Promise<void>;
7+
};
8+
9+
export type AllCommands = ExtensionCommands;
10+
11+
export type ExtensionCommandManager = CommandManager<AllCommands>;

extensions/ql-vscode/src/commands.ts renamed to extensions/ql-vscode/src/common/vscode/commands.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { commands } from "vscode";
2-
import { commandRunner } from "./commandRunner";
3-
import { CommandFunction, CommandManager } from "./packages/commands";
2+
import { commandRunner } from "../../commandRunner";
3+
import { CommandFunction, CommandManager } from "../../packages/commands";
44

55
export function initializeVSCodeCommandManager<
66
Commands extends Record<string, CommandFunction>,
@@ -19,10 +19,3 @@ async function wrappedExecuteCommand<
1919
Awaited<ReturnType<Commands[CommandName]>>
2020
>(commandName, ...args);
2121
}
22-
23-
export type ExtensionCommands = {
24-
"codeQL.openVariantAnalysisLogs": (
25-
variantAnalysisId: number,
26-
) => Promise<void>;
27-
};
28-
export type AllCommands = ExtensionCommands;

extensions/ql-vscode/src/common/vscode/vscode-app.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,19 @@ import { AppEventEmitter } from "../events";
66
import { extLogger, Logger } from "../logging";
77
import { Memento } from "../memento";
88
import { VSCodeAppEventEmitter } from "./events";
9+
import { ExtensionCommandManager } from "../commands";
10+
import { initializeVSCodeCommandManager } from "./commands";
911

1012
export class ExtensionApp implements App {
1113
public readonly credentials: VSCodeCredentials;
14+
public readonly commandManager: ExtensionCommandManager;
1215

1316
public constructor(
1417
public readonly extensionContext: vscode.ExtensionContext,
1518
) {
1619
this.credentials = new VSCodeCredentials();
20+
this.commandManager = initializeVSCodeCommandManager();
21+
extensionContext.subscriptions.push(this.commandManager);
1722
}
1823

1924
public get extensionPath(): string {

extensions/ql-vscode/src/extension.ts

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -137,11 +137,7 @@ import { RepositoriesFilterSortStateWithIds } from "./pure/variant-analysis-filt
137137
import { DbModule } from "./databases/db-module";
138138
import { redactableError } from "./pure/errors";
139139
import { QueryHistoryDirs } from "./query-history/query-history-dirs";
140-
import {
141-
AllCommands,
142-
ExtensionCommands,
143-
initializeVSCodeCommandManager,
144-
} from "./commands";
140+
import { AllCommands, ExtensionCommands } from "./common/commands";
145141

146142
/**
147143
* extension.ts
@@ -1179,14 +1175,15 @@ async function activateWithInstalledDistribution(
11791175
);
11801176
*/
11811177

1182-
const vsCommandRunner = initializeVSCodeCommandManager<AllCommands>();
1183-
ctx.subscriptions.push(vsCommandRunner);
11841178
const allCommands: Partial<AllCommands> = {
11851179
...getCommands(variantAnalysisManager),
11861180
};
11871181

11881182
for (const [commandName, command] of Object.entries(allCommands)) {
1189-
vsCommandRunner.registerCommand(commandName as keyof AllCommands, command);
1183+
app.commandManager.registerCommand(
1184+
commandName as keyof AllCommands,
1185+
command,
1186+
);
11901187
}
11911188

11921189
ctx.subscriptions.push(

extensions/ql-vscode/test/__mocks__/appMock.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import { createMockLogger } from "./loggerMock";
66
import { createMockMemento } from "../mock-memento";
77
import { testCredentialsWithStub } from "../factories/authentication";
88
import { Credentials } from "../../src/common/authentication";
9+
import { ExtensionCommandManager } from "../../src/common/commands";
10+
import { createMockCommandManager } from "./commandsMock";
911

1012
export function createMockApp({
1113
extensionPath = "/mock/extension/path",
@@ -15,6 +17,7 @@ export function createMockApp({
1517
executeCommand = jest.fn(() => Promise.resolve()),
1618
workspaceState = createMockMemento(),
1719
credentials = testCredentialsWithStub(),
20+
commandManager = createMockCommandManager(),
1821
}: {
1922
extensionPath?: string;
2023
workspaceStoragePath?: string;
@@ -23,6 +26,7 @@ export function createMockApp({
2326
executeCommand?: () => Promise<void>;
2427
workspaceState?: Memento;
2528
credentials?: Credentials;
29+
commandManager?: ExtensionCommandManager;
2630
}): App {
2731
return {
2832
mode: AppMode.Test,
@@ -35,6 +39,7 @@ export function createMockApp({
3539
createEventEmitter,
3640
executeCommand,
3741
credentials,
42+
commandManager,
3843
};
3944
}
4045

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { ExtensionCommandManager } from "../../src/common/commands";
2+
import {
3+
CommandFunction,
4+
CommandManager,
5+
Disposable,
6+
} from "../../src/packages/commands";
7+
8+
export function createMockCommandManager({
9+
registerCommand = jest.fn(),
10+
executeCommand = jest.fn(),
11+
}: {
12+
registerCommand?: (commandName: string, fn: CommandFunction) => Disposable;
13+
executeCommand?: (commandName: string, ...args: any[]) => Promise<any>;
14+
} = {}): ExtensionCommandManager {
15+
return new CommandManager(registerCommand, executeCommand);
16+
}

0 commit comments

Comments
 (0)