Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 5 additions & 6 deletions extensions/ql-vscode/src/common/interface-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -693,16 +693,15 @@ interface SetMethodModelingPanelViewStateMessage {
viewState: MethodModelingPanelViewState;
}

interface SetMethodMessage {
t: "setMethod";
method: Method | undefined;
}

interface SetMethodModifiedMessage {
t: "setMethodModified";
isModified: boolean;
}

interface SetNoMethodSelectedMessage {
t: "setNoMethodSelected";
}

interface SetSelectedMethodMessage {
t: "setSelectedMethod";
method: Method;
Expand All @@ -714,9 +713,9 @@ interface SetSelectedMethodMessage {

export type ToMethodModelingMessage =
| SetMethodModelingPanelViewStateMessage
| SetMethodMessage
| SetMultipleModeledMethodsMessage
| SetMethodModifiedMessage
| SetNoMethodSelectedMessage
| SetSelectedMethodMessage
| SetInModelingModeMessage
| SetInProgressMessage
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -36,11 +34,4 @@ export class MethodModelingPanel extends DisposableObject {
),
);
}

public async setMethod(
databaseItem: DatabaseItem,
method: Method,
): Promise<void> {
await this.provider.setMethod(databaseItem, method);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -37,7 +38,7 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
}

protected override async onWebViewLoaded(): Promise<void> {
await Promise.all([this.setViewState(), this.setInitialState()]);
await this.setInitialState();
this.registerToModelingEvents();
this.registerToModelConfigEvents();
}
Expand All @@ -52,46 +53,60 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
});
}

public async setMethod(
databaseItem: DatabaseItem | undefined,
method: Method | undefined,
private async setDatabaseItem(databaseItem: DatabaseItem): Promise<void> {
this.databaseItem = databaseItem;

await this.postMessage({
t: "setInModelingMode",
inModelingMode: true,
});

this.language = tryGetQueryLanguage(databaseItem.language);
await this.setViewState();
}

private async setSelectedMethod(
databaseItem: DatabaseItem,
method: Method,
modeledMethods: readonly ModeledMethod[],
isModified: boolean,
isInProgress: boolean,
processedByAutoModel: boolean,
): Promise<void> {
this.method = method;
this.databaseItem = databaseItem;
this.language = databaseItem && tryGetQueryLanguage(databaseItem.language);
this.language = tryGetQueryLanguage(databaseItem.language);

if (this.isShowingView) {
await this.postMessage({
t: "setMethod",
method,
});
}
await this.postMessage({
t: "setSelectedMethod",
method,
modeledMethods,
isModified,
isInProgress,
processedByAutoModel,
});
}

private async setInitialState(): Promise<void> {
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();

const stateForActiveDb = this.modelingStore.getStateForActiveDb();
if (!stateForActiveDb) {
return;
}

await this.setDatabaseItem(stateForActiveDb.databaseItem);

await this.postMessage({
t: "setInModelingMode",
inModelingMode: true,
});
const selectedMethod = this.modelingStore.getSelectedMethodDetails();
if (selectedMethod) {
await this.setSelectedMethod(
stateForActiveDb.databaseItem,
selectedMethod.method,
selectedMethod.modeledMethods,
selectedMethod.isModified,
selectedMethod.isInProgress,
selectedMethod.processedByAutoModel,
);
}
}

Expand Down Expand Up @@ -183,33 +198,21 @@ 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,
);
}
}),
);

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);
}),
);

Expand All @@ -223,7 +226,9 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
}

if (dbUri === this.databaseItem?.databaseUri.toString()) {
await this.setMethod(undefined, undefined);
await this.postMessage({
t: "setNoMethodSelected",
});
}
}),
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ export class MethodsUsagePanel extends DisposableObject {
};
}

public async revealItem(
private async revealItem(
methodSignature: string,
usage: Usage,
): Promise<void> {
Expand Down Expand Up @@ -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<void> {
Expand Down
22 changes: 7 additions & 15 deletions extensions/ql-vscode/src/model-editor/model-editor-module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -37,8 +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 methodModelingPanel: MethodModelingPanel;
private readonly modelConfig: ModelConfigListener;

private constructor(
Expand All @@ -53,10 +51,10 @@ 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.methodModelingPanel = this.push(
this.push(
new MethodModelingPanel(app, this.modelingStore, this.modelingEvents),
);
this.modelConfig = this.push(new ModelConfigListener());
Expand Down Expand Up @@ -107,7 +105,11 @@ 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 showResolvableLocation(
event.usage.url,
event.databaseItem,
this.app.logger,
);
}),
);

Expand All @@ -126,16 +128,6 @@ export class ModelEditorModule extends DisposableObject {
);
}

private async showMethod(
databaseItem: DatabaseItem,
method: Method,
usage: Usage,
): Promise<void> {
await this.methodsUsagePanel.revealItem(method.signature, usage);
await this.methodModelingPanel.setMethod(databaseItem, method);
await showResolvableLocation(usage.url, databaseItem, this.app.logger);
}

private async openModelEditor(): Promise<void> {
{
const db = this.databaseManager.currentDatabaseItem;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,15 +53,19 @@ export function MethodModelingView({
case "setInModelingMode":
setInModelingMode(msg.inModelingMode);
break;
case "setMethod":
setMethod(msg.method);
break;
case "setMultipleModeledMethods":
setModeledMethods(msg.modeledMethods);
break;
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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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(),
Expand All @@ -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"];
Expand All @@ -29,6 +31,7 @@ export function createMockModelingEvents({
return mockedObject<ModelingEvents>({
onActiveDbChanged,
onDbClosed,
onSelectedMethodChanged,
onMethodsChanged,
onHideModeledMethodsChanged,
onModeChanged,
Expand Down
Loading