diff --git a/extensions/ql-vscode/src/codeql-cli/query-language.ts b/extensions/ql-vscode/src/codeql-cli/query-language.ts index 2c176ad53..8ce960edc 100644 --- a/extensions/ql-vscode/src/codeql-cli/query-language.ts +++ b/extensions/ql-vscode/src/codeql-cli/query-language.ts @@ -1,6 +1,10 @@ import { CodeQLCliServer } from "./cli"; import { Uri, window } from "vscode"; -import { isQueryLanguage, QueryLanguage } from "../common/query-language"; +import { + getLanguageDisplayName, + isQueryLanguage, + QueryLanguage, +} from "../common/query-language"; import { getOnDiskWorkspaceFolders } from "../common/vscode/workspace-folders"; import { extLogger } from "../common/logging/vscode"; import { UserCancellationException } from "../common/vscode/progress"; @@ -46,14 +50,22 @@ export async function askForLanguage( cliServer: CodeQLCliServer, throwOnEmpty = true, ): Promise { - const language = await window.showQuickPick( - await cliServer.getSupportedLanguages(), - { - placeHolder: "Select target language for your query", - ignoreFocusOut: true, - }, - ); - if (!language) { + const supportedLanguages = await cliServer.getSupportedLanguages(); + + const items = supportedLanguages + .filter((language) => isQueryLanguage(language)) + .map((language) => ({ + label: getLanguageDisplayName(language), + description: language, + language, + })) + .sort((a, b) => a.label.localeCompare(b.label)); + + const selectedItem = await window.showQuickPick(items, { + placeHolder: "Select target language for your query", + ignoreFocusOut: true, + }); + if (!selectedItem) { // This only happens if the user cancels the quick pick. if (throwOnEmpty) { throw new UserCancellationException("Cancelled."); @@ -66,6 +78,8 @@ export async function askForLanguage( return undefined; } + const language = selectedItem.language; + if (!isQueryLanguage(language)) { void showAndLogErrorMessage( extLogger, diff --git a/extensions/ql-vscode/test/vscode-tests/cli-integration/local-queries/skeleton-query-wizard.test.ts b/extensions/ql-vscode/test/vscode-tests/cli-integration/local-queries/skeleton-query-wizard.test.ts index 9526e61cd..bfce98c6d 100644 --- a/extensions/ql-vscode/test/vscode-tests/cli-integration/local-queries/skeleton-query-wizard.test.ts +++ b/extensions/ql-vscode/test/vscode-tests/cli-integration/local-queries/skeleton-query-wizard.test.ts @@ -65,7 +65,7 @@ describe("SkeletonQueryWizard", () => { beforeEach(async () => { mockCli = mockedObject({ - resolveLanguages: jest + getSupportedLanguages: jest .fn() .mockResolvedValue([ "ruby", @@ -76,7 +76,6 @@ describe("SkeletonQueryWizard", () => { "csharp", "cpp", ]), - getSupportedLanguages: jest.fn(), }); mockDatabaseManager = mockedObject({ @@ -102,9 +101,12 @@ describe("SkeletonQueryWizard", () => { }, ] as WorkspaceFolder[]); - quickPickSpy = jest - .spyOn(window, "showQuickPick") - .mockResolvedValueOnce(mockedQuickPickItem(chosenLanguage)); + quickPickSpy = jest.spyOn(window, "showQuickPick").mockResolvedValueOnce( + mockedQuickPickItem({ + label: chosenLanguage, + language: chosenLanguage, + }), + ); showInputBoxSpy = jest .spyOn(window, "showInputBox") .mockResolvedValue(storagePath); diff --git a/extensions/ql-vscode/test/vscode-tests/cli-integration/variant-analysis/variant-analysis-manager.test.ts b/extensions/ql-vscode/test/vscode-tests/cli-integration/variant-analysis/variant-analysis-manager.test.ts index e1dedd3a6..ad6746956 100644 --- a/extensions/ql-vscode/test/vscode-tests/cli-integration/variant-analysis/variant-analysis-manager.test.ts +++ b/extensions/ql-vscode/test/vscode-tests/cli-integration/variant-analysis/variant-analysis-manager.test.ts @@ -79,9 +79,12 @@ describe("Variant Analysis Manager", () => { ).fsPath; beforeEach(async () => { - jest - .spyOn(window, "showQuickPick") - .mockResolvedValueOnce(mockedQuickPickItem("javascript")); + jest.spyOn(window, "showQuickPick").mockResolvedValueOnce( + mockedQuickPickItem({ + label: "JavaScript", + language: "javascript", + }), + ); cancellationTokenSource = new CancellationTokenSource(); diff --git a/extensions/ql-vscode/test/vscode-tests/cli-integration/variant-analysis/variant-analysis-submission-integration.test.ts b/extensions/ql-vscode/test/vscode-tests/cli-integration/variant-analysis/variant-analysis-submission-integration.test.ts index 458b3d7bd..7b9c18b3f 100644 --- a/extensions/ql-vscode/test/vscode-tests/cli-integration/variant-analysis/variant-analysis-submission-integration.test.ts +++ b/extensions/ql-vscode/test/vscode-tests/cli-integration/variant-analysis/variant-analysis-submission-integration.test.ts @@ -67,7 +67,12 @@ describe("Variant Analysis Submission Integration", () => { await showQlDocument("query.ql"); // Select target language for your query - quickPickSpy.mockResolvedValueOnce(mockedQuickPickItem("javascript")); + quickPickSpy.mockResolvedValueOnce( + mockedQuickPickItem({ + label: "JavaScript", + language: "javascript", + }), + ); await commandManager.execute("codeQL.runVariantAnalysis"); @@ -106,7 +111,12 @@ describe("Variant Analysis Submission Integration", () => { await showQlDocument("query.ql"); // Select target language for your query - quickPickSpy.mockResolvedValueOnce(mockedQuickPickItem("javascript")); + quickPickSpy.mockResolvedValueOnce( + mockedQuickPickItem({ + label: "JavaScript", + language: "javascript", + }), + ); await commandManager.execute("codeQL.runVariantAnalysis");