From dd5da2bbc0c18b78ad937de6b6a464764b949b0c Mon Sep 17 00:00:00 2001 From: Koen Vlaswinkel Date: Thu, 1 Dec 2022 13:39:35 +0100 Subject: [PATCH] Make query text and file commands consistent We were using two different implementations for opening the query file and query text between the query history and the results view. This moves the better implementation in the view to a command and uses these commands for opening the query text/file in the query history and view. This results in consistent error messages and behaviour between the two different views. --- extensions/ql-vscode/src/extension.ts | 18 +++++ extensions/ql-vscode/src/query-history.ts | 19 ++++- .../variant-analysis-manager.ts | 56 ++++++++++++++ .../remote-queries/variant-analysis-view.ts | 75 +++---------------- 4 files changed, 99 insertions(+), 69 deletions(-) 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,