From b946f3a509842507931d98c293b55798ffea22c5 Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 4 Mar 2024 17:07:49 +0000 Subject: [PATCH 1/7] Pull out setDatabaseItem method --- .../method-modeling-view-provider.ts | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts b/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts index 493c420b3a1..ad0dcf4aadd 100644 --- a/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts +++ b/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts @@ -52,6 +52,18 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider< }); } + private async setDatabaseItem(databaseItem: DatabaseItem): Promise { + this.databaseItem = databaseItem; + + await this.postMessage({ + t: "setInModelingMode", + inModelingMode: true, + }); + + this.language = tryGetQueryLanguage(databaseItem.language); + await this.setViewState(); + } + public async setMethod( databaseItem: DatabaseItem | undefined, method: Method | undefined, @@ -201,15 +213,7 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider< this.push( this.modelingEvents.onDbOpened(async (databaseItem) => { - this.databaseItem = databaseItem; - - await this.postMessage({ - t: "setInModelingMode", - inModelingMode: true, - }); - - this.language = tryGetQueryLanguage(databaseItem.language); - await this.setViewState(); + await this.setDatabaseItem(databaseItem); }), ); From a82be4258c2bcd6b61a17f85d0f8ef3b4e967f5a Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 4 Mar 2024 17:09:11 +0000 Subject: [PATCH 2/7] Pull out setSelectedMethod method --- .../method-modeling-view-provider.ts | 43 +++++++++++++------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts b/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts index ad0dcf4aadd..086dbd69317 100644 --- a/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts +++ b/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts @@ -16,6 +16,7 @@ import type { ModelingEvents } from "../modeling-events"; import type { QueryLanguage } from "../../common/query-language"; import { tryGetQueryLanguage } from "../../common/query-language"; import { createModelConfig } from "../languages"; +import type { ModeledMethod } from "../modeled-method"; export class MethodModelingViewProvider extends AbstractWebviewViewProvider< ToMethodModelingMessage, @@ -80,6 +81,28 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider< } } + private async setSelectedMethod( + databaseItem: DatabaseItem, + method: Method, + modeledMethods: readonly ModeledMethod[], + isModified: boolean, + isInProgress: boolean, + processedByAutoModel: boolean, + ): Promise { + this.method = method; + this.databaseItem = databaseItem; + this.language = tryGetQueryLanguage(databaseItem.language); + + await this.postMessage({ + t: "setSelectedMethod", + method, + modeledMethods, + isModified, + isInProgress, + processedByAutoModel, + }); + } + private async setInitialState(): Promise { if (this.modelingStore.hasStateForActiveDb()) { const selectedMethod = this.modelingStore.getSelectedMethodDetails(); @@ -195,18 +218,14 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider< this.push( this.modelingEvents.onSelectedMethodChanged(async (e) => { if (this.webviewView) { - this.method = e.method; - this.databaseItem = e.databaseItem; - this.language = tryGetQueryLanguage(e.databaseItem.language); - - await this.postMessage({ - t: "setSelectedMethod", - method: e.method, - modeledMethods: e.modeledMethods, - isModified: e.isModified, - isInProgress: e.isInProgress, - processedByAutoModel: e.processedByAutoModel, - }); + await this.setSelectedMethod( + e.databaseItem, + e.method, + e.modeledMethods, + e.isModified, + e.isInProgress, + e.processedByAutoModel, + ); } }), ); From d4413424c19121b2bd5b81539d8619f9480cc814 Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 4 Mar 2024 17:09:44 +0000 Subject: [PATCH 3/7] Rewrite setInitialState to always set all fields --- .../method-modeling-view-provider.ts | 42 +++++++++---------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts b/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts index 086dbd69317..208d56f861a 100644 --- a/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts +++ b/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts @@ -38,7 +38,7 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider< } protected override async onWebViewLoaded(): Promise { - await Promise.all([this.setViewState(), this.setInitialState()]); + await this.setInitialState(); this.registerToModelingEvents(); this.registerToModelConfigEvents(); } @@ -104,29 +104,25 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider< } private async setInitialState(): Promise { - if (this.modelingStore.hasStateForActiveDb()) { - const selectedMethod = this.modelingStore.getSelectedMethodDetails(); - if (selectedMethod) { - this.databaseItem = selectedMethod.databaseItem; - this.language = tryGetQueryLanguage( - selectedMethod.databaseItem.language, - ); - this.method = selectedMethod.method; - - await this.postMessage({ - t: "setSelectedMethod", - method: selectedMethod.method, - modeledMethods: selectedMethod.modeledMethods, - isModified: selectedMethod.isModified, - isInProgress: selectedMethod.isInProgress, - processedByAutoModel: selectedMethod.processedByAutoModel, - }); - } + await this.setViewState(); - await this.postMessage({ - t: "setInModelingMode", - inModelingMode: true, - }); + const stateForActiveDb = this.modelingStore.getStateForActiveDb(); + if (!stateForActiveDb) { + return; + } + + await this.setDatabaseItem(stateForActiveDb.databaseItem); + + const selectedMethod = this.modelingStore.getSelectedMethodDetails(); + if (selectedMethod) { + await this.setSelectedMethod( + stateForActiveDb.databaseItem, + selectedMethod.method, + selectedMethod.modeledMethods, + selectedMethod.isModified, + selectedMethod.isInProgress, + selectedMethod.processedByAutoModel, + ); } } From 08c6c8a50c53df05228b8f85e35d840e1da398ff Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 4 Mar 2024 17:20:34 +0000 Subject: [PATCH 4/7] Introduce SetNoMethodSelectedMessage --- extensions/ql-vscode/src/common/interface-types.ts | 5 +++++ .../method-modeling/method-modeling-view-provider.ts | 4 +++- .../src/view/method-modeling/MethodModelingView.tsx | 7 +++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/extensions/ql-vscode/src/common/interface-types.ts b/extensions/ql-vscode/src/common/interface-types.ts index 25c54208e05..1f642c8f776 100644 --- a/extensions/ql-vscode/src/common/interface-types.ts +++ b/extensions/ql-vscode/src/common/interface-types.ts @@ -703,6 +703,10 @@ interface SetMethodModifiedMessage { isModified: boolean; } +interface SetNoMethodSelectedMessage { + t: "setNoMethodSelected"; +} + interface SetSelectedMethodMessage { t: "setSelectedMethod"; method: Method; @@ -717,6 +721,7 @@ export type ToMethodModelingMessage = | SetMethodMessage | SetMultipleModeledMethodsMessage | SetMethodModifiedMessage + | SetNoMethodSelectedMessage | SetSelectedMethodMessage | SetInModelingModeMessage | SetInProgressMessage diff --git a/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts b/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts index 208d56f861a..1758eca6493 100644 --- a/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts +++ b/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts @@ -242,7 +242,9 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider< } if (dbUri === this.databaseItem?.databaseUri.toString()) { - await this.setMethod(undefined, undefined); + await this.postMessage({ + t: "setNoMethodSelected", + }); } }), ); diff --git a/extensions/ql-vscode/src/view/method-modeling/MethodModelingView.tsx b/extensions/ql-vscode/src/view/method-modeling/MethodModelingView.tsx index 69e76240c41..380cd4f5a85 100644 --- a/extensions/ql-vscode/src/view/method-modeling/MethodModelingView.tsx +++ b/extensions/ql-vscode/src/view/method-modeling/MethodModelingView.tsx @@ -62,6 +62,13 @@ export function MethodModelingView({ case "setMethodModified": setIsMethodModified(msg.isModified); break; + case "setNoMethodSelected": + setMethod(undefined); + setModeledMethods([]); + setIsMethodModified(false); + setIsModelingInProgress(false); + setIsProcessedByAutoModel(false); + break; case "setSelectedMethod": setMethod(msg.method); setModeledMethods(msg.modeledMethods); From 2f49ac83dedebcebec3fe5fb4f7c2ea79c5ef0f1 Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 4 Mar 2024 17:21:46 +0000 Subject: [PATCH 5/7] Remove setMethod which was only called from onSelectedMethodChanged which we already listen to --- .../ql-vscode/src/common/interface-types.ts | 6 ------ .../method-modeling/method-modeling-panel.ts | 9 --------- .../method-modeling-view-provider.ts | 16 ---------------- .../src/model-editor/model-editor-module.ts | 4 +--- .../view/method-modeling/MethodModelingView.tsx | 3 --- 5 files changed, 1 insertion(+), 37 deletions(-) diff --git a/extensions/ql-vscode/src/common/interface-types.ts b/extensions/ql-vscode/src/common/interface-types.ts index 1f642c8f776..cd0709a3ea1 100644 --- a/extensions/ql-vscode/src/common/interface-types.ts +++ b/extensions/ql-vscode/src/common/interface-types.ts @@ -693,11 +693,6 @@ interface SetMethodModelingPanelViewStateMessage { viewState: MethodModelingPanelViewState; } -interface SetMethodMessage { - t: "setMethod"; - method: Method | undefined; -} - interface SetMethodModifiedMessage { t: "setMethodModified"; isModified: boolean; @@ -718,7 +713,6 @@ interface SetSelectedMethodMessage { export type ToMethodModelingMessage = | SetMethodModelingPanelViewStateMessage - | SetMethodMessage | SetMultipleModeledMethodsMessage | SetMethodModifiedMessage | SetNoMethodSelectedMessage diff --git a/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-panel.ts b/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-panel.ts index 08e68a53d39..e5f9f4a0d64 100644 --- a/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-panel.ts +++ b/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-panel.ts @@ -2,10 +2,8 @@ import { window } from "vscode"; import type { App } from "../../common/app"; import { DisposableObject } from "../../common/disposable-object"; import { MethodModelingViewProvider } from "./method-modeling-view-provider"; -import type { Method } from "../method"; import type { ModelingStore } from "../modeling-store"; import { ModelConfigListener } from "../../config"; -import type { DatabaseItem } from "../../databases/local-databases"; import type { ModelingEvents } from "../modeling-events"; export class MethodModelingPanel extends DisposableObject { @@ -36,11 +34,4 @@ export class MethodModelingPanel extends DisposableObject { ), ); } - - public async setMethod( - databaseItem: DatabaseItem, - method: Method, - ): Promise { - await this.provider.setMethod(databaseItem, method); - } } diff --git a/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts b/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts index 1758eca6493..df9c9c34672 100644 --- a/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts +++ b/extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts @@ -65,22 +65,6 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider< await this.setViewState(); } - public async setMethod( - databaseItem: DatabaseItem | undefined, - method: Method | undefined, - ): Promise { - this.method = method; - this.databaseItem = databaseItem; - this.language = databaseItem && tryGetQueryLanguage(databaseItem.language); - - if (this.isShowingView) { - await this.postMessage({ - t: "setMethod", - method, - }); - } - } - private async setSelectedMethod( databaseItem: DatabaseItem, method: Method, diff --git a/extensions/ql-vscode/src/model-editor/model-editor-module.ts b/extensions/ql-vscode/src/model-editor/model-editor-module.ts index 7551835d1e4..e6e340c00c0 100644 --- a/extensions/ql-vscode/src/model-editor/model-editor-module.ts +++ b/extensions/ql-vscode/src/model-editor/model-editor-module.ts @@ -38,7 +38,6 @@ export class ModelEditorModule extends DisposableObject { private readonly modelingStore: ModelingStore; private readonly modelingEvents: ModelingEvents; private readonly methodsUsagePanel: MethodsUsagePanel; - private readonly methodModelingPanel: MethodModelingPanel; private readonly modelConfig: ModelConfigListener; private constructor( @@ -56,7 +55,7 @@ export class ModelEditorModule extends DisposableObject { this.methodsUsagePanel = this.push( new MethodsUsagePanel(this.modelingStore, this.modelingEvents, cliServer), ); - this.methodModelingPanel = this.push( + this.push( new MethodModelingPanel(app, this.modelingStore, this.modelingEvents), ); this.modelConfig = this.push(new ModelConfigListener()); @@ -132,7 +131,6 @@ export class ModelEditorModule extends DisposableObject { usage: Usage, ): Promise { await this.methodsUsagePanel.revealItem(method.signature, usage); - await this.methodModelingPanel.setMethod(databaseItem, method); await showResolvableLocation(usage.url, databaseItem, this.app.logger); } diff --git a/extensions/ql-vscode/src/view/method-modeling/MethodModelingView.tsx b/extensions/ql-vscode/src/view/method-modeling/MethodModelingView.tsx index 380cd4f5a85..8e68a351be6 100644 --- a/extensions/ql-vscode/src/view/method-modeling/MethodModelingView.tsx +++ b/extensions/ql-vscode/src/view/method-modeling/MethodModelingView.tsx @@ -53,9 +53,6 @@ export function MethodModelingView({ case "setInModelingMode": setInModelingMode(msg.inModelingMode); break; - case "setMethod": - setMethod(msg.method); - break; case "setMultipleModeledMethods": setModeledMethods(msg.modeledMethods); break; From fdd45e8dbdfaa18ca0a3ef93653bc0eec0a9cf62 Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 4 Mar 2024 17:26:37 +0000 Subject: [PATCH 6/7] Make revealItem private by listening to onSelectedMethodChanged --- .../methods-usage/methods-usage-panel.ts | 8 +++++- .../src/model-editor/model-editor-module.ts | 7 ++--- .../model-editor/modelingEventsMock.ts | 3 ++ .../methods-usage/methods-usage-panel.test.ts | 28 ++++++++++++++++--- 4 files changed, 36 insertions(+), 10 deletions(-) diff --git a/extensions/ql-vscode/src/model-editor/methods-usage/methods-usage-panel.ts b/extensions/ql-vscode/src/model-editor/methods-usage/methods-usage-panel.ts index ad6b93db16c..a71a31f0bb3 100644 --- a/extensions/ql-vscode/src/model-editor/methods-usage/methods-usage-panel.ts +++ b/extensions/ql-vscode/src/model-editor/methods-usage/methods-usage-panel.ts @@ -57,7 +57,7 @@ export class MethodsUsagePanel extends DisposableObject { }; } - public async revealItem( + private async revealItem( methodSignature: string, usage: Usage, ): Promise { @@ -108,6 +108,12 @@ export class MethodsUsagePanel extends DisposableObject { } }), ); + + this.push( + this.modelingEvents.onSelectedMethodChanged(async (event) => { + await this.revealItem(event.method.signature, event.usage); + }), + ); } private async handleStateChangeEvent(): Promise { diff --git a/extensions/ql-vscode/src/model-editor/model-editor-module.ts b/extensions/ql-vscode/src/model-editor/model-editor-module.ts index e6e340c00c0..b00ed96e8d0 100644 --- a/extensions/ql-vscode/src/model-editor/model-editor-module.ts +++ b/extensions/ql-vscode/src/model-editor/model-editor-module.ts @@ -37,7 +37,6 @@ export class ModelEditorModule extends DisposableObject { private readonly queryStorageDir: string; private readonly modelingStore: ModelingStore; private readonly modelingEvents: ModelingEvents; - private readonly methodsUsagePanel: MethodsUsagePanel; private readonly modelConfig: ModelConfigListener; private constructor( @@ -52,7 +51,7 @@ export class ModelEditorModule extends DisposableObject { this.queryStorageDir = join(baseQueryStorageDir, "model-editor-results"); this.modelingEvents = new ModelingEvents(app); this.modelingStore = new ModelingStore(this.modelingEvents); - this.methodsUsagePanel = this.push( + this.push( new MethodsUsagePanel(this.modelingStore, this.modelingEvents, cliServer), ); this.push( @@ -106,7 +105,7 @@ export class ModelEditorModule extends DisposableObject { private registerToModelingEvents(): void { this.push( this.modelingEvents.onSelectedMethodChanged(async (event) => { - await this.showMethod(event.databaseItem, event.method, event.usage); + await this.showMethod(event.databaseItem, event.usage); }), ); @@ -127,10 +126,8 @@ export class ModelEditorModule extends DisposableObject { private async showMethod( databaseItem: DatabaseItem, - method: Method, usage: Usage, ): Promise { - await this.methodsUsagePanel.revealItem(method.signature, usage); await showResolvableLocation(usage.url, databaseItem, this.app.logger); } diff --git a/extensions/ql-vscode/test/__mocks__/model-editor/modelingEventsMock.ts b/extensions/ql-vscode/test/__mocks__/model-editor/modelingEventsMock.ts index 396be26796f..e307cd1efb3 100644 --- a/extensions/ql-vscode/test/__mocks__/model-editor/modelingEventsMock.ts +++ b/extensions/ql-vscode/test/__mocks__/model-editor/modelingEventsMock.ts @@ -4,6 +4,7 @@ import type { ModelingEvents } from "../../../src/model-editor/modeling-events"; export function createMockModelingEvents({ onActiveDbChanged = jest.fn(), onDbClosed = jest.fn(), + onSelectedMethodChanged = jest.fn(), onMethodsChanged = jest.fn(), onHideModeledMethodsChanged = jest.fn(), onModeChanged = jest.fn(), @@ -16,6 +17,7 @@ export function createMockModelingEvents({ }: { onActiveDbChanged?: ModelingEvents["onActiveDbChanged"]; onDbClosed?: ModelingEvents["onDbClosed"]; + onSelectedMethodChanged?: ModelingEvents["onSelectedMethodChanged"]; onMethodsChanged?: ModelingEvents["onMethodsChanged"]; onHideModeledMethodsChanged?: ModelingEvents["onHideModeledMethodsChanged"]; onModeChanged?: ModelingEvents["onModeChanged"]; @@ -29,6 +31,7 @@ export function createMockModelingEvents({ return mockedObject({ onActiveDbChanged, onDbClosed, + onSelectedMethodChanged, onMethodsChanged, onHideModeledMethodsChanged, onModeChanged, diff --git a/extensions/ql-vscode/test/vscode-tests/no-workspace/model-editor/methods-usage/methods-usage-panel.test.ts b/extensions/ql-vscode/test/vscode-tests/no-workspace/model-editor/methods-usage/methods-usage-panel.test.ts index 0d290ec29ca..c742433b097 100644 --- a/extensions/ql-vscode/test/vscode-tests/no-workspace/model-editor/methods-usage/methods-usage-panel.test.ts +++ b/extensions/ql-vscode/test/vscode-tests/no-workspace/model-editor/methods-usage/methods-usage-panel.test.ts @@ -1,5 +1,5 @@ import type { TreeView } from "vscode"; -import { window } from "vscode"; +import { EventEmitter, window } from "vscode"; import type { CodeQLCliServer } from "../../../../../src/codeql-cli/cli"; import type { Method } from "../../../../../src/model-editor/method"; import { MethodsUsagePanel } from "../../../../../src/model-editor/methods-usage/methods-usage-panel"; @@ -66,6 +66,8 @@ describe("MethodsUsagePanel", () => { const modeledMethods: Record = {}; const modifiedMethodSignatures: Set = new Set(); const usage = createUsage(); + const selectedMethodChangedEmitter: ModelingEvents["onSelectedMethodChangedEventEmitter"] = + new EventEmitter(); beforeEach(() => { mockTreeView = mockedObject>({ @@ -74,7 +76,9 @@ describe("MethodsUsagePanel", () => { jest.spyOn(window, "createTreeView").mockReturnValue(mockTreeView); modelingStore = createMockModelingStore(); - modelingEvents = createMockModelingEvents(); + modelingEvents = createMockModelingEvents({ + onSelectedMethodChanged: selectedMethodChangedEmitter.event, + }); }); it("should reveal the correct item in the tree view", async () => { @@ -97,7 +101,15 @@ describe("MethodsUsagePanel", () => { modifiedMethodSignatures, ); - await panel.revealItem(method.signature, usage); + selectedMethodChangedEmitter.fire({ + databaseItem: dbItem, + method, + usage, + modeledMethods: modeledMethods[method.signature], + isModified: modifiedMethodSignatures.has(method.signature), + isInProgress: false, + processedByAutoModel: false, + }); expect(mockTreeView.reveal).toHaveBeenCalledWith( expect.objectContaining({ @@ -124,7 +136,15 @@ describe("MethodsUsagePanel", () => { modifiedMethodSignatures, ); - await panel.revealItem(method.signature, usage); + selectedMethodChangedEmitter.fire({ + databaseItem: dbItem, + method, + usage, + modeledMethods: modeledMethods[method.signature], + isModified: modifiedMethodSignatures.has(method.signature), + isInProgress: false, + processedByAutoModel: false, + }); expect(mockTreeView.reveal).not.toHaveBeenCalled(); }); From dc08da924fed9b93cc343da0a71fad541d2764ea Mon Sep 17 00:00:00 2001 From: Robert Date: Mon, 4 Mar 2024 17:27:34 +0000 Subject: [PATCH 7/7] Inline showMethod --- .../src/model-editor/model-editor-module.ts | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/extensions/ql-vscode/src/model-editor/model-editor-module.ts b/extensions/ql-vscode/src/model-editor/model-editor-module.ts index b00ed96e8d0..83edc7b0ed3 100644 --- a/extensions/ql-vscode/src/model-editor/model-editor-module.ts +++ b/extensions/ql-vscode/src/model-editor/model-editor-module.ts @@ -105,7 +105,11 @@ export class ModelEditorModule extends DisposableObject { private registerToModelingEvents(): void { this.push( this.modelingEvents.onSelectedMethodChanged(async (event) => { - await this.showMethod(event.databaseItem, event.usage); + await showResolvableLocation( + event.usage.url, + event.databaseItem, + this.app.logger, + ); }), ); @@ -124,13 +128,6 @@ export class ModelEditorModule extends DisposableObject { ); } - private async showMethod( - databaseItem: DatabaseItem, - usage: Usage, - ): Promise { - await showResolvableLocation(usage.url, databaseItem, this.app.logger); - } - private async openModelEditor(): Promise { { const db = this.databaseManager.currentDatabaseItem;