Skip to content

Commit 92f50af

Browse files
Merge pull request #2230 from github/robertbrignull/activate_extension
Use undefined instead of Record<string, never> type when unable to activate extension
2 parents 7c74764 + 091216f commit 92f50af

File tree

15 files changed

+161
-241
lines changed

15 files changed

+161
-241
lines changed

extensions/ql-vscode/src/extension.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ const MIN_VERSION = "1.67.0";
289289
*/
290290
export async function activate(
291291
ctx: ExtensionContext,
292-
): Promise<CodeQLExtensionInterface | Record<string, never>> {
292+
): Promise<CodeQLExtensionInterface | undefined> {
293293
void extLogger.log(`Starting ${extensionId} extension`);
294294
if (extension === undefined) {
295295
throw new Error(`Can't find extension ${extensionId}`);
@@ -379,9 +379,11 @@ export async function activate(
379379
},
380380
);
381381

382-
variantAnalysisViewSerializer.onExtensionLoaded(
383-
codeQlExtension.variantAnalysisManager,
384-
);
382+
if (codeQlExtension !== undefined) {
383+
variantAnalysisViewSerializer.onExtensionLoaded(
384+
codeQlExtension.variantAnalysisManager,
385+
);
386+
}
385387

386388
return codeQlExtension;
387389
}
@@ -571,7 +573,7 @@ async function installOrUpdateThenTryActivate(
571573
distributionManager: DistributionManager,
572574
distributionConfigListener: DistributionConfigListener,
573575
config: DistributionUpdateConfig,
574-
): Promise<CodeQLExtensionInterface | Record<string, never>> {
576+
): Promise<CodeQLExtensionInterface | undefined> {
575577
await installOrUpdateDistribution(ctx, app, distributionManager, config);
576578

577579
try {
@@ -585,20 +587,19 @@ async function installOrUpdateThenTryActivate(
585587
// Display the warnings even if the extension has already activated.
586588
const distributionResult =
587589
await getDistributionDisplayingDistributionWarnings(distributionManager);
588-
let extensionInterface: CodeQLExtensionInterface | Record<string, never> = {};
589590
if (
590591
!beganMainExtensionActivation &&
591592
distributionResult.kind !== FindDistributionResultKind.NoDistribution
592593
) {
593-
extensionInterface = await activateWithInstalledDistribution(
594+
return await activateWithInstalledDistribution(
594595
ctx,
595596
app,
596597
distributionManager,
597598
distributionConfigListener,
598599
);
599-
} else if (
600-
distributionResult.kind === FindDistributionResultKind.NoDistribution
601-
) {
600+
}
601+
602+
if (distributionResult.kind === FindDistributionResultKind.NoDistribution) {
602603
registerErrorStubs([checkForUpdatesCommand], (command) => async () => {
603604
const installActionName = "Install CodeQL CLI";
604605
const chosenAction = await showAndLogErrorMessage(
@@ -622,7 +623,7 @@ async function installOrUpdateThenTryActivate(
622623
}
623624
});
624625
}
625-
return extensionInterface;
626+
return undefined;
626627
}
627628

628629
const PACK_GLOBS = [

extensions/ql-vscode/test/vscode-tests/activated-extension/databases/db-panel.test.ts

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import { commands, extensions, window } from "vscode";
1+
import { commands, window } from "vscode";
22

3-
import { CodeQLExtensionInterface } from "../../../../src/extension";
43
import { readJson } from "fs-extra";
54
import * as path from "path";
65
import {
@@ -15,19 +14,15 @@ import { DbListKind } from "../../../../src/databases/db-item";
1514
import { createDbTreeViewItemSystemDefinedList } from "../../../../src/databases/ui/db-tree-view-item";
1615
import { createRemoteSystemDefinedListDbItem } from "../../../factories/db-item-factories";
1716
import { DbConfigStore } from "../../../../src/databases/config/db-config-store";
17+
import { getActivatedExtension } from "../../global.helper";
1818

1919
jest.setTimeout(60_000);
2020

2121
describe("Db panel UI commands", () => {
22-
let extension: CodeQLExtensionInterface | Record<string, never>;
2322
let storagePath: string;
2423

2524
beforeEach(async () => {
26-
extension = await extensions
27-
.getExtension<CodeQLExtensionInterface | Record<string, never>>(
28-
"GitHub.vscode-codeql",
29-
)!
30-
.activate();
25+
const extension = await getActivatedExtension();
3126

3227
storagePath =
3328
extension.ctx.storageUri?.fsPath || extension.ctx.globalStorageUri.fsPath;

extensions/ql-vscode/test/vscode-tests/activated-extension/variant-analysis/variant-analysis-manager.test.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
import {
22
commands,
33
env,
4-
extensions,
54
TextDocument,
65
TextEditor,
76
Uri,
87
window,
98
workspace,
109
} from "vscode";
11-
import { CodeQLExtensionInterface } from "../../../../src/extension";
1210
import { extLogger } from "../../../../src/common";
1311
import * as ghApiClient from "../../../../src/variant-analysis/gh-api/gh-api-client";
1412
import * as ghActionsApiClient from "../../../../src/variant-analysis/gh-api/gh-actions-api-client";
@@ -20,7 +18,7 @@ import { Response } from "node-fetch";
2018

2119
import { VariantAnalysisManager } from "../../../../src/variant-analysis/variant-analysis-manager";
2220
import { CodeQLCliServer } from "../../../../src/cli";
23-
import { storagePath } from "../../global.helper";
21+
import { getActivatedExtension, storagePath } from "../../global.helper";
2422
import { VariantAnalysisResultsManager } from "../../../../src/variant-analysis/variant-analysis-results-manager";
2523
import { createMockVariantAnalysis } from "../../../factories/variant-analysis/shared/variant-analysis";
2624
import * as VariantAnalysisModule from "../../../../src/variant-analysis/shared/variant-analysis";
@@ -67,11 +65,7 @@ describe("Variant Analysis Manager", () => {
6765
scannedRepos,
6866
});
6967

70-
const extension = await extensions
71-
.getExtension<CodeQLExtensionInterface | Record<string, never>>(
72-
"GitHub.vscode-codeql",
73-
)!
74-
.activate();
68+
const extension = await getActivatedExtension();
7569
const cli = mockedObject<CodeQLCliServer>({});
7670
app = new ExtensionApp(extension.ctx);
7771
const dbManager = new DbManager(app, new DbConfigStore(app));

extensions/ql-vscode/test/vscode-tests/activated-extension/variant-analysis/variant-analysis-monitor.test.ts

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import { commands, extensions } from "vscode";
2-
import { CodeQLExtensionInterface } from "../../../../src/extension";
1+
import { commands } from "vscode";
32

43
import * as ghApiClient from "../../../../src/variant-analysis/gh-api/gh-api-client";
54
import { VariantAnalysisMonitor } from "../../../../src/variant-analysis/variant-analysis-monitor";
@@ -25,11 +24,11 @@ import {
2524
import { createMockVariantAnalysis } from "../../../factories/variant-analysis/shared/variant-analysis";
2625
import { VariantAnalysisManager } from "../../../../src/variant-analysis/variant-analysis-manager";
2726
import { testCredentialsWithStub } from "../../../factories/authentication";
27+
import { getActivatedExtension } from "../../global.helper";
2828

2929
jest.setTimeout(60_000);
3030

3131
describe("Variant Analysis Monitor", () => {
32-
let extension: CodeQLExtensionInterface | Record<string, never>;
3332
let mockGetVariantAnalysis: jest.SpiedFunction<
3433
typeof ghApiClient.getVariantAnalysis
3534
>;
@@ -48,11 +47,7 @@ describe("Variant Analysis Monitor", () => {
4847

4948
shouldCancelMonitor = jest.fn();
5049

51-
extension = await extensions
52-
.getExtension<CodeQLExtensionInterface | Record<string, never>>(
53-
"GitHub.vscode-codeql",
54-
)!
55-
.activate();
50+
const extension = await getActivatedExtension();
5651
variantAnalysisMonitor = new VariantAnalysisMonitor(shouldCancelMonitor);
5752
variantAnalysisMonitor.onVariantAnalysisChange(onVariantAnalysisChangeSpy);
5853

extensions/ql-vscode/test/vscode-tests/cli-integration/databaseFetcher.test.ts

Lines changed: 10 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,19 @@
11
import { join } from "path";
2-
import { extensions, CancellationToken, Uri, window } from "vscode";
2+
import { CancellationToken, Uri, window } from "vscode";
33

4-
import { CodeQLExtensionInterface } from "../../../src/extension";
54
import { CodeQLCliServer } from "../../../src/cli";
65
import { DatabaseManager } from "../../../src/local-databases";
76
import {
87
importArchiveDatabase,
98
promptImportInternetDatabase,
109
} from "../../../src/databaseFetcher";
11-
import { cleanDatabases, dbLoc, DB_URL, storagePath } from "../global.helper";
10+
import {
11+
cleanDatabases,
12+
dbLoc,
13+
DB_URL,
14+
getActivatedExtension,
15+
storagePath,
16+
} from "../global.helper";
1217
import { createMockCommandManager } from "../../__mocks__/commandsMock";
1318

1419
jest.setTimeout(60_000);
@@ -30,18 +35,8 @@ describe("DatabaseFetcher", () => {
3035
jest.spyOn(window, "showErrorMessage").mockResolvedValue(undefined);
3136
jest.spyOn(window, "showInformationMessage").mockResolvedValue(undefined);
3237

33-
const extension = await extensions
34-
.getExtension<CodeQLExtensionInterface | Record<string, never>>(
35-
"GitHub.vscode-codeql",
36-
)!
37-
.activate();
38-
if ("databaseManager" in extension) {
39-
databaseManager = extension.databaseManager;
40-
} else {
41-
throw new Error(
42-
"Extension not initialized. Make sure cli is downloaded and installed properly.",
43-
);
44-
}
38+
const extension = await getActivatedExtension();
39+
databaseManager = extension.databaseManager;
4540

4641
await cleanDatabases(databaseManager);
4742
});

extensions/ql-vscode/test/vscode-tests/cli-integration/helpers.test.ts

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
11
import { join } from "path";
2-
import { extensions } from "vscode";
32

43
import { CodeQLCliServer } from "../../../src/cli";
5-
import { CodeQLExtensionInterface } from "../../../src/extension";
64
import { tryGetQueryMetadata } from "../../../src/helpers";
5+
import { getActivatedExtension } from "../global.helper";
76

87
// up to 3 minutes per test
98
jest.setTimeout(3 * 60 * 1000);
@@ -14,18 +13,8 @@ describe("helpers (with CLI)", () => {
1413
let cli: CodeQLCliServer;
1514

1615
beforeEach(async () => {
17-
const extension = await extensions
18-
.getExtension<CodeQLExtensionInterface | Record<string, never>>(
19-
"GitHub.vscode-codeql",
20-
)!
21-
.activate();
22-
if ("cliServer" in extension) {
23-
cli = extension.cliServer;
24-
} else {
25-
throw new Error(
26-
"Extension not initialized. Make sure cli is downloaded and installed properly.",
27-
);
28-
}
16+
const extension = await getActivatedExtension();
17+
cli = extension.cliServer;
2918
});
3019

3120
it("should get query metadata when available", async () => {

extensions/ql-vscode/test/vscode-tests/cli-integration/legacy-query.test.ts

Lines changed: 25 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,11 @@ import * as messages from "../../../src/pure/legacy-messages";
77
import * as qsClient from "../../../src/legacy-query-server/queryserver-client";
88
import * as cli from "../../../src/cli";
99
import { CellValue } from "../../../src/pure/bqrs-cli-types";
10-
import { extensions } from "vscode";
11-
import { CodeQLExtensionInterface } from "../../../src/extension";
1210
import { describeWithCodeQL } from "../cli";
1311
import { QueryServerClient } from "../../../src/legacy-query-server/queryserver-client";
1412
import { extLogger, ProgressReporter } from "../../../src/common";
1513
import { createMockApp } from "../../__mocks__/appMock";
14+
import { getActivatedExtension } from "../global.helper";
1615

1716
const baseDir = join(__dirname, "../../../test/data");
1817

@@ -112,41 +111,30 @@ describeWithCodeQL()("using the legacy query server", () => {
112111
let cliServer: cli.CodeQLCliServer;
113112

114113
beforeAll(async () => {
115-
const extension = await extensions
116-
.getExtension<CodeQLExtensionInterface | Record<string, never>>(
117-
"GitHub.vscode-codeql",
118-
)!
119-
.activate();
120-
if ("cliServer" in extension) {
121-
cliServer = extension.cliServer;
122-
cliServer.quiet = true;
123-
124-
qs = new QueryServerClient(
125-
createMockApp({}),
126-
{
127-
codeQlPath:
128-
(await extension.distributionManager.getCodeQlPathWithoutVersionCheck()) ||
129-
"",
130-
debug: false,
131-
cacheSize: 0,
132-
numThreads: 1,
133-
saveCache: false,
134-
timeoutSecs: 0,
135-
},
136-
cliServer,
137-
{
138-
contextStoragePath: tmpDir.name,
139-
logger: extLogger,
140-
},
141-
(task) =>
142-
task(nullProgressReporter, new CancellationTokenSource().token),
143-
);
144-
await qs.startQueryServer();
145-
} else {
146-
throw new Error(
147-
"Extension not initialized. Make sure cli is downloaded and installed properly.",
148-
);
149-
}
114+
const extension = await getActivatedExtension();
115+
cliServer = extension.cliServer;
116+
cliServer.quiet = true;
117+
118+
qs = new QueryServerClient(
119+
createMockApp({}),
120+
{
121+
codeQlPath:
122+
(await extension.distributionManager.getCodeQlPathWithoutVersionCheck()) ||
123+
"",
124+
debug: false,
125+
cacheSize: 0,
126+
numThreads: 1,
127+
saveCache: false,
128+
timeoutSecs: 0,
129+
},
130+
cliServer,
131+
{
132+
contextStoragePath: tmpDir.name,
133+
logger: extLogger,
134+
},
135+
(task) => task(nullProgressReporter, new CancellationTokenSource().token),
136+
);
137+
await qs.startQueryServer();
150138
});
151139

152140
for (const queryTestCase of queryTestCases) {

0 commit comments

Comments
 (0)