Merge pull request #3026 from github/koesie10/ask-for-display-language

Use language display name when asking for language
This commit is contained in:
Koen Vlaswinkel
2023-10-30 11:58:57 +01:00
committed by GitHub
6 changed files with 86 additions and 22 deletions

View File

@@ -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<QueryLanguage | undefined> {
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,

View File

@@ -32,6 +32,7 @@ import { AppCommandManager } from "../common/commands";
import { allowHttp } from "../config";
import { showAndLogInformationMessage } from "../common/logging";
import { AppOctokit } from "../common/octokit";
import { getLanguageDisplayName } from "../common/query-language";
/**
* Prompts a user to fetch a database from a remote location. Database is assumed to be an archive file.
@@ -579,10 +580,23 @@ export async function promptForLanguage(
return languages[0];
}
return await window.showQuickPick(languages, {
const items = languages
.map((language) => ({
label: getLanguageDisplayName(language),
description: language,
language,
}))
.sort((a, b) => a.label.localeCompare(b.label));
const selectedItem = await window.showQuickPick(items, {
placeHolder: "Select the database language to download:",
ignoreFocusOut: true,
});
if (!selectedItem) {
return undefined;
}
return selectedItem.language;
}
/**

View File

@@ -74,7 +74,7 @@ describe("SkeletonQueryWizard", () => {
beforeEach(async () => {
mockCli = mockedObject<CodeQLCliServer>({
resolveLanguages: jest
getSupportedLanguages: jest
.fn()
.mockResolvedValue([
"ruby",
@@ -85,7 +85,6 @@ describe("SkeletonQueryWizard", () => {
"csharp",
"cpp",
]),
getSupportedLanguages: jest.fn(),
});
mockApp = createMockApp();
@@ -112,9 +111,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);

View File

@@ -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();

View File

@@ -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");

View File

@@ -73,7 +73,12 @@ describe("database-fetcher", () => {
it("should convert a GitHub nwo to a database url", async () => {
mockRequest.mockResolvedValue(successfullMockApiResponse);
quickPickSpy.mockResolvedValue(mockedQuickPickItem("javascript"));
quickPickSpy.mockResolvedValue(
mockedQuickPickItem({
label: "JavaScript",
language: "javascript",
}),
);
const githubRepo = "github/codeql";
const result = await convertGithubNwoToDatabaseUrl(
githubRepo,
@@ -94,7 +99,23 @@ describe("database-fetcher", () => {
expect(owner).toBe("github");
expect(quickPickSpy).toHaveBeenNthCalledWith(
1,
["csharp", "javascript", "ql"],
[
expect.objectContaining({
label: "C#",
description: "csharp",
language: "csharp",
}),
expect.objectContaining({
label: "JavaScript",
description: "javascript",
language: "javascript",
}),
expect.objectContaining({
label: "ql",
description: "ql",
language: "ql",
}),
],
expect.anything(),
);
});