From f4d6990c1f634d57dcae6b0afb77058ab87e532d Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 8 Aug 2023 14:40:05 +0100 Subject: [PATCH 1/5] Move duplicated error handling into showResolvableLocation --- .../data-extensions-editor-view.ts | 16 +----------- .../databases/local-databases/locations.ts | 25 ++++++++++--------- 2 files changed, 14 insertions(+), 27 deletions(-) diff --git a/extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-view.ts b/extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-view.ts index a99a0145d..9ed5d3a10 100644 --- a/extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-view.ts +++ b/extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-view.ts @@ -230,21 +230,7 @@ export class DataExtensionsEditorView extends AbstractWebview< protected async jumpToUsage( location: ResolvableLocationValue, ): Promise { - try { - await showResolvableLocation(location, this.databaseItem); - } catch (e) { - if (e instanceof Error) { - if (e.message.match(/File not found/)) { - void window.showErrorMessage( - "Original file of this result is not in the database's source archive.", - ); - } else { - void this.app.logger.log(`Unable to handleMsgFromView: ${e.message}`); - } - } else { - void this.app.logger.log(`Unable to handleMsgFromView: ${e}`); - } - } + await showResolvableLocation(location, this.databaseItem, this.app.logger); } protected async loadExistingModeledMethods(): Promise { diff --git a/extensions/ql-vscode/src/databases/local-databases/locations.ts b/extensions/ql-vscode/src/databases/local-databases/locations.ts index 5654b01b1..9625cca3d 100644 --- a/extensions/ql-vscode/src/databases/local-databases/locations.ts +++ b/extensions/ql-vscode/src/databases/local-databases/locations.ts @@ -97,8 +97,19 @@ export function tryResolveLocation( export async function showResolvableLocation( loc: ResolvableLocationValue, databaseItem: DatabaseItem, + logger: Logger, ): Promise { - await showLocation(tryResolveLocation(loc, databaseItem)); + try { + await showLocation(tryResolveLocation(loc, databaseItem)); + } catch (e) { + if (e instanceof Error && e.message.match(/File not found/)) { + void Window.showErrorMessage( + "Original file of this result is not in the database's source archive.", + ); + } else { + void logger.log(`Unable to jump to location: ${getErrorMessage(e)}`); + } + } } export async function showLocation(location?: Location) { @@ -146,16 +157,6 @@ export async function jumpToLocation( ) { const databaseItem = databaseManager.findDatabaseItem(Uri.parse(databaseUri)); if (databaseItem !== undefined) { - try { - await showResolvableLocation(loc, databaseItem); - } catch (e) { - if (e instanceof Error && e.message.match(/File not found/)) { - void Window.showErrorMessage( - "Original file of this result is not in the database's source archive.", - ); - } else { - void logger.log(`Unable to jump to location: ${getErrorMessage(e)}`); - } - } + await showResolvableLocation(loc, databaseItem, logger); } } From 946607098a45f7ea707d193d79c913c14eab3aa3 Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 8 Aug 2023 14:46:23 +0100 Subject: [PATCH 2/5] Add command to jump to usage location --- extensions/ql-vscode/src/common/commands.ts | 5 +++++ .../data-extensions-editor-module.ts | 10 +++++++++- .../ql-vscode/test/unit-tests/command-lint.test.ts | 3 ++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/extensions/ql-vscode/src/common/commands.ts b/extensions/ql-vscode/src/common/commands.ts index d4035dcd1..516f5c846 100644 --- a/extensions/ql-vscode/src/common/commands.ts +++ b/extensions/ql-vscode/src/common/commands.ts @@ -12,6 +12,7 @@ import type { } from "../variant-analysis/shared/variant-analysis"; import type { QLDebugConfiguration } from "../debugger/debug-configuration"; import type { QueryTreeViewItem } from "../queries-panel/query-tree-view-item"; +import type { Usage } from "../data-extensions-editor/external-api-usage"; // A command function matching the signature that VS Code calls when // a command is invoked from a context menu on a TreeView with @@ -304,6 +305,10 @@ export type PackagingCommands = { export type DataExtensionsEditorCommands = { "codeQL.openDataExtensionsEditor": () => Promise; + "codeQLDataExtensions.jumpToUsageLocation": ( + usage: Usage, + databaseItem: DatabaseItem, + ) => Promise; }; export type EvalLogViewerCommands = { diff --git a/extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-module.ts b/extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-module.ts index cd60d3c10..a0529b934 100644 --- a/extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-module.ts +++ b/extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-module.ts @@ -3,7 +3,7 @@ import { DataExtensionsEditorView } from "./data-extensions-editor-view"; import { DataExtensionsEditorCommands } from "../common/commands"; import { CliVersionConstraint, CodeQLCliServer } from "../codeql-cli/cli"; import { QueryRunner } from "../query-server"; -import { DatabaseManager } from "../databases/local-databases"; +import { DatabaseItem, DatabaseManager } from "../databases/local-databases"; import { ensureDir } from "fs-extra"; import { join } from "path"; import { App } from "../common/app"; @@ -23,6 +23,8 @@ import { setUpPack } from "./external-api-usage-query"; import { DisposableObject } from "../common/disposable-object"; import { ModelDetailsPanel } from "./model-details/model-details-panel"; import { Mode } from "./shared/mode"; +import { showResolvableLocation } from "../databases/local-databases/locations"; +import { Usage } from "./external-api-usage"; const SUPPORTED_LANGUAGES: string[] = ["java", "csharp"]; @@ -154,6 +156,12 @@ export class DataExtensionsEditorModule extends DisposableObject { }, ); }, + "codeQLDataExtensions.jumpToUsageLocation": async ( + usage: Usage, + databaseItem: DatabaseItem, + ) => { + await showResolvableLocation(usage.url, databaseItem, this.app.logger); + }, }; } diff --git a/extensions/ql-vscode/test/unit-tests/command-lint.test.ts b/extensions/ql-vscode/test/unit-tests/command-lint.test.ts index 747b144d2..b9109bcd7 100644 --- a/extensions/ql-vscode/test/unit-tests/command-lint.test.ts +++ b/extensions/ql-vscode/test/unit-tests/command-lint.test.ts @@ -44,7 +44,8 @@ describe("commands declared in package.json", () => { command.match(/^codeQLQueryHistory\./) || command.match(/^codeQLAstViewer\./) || command.match(/^codeQLEvalLogViewer\./) || - command.match(/^codeQLTests\./) + command.match(/^codeQLTests\./) || + command.match(/^codeQLDataExtensions\./) ) { scopedCmds.add(command); expect(title).toBeDefined(); From 16d5f0f12b3e879fd3e9cb6c677bf423ccedae1a Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 8 Aug 2023 14:58:42 +0100 Subject: [PATCH 3/5] Add DatabaseItem to model details panel state --- .../data-extensions-editor-module.ts | 2 +- .../data-extensions-editor-view.ts | 10 +++++++--- .../model-details/model-details-data-provider.ts | 8 +++++++- .../model-details/model-details-panel.ts | 8 ++++++-- 4 files changed, 21 insertions(+), 7 deletions(-) diff --git a/extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-module.ts b/extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-module.ts index a0529b934..e71ef7152 100644 --- a/extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-module.ts +++ b/extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-module.ts @@ -147,7 +147,7 @@ export class DataExtensionsEditorModule extends DisposableObject { db, modelFile, Mode.Application, - (usages) => this.modelDetailsPanel.setExternalApiUsages(usages), + this.modelDetailsPanel.setState.bind(this.modelDetailsPanel), ); await view.openView(); }, diff --git a/extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-view.ts b/extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-view.ts index 9ed5d3a10..0d69fe181 100644 --- a/extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-view.ts +++ b/extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-view.ts @@ -77,8 +77,9 @@ export class DataExtensionsEditorView extends AbstractWebview< private readonly databaseItem: DatabaseItem, private readonly extensionPack: ExtensionPack, private mode: Mode, - private readonly onExternalApiUsagesChanged: ( + private readonly updateModelDetailsPanelState: ( externalApiUsages: ExternalApiUsage[], + databaseItem: DatabaseItem, ) => void, ) { super(ctx); @@ -296,7 +297,10 @@ export class DataExtensionsEditorView extends AbstractWebview< t: "setExternalApiUsages", externalApiUsages, }); - this.onExternalApiUsagesChanged(externalApiUsages); + this.updateModelDetailsPanelState( + externalApiUsages, + this.databaseItem, + ); } catch (err) { void showAndLogExceptionWithTelemetry( this.app.logger, @@ -578,7 +582,7 @@ export class DataExtensionsEditorView extends AbstractWebview< addedDatabase, modelFile, Mode.Framework, - this.onExternalApiUsagesChanged, + this.updateModelDetailsPanelState, ); await view.openView(); }); diff --git a/extensions/ql-vscode/src/data-extensions-editor/model-details/model-details-data-provider.ts b/extensions/ql-vscode/src/data-extensions-editor/model-details/model-details-data-provider.ts index 8f88f199d..73aaaa4c3 100644 --- a/extensions/ql-vscode/src/data-extensions-editor/model-details/model-details-data-provider.ts +++ b/extensions/ql-vscode/src/data-extensions-editor/model-details/model-details-data-provider.ts @@ -7,12 +7,14 @@ import { } from "vscode"; import { DisposableObject } from "../../common/disposable-object"; import { ExternalApiUsage, Usage } from "../external-api-usage"; +import { DatabaseItem } from "../../databases/local-databases"; export class ModelDetailsDataProvider extends DisposableObject implements TreeDataProvider { private externalApiUsages: ExternalApiUsage[] = []; + private databaseItem: DatabaseItem | undefined = undefined; private readonly onDidChangeTreeDataEmitter = this.push( new EventEmitter(), @@ -22,8 +24,12 @@ export class ModelDetailsDataProvider return this.onDidChangeTreeDataEmitter.event; } - public setExternalApiUsages(externalApiUsages: ExternalApiUsage[]): void { + public setState( + externalApiUsages: ExternalApiUsage[], + databaseItem: DatabaseItem, + ): void { this.externalApiUsages = externalApiUsages; + this.databaseItem = databaseItem; this.onDidChangeTreeDataEmitter.fire(); } diff --git a/extensions/ql-vscode/src/data-extensions-editor/model-details/model-details-panel.ts b/extensions/ql-vscode/src/data-extensions-editor/model-details/model-details-panel.ts index 26c6c862d..c2755b8e7 100644 --- a/extensions/ql-vscode/src/data-extensions-editor/model-details/model-details-panel.ts +++ b/extensions/ql-vscode/src/data-extensions-editor/model-details/model-details-panel.ts @@ -2,6 +2,7 @@ import { window } from "vscode"; import { DisposableObject } from "../../common/disposable-object"; import { ModelDetailsDataProvider } from "./model-details-data-provider"; import { ExternalApiUsage } from "../external-api-usage"; +import { DatabaseItem } from "../../databases/local-databases"; export class ModelDetailsPanel extends DisposableObject { private readonly dataProvider: ModelDetailsDataProvider; @@ -17,7 +18,10 @@ export class ModelDetailsPanel extends DisposableObject { this.push(treeView); } - public setExternalApiUsages(externalApiUsages: ExternalApiUsage[]): void { - this.dataProvider.setExternalApiUsages(externalApiUsages); + public setState( + externalApiUsages: ExternalApiUsage[], + databaseItem: DatabaseItem, + ): void { + this.dataProvider.setState(externalApiUsages, databaseItem); } } From 7443b35ebc2dc2a3a591904cf6b2d54833080fcf Mon Sep 17 00:00:00 2001 From: Robert Date: Tue, 8 Aug 2023 15:04:45 +0100 Subject: [PATCH 4/5] Jump to location when clicking on usage --- .../model-details/model-details-data-provider.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/extensions/ql-vscode/src/data-extensions-editor/model-details/model-details-data-provider.ts b/extensions/ql-vscode/src/data-extensions-editor/model-details/model-details-data-provider.ts index 73aaaa4c3..83c133f67 100644 --- a/extensions/ql-vscode/src/data-extensions-editor/model-details/model-details-data-provider.ts +++ b/extensions/ql-vscode/src/data-extensions-editor/model-details/model-details-data-provider.ts @@ -43,6 +43,11 @@ export class ModelDetailsDataProvider return { label: item.label, collapsibleState: TreeItemCollapsibleState.None, + command: { + title: "Show usage", + command: "codeQLDataExtensions.jumpToUsageLocation", + arguments: [item, this.databaseItem], + }, }; } } From 113979062021c24e1c35ebf3a6971c6aa2caec07 Mon Sep 17 00:00:00 2001 From: Robert Date: Wed, 9 Aug 2023 11:57:19 +0100 Subject: [PATCH 5/5] Rename command from codeQLDataExtensions => codeQLDataExtensionsEditor --- extensions/ql-vscode/src/common/commands.ts | 2 +- .../src/data-extensions-editor/data-extensions-editor-module.ts | 2 +- .../model-details/model-details-data-provider.ts | 2 +- extensions/ql-vscode/test/unit-tests/command-lint.test.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/extensions/ql-vscode/src/common/commands.ts b/extensions/ql-vscode/src/common/commands.ts index 516f5c846..fc8a7de4b 100644 --- a/extensions/ql-vscode/src/common/commands.ts +++ b/extensions/ql-vscode/src/common/commands.ts @@ -305,7 +305,7 @@ export type PackagingCommands = { export type DataExtensionsEditorCommands = { "codeQL.openDataExtensionsEditor": () => Promise; - "codeQLDataExtensions.jumpToUsageLocation": ( + "codeQLDataExtensionsEditor.jumpToUsageLocation": ( usage: Usage, databaseItem: DatabaseItem, ) => Promise; diff --git a/extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-module.ts b/extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-module.ts index e71ef7152..918e28c78 100644 --- a/extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-module.ts +++ b/extensions/ql-vscode/src/data-extensions-editor/data-extensions-editor-module.ts @@ -156,7 +156,7 @@ export class DataExtensionsEditorModule extends DisposableObject { }, ); }, - "codeQLDataExtensions.jumpToUsageLocation": async ( + "codeQLDataExtensionsEditor.jumpToUsageLocation": async ( usage: Usage, databaseItem: DatabaseItem, ) => { diff --git a/extensions/ql-vscode/src/data-extensions-editor/model-details/model-details-data-provider.ts b/extensions/ql-vscode/src/data-extensions-editor/model-details/model-details-data-provider.ts index 83c133f67..b8569a0ee 100644 --- a/extensions/ql-vscode/src/data-extensions-editor/model-details/model-details-data-provider.ts +++ b/extensions/ql-vscode/src/data-extensions-editor/model-details/model-details-data-provider.ts @@ -45,7 +45,7 @@ export class ModelDetailsDataProvider collapsibleState: TreeItemCollapsibleState.None, command: { title: "Show usage", - command: "codeQLDataExtensions.jumpToUsageLocation", + command: "codeQLDataExtensionsEditor.jumpToUsageLocation", arguments: [item, this.databaseItem], }, }; diff --git a/extensions/ql-vscode/test/unit-tests/command-lint.test.ts b/extensions/ql-vscode/test/unit-tests/command-lint.test.ts index b9109bcd7..1475b5b23 100644 --- a/extensions/ql-vscode/test/unit-tests/command-lint.test.ts +++ b/extensions/ql-vscode/test/unit-tests/command-lint.test.ts @@ -45,7 +45,7 @@ describe("commands declared in package.json", () => { command.match(/^codeQLAstViewer\./) || command.match(/^codeQLEvalLogViewer\./) || command.match(/^codeQLTests\./) || - command.match(/^codeQLDataExtensions\./) + command.match(/^codeQLDataExtensionsEditor\./) ) { scopedCmds.add(command); expect(title).toBeDefined();