diff --git a/extensions/ql-vscode/src/extension.ts b/extensions/ql-vscode/src/extension.ts index ed5f13aa1..fb0358c84 100644 --- a/extensions/ql-vscode/src/extension.ts +++ b/extensions/ql-vscode/src/extension.ts @@ -1273,6 +1273,24 @@ async function activateWithInstalledDistribution( ), ); + ctx.subscriptions.push( + commandRunner( + "codeQL.openVariantAnalysisQueryText", + async (variantAnalysisId: number) => { + await variantAnalysisManager.openQueryText(variantAnalysisId); + }, + ), + ); + + ctx.subscriptions.push( + commandRunner( + "codeQL.openVariantAnalysisQueryFile", + async (variantAnalysisId: number) => { + await variantAnalysisManager.openQueryFile(variantAnalysisId); + }, + ), + ); + ctx.subscriptions.push( commandRunner("codeQL.openReferencedFile", openReferencedFile), ); diff --git a/extensions/ql-vscode/src/query-history.ts b/extensions/ql-vscode/src/query-history.ts index 6db66ba26..0052b860d 100644 --- a/extensions/ql-vscode/src/query-history.ts +++ b/extensions/ql-vscode/src/query-history.ts @@ -826,6 +826,14 @@ export class QueryHistoryManager extends DisposableObject { return; } + if (finalSingleItem.t === "variant-analysis") { + await commands.executeCommand( + "codeQL.openVariantAnalysisQueryFile", + finalSingleItem.variantAnalysis.id, + ); + return; + } + let queryPath: string; switch (finalSingleItem.t) { case "local": @@ -834,9 +842,6 @@ export class QueryHistoryManager extends DisposableObject { case "remote": queryPath = finalSingleItem.remoteQuery.queryFilePath; break; - case "variant-analysis": - queryPath = finalSingleItem.variantAnalysis.query.filePath; - break; default: assertNever(finalSingleItem); } @@ -1340,6 +1345,14 @@ export class QueryHistoryManager extends DisposableObject { return; } + if (finalSingleItem.t === "variant-analysis") { + await commands.executeCommand( + "codeQL.openVariantAnalysisQueryText", + finalSingleItem.variantAnalysis.id, + ); + return; + } + const params = new URLSearchParams({ isQuickEval: String( !!( diff --git a/extensions/ql-vscode/src/remote-queries/variant-analysis-manager.ts b/extensions/ql-vscode/src/remote-queries/variant-analysis-manager.ts index 89ccc31db..2d376a8a7 100644 --- a/extensions/ql-vscode/src/remote-queries/variant-analysis-manager.ts +++ b/extensions/ql-vscode/src/remote-queries/variant-analysis-manager.ts @@ -11,6 +11,9 @@ import { EventEmitter, ExtensionContext, Uri, + ViewColumn, + window as Window, + workspace, } from "vscode"; import { DisposableObject } from "../pure/disposable-object"; import { Credentials } from "../authentication"; @@ -43,6 +46,7 @@ import { createTimestampFile, showAndLogErrorMessage, showAndLogInformationMessage, + showAndLogWarningMessage, } from "../helpers"; import { readFile, readJson, remove, pathExists, outputJson } from "fs-extra"; import { EOL } from "os"; @@ -54,6 +58,7 @@ import { filterAndSortRepositoriesWithResults, RepositoriesFilterSortStateWithIds, } from "../pure/variant-analysis-filter-sort"; +import { URLSearchParams } from "url"; export class VariantAnalysisManager extends DisposableObject @@ -267,6 +272,57 @@ export class VariantAnalysisManager return; } + public async openQueryText(variantAnalysisId: number): Promise { + const variantAnalysis = await this.getVariantAnalysis(variantAnalysisId); + if (!variantAnalysis) { + void showAndLogWarningMessage( + "Could not open variant analysis query text. Variant analysis not found.", + ); + return; + } + + const filename = variantAnalysis.query.filePath; + + try { + const params = new URLSearchParams({ + variantAnalysisId: variantAnalysis.id.toString(), + }); + const uri = Uri.from({ + scheme: "codeql-variant-analysis", + path: filename, + query: params.toString(), + }); + const doc = await workspace.openTextDocument(uri); + await Window.showTextDocument(doc, { preview: false }); + } catch (error) { + void showAndLogWarningMessage( + "Could not open variant analysis query text. Failed to open text document.", + ); + } + } + + public async openQueryFile(variantAnalysisId: number): Promise { + const variantAnalysis = await this.getVariantAnalysis(variantAnalysisId); + + if (!variantAnalysis) { + void showAndLogWarningMessage( + "Could not open variant analysis query file", + ); + return; + } + + try { + const textDocument = await workspace.openTextDocument( + variantAnalysis.query.filePath, + ); + await Window.showTextDocument(textDocument, ViewColumn.One); + } catch (error) { + void showAndLogWarningMessage( + `Could not open file: ${variantAnalysis.query.filePath}`, + ); + } + } + public registerView(view: VariantAnalysisView): void { if (this.views.has(view.variantAnalysisId)) { throw new Error( diff --git a/extensions/ql-vscode/src/remote-queries/variant-analysis-view.ts b/extensions/ql-vscode/src/remote-queries/variant-analysis-view.ts index da53201cc..c8d91e1f2 100644 --- a/extensions/ql-vscode/src/remote-queries/variant-analysis-view.ts +++ b/extensions/ql-vscode/src/remote-queries/variant-analysis-view.ts @@ -1,12 +1,4 @@ -import { - commands, - ExtensionContext, - Uri, - ViewColumn, - window as Window, - workspace, -} from "vscode"; -import { URLSearchParams } from "url"; +import { commands, ExtensionContext, Uri, ViewColumn } from "vscode"; import { AbstractWebview, WebviewPanelConfig } from "../abstract-webview"; import { extLogger } from "../common"; import { @@ -129,10 +121,16 @@ export class VariantAnalysisView ); break; case "openQueryFile": - await this.openQueryFile(); + void commands.executeCommand( + "codeQL.openVariantAnalysisQueryFile", + this.variantAnalysisId, + ); break; case "openQueryText": - await this.openQueryText(); + void commands.executeCommand( + "codeQL.openVariantAnalysisQueryText", + this.variantAnalysisId, + ); break; case "copyRepositoryList": void commands.executeCommand( @@ -186,61 +184,6 @@ export class VariantAnalysisView }); } - private async openQueryFile(): Promise { - const variantAnalysis = await this.manager.getVariantAnalysis( - this.variantAnalysisId, - ); - - if (!variantAnalysis) { - void showAndLogWarningMessage( - "Could not open variant analysis query file", - ); - return; - } - - try { - const textDocument = await workspace.openTextDocument( - variantAnalysis.query.filePath, - ); - await Window.showTextDocument(textDocument, ViewColumn.One); - } catch (error) { - void showAndLogWarningMessage( - `Could not open file: ${variantAnalysis.query.filePath}`, - ); - } - } - - private async openQueryText(): Promise { - const variantAnalysis = await this.manager.getVariantAnalysis( - this.variantAnalysisId, - ); - if (!variantAnalysis) { - void showAndLogWarningMessage( - "Could not open variant analysis query text. Variant analysis not found.", - ); - return; - } - - const filename = variantAnalysis.query.filePath; - - try { - const params = new URLSearchParams({ - variantAnalysisId: variantAnalysis.id.toString(), - }); - const uri = Uri.from({ - scheme: "codeql-variant-analysis", - path: filename, - query: params.toString(), - }); - const doc = await workspace.openTextDocument(uri); - await Window.showTextDocument(doc, { preview: false }); - } catch (error) { - void showAndLogWarningMessage( - "Could not open variant analysis query text. Failed to open text document.", - ); - } - } - private async openLogs(): Promise { const variantAnalysis = await this.manager.getVariantAnalysis( this.variantAnalysisId,