Skip to content

Commit a98b998

Browse files
authored
Add selected method and usage state to modeling store (#2869)
1 parent c699677 commit a98b998

File tree

4 files changed

+55
-16
lines changed

4 files changed

+55
-16
lines changed

extensions/ql-vscode/src/model-editor/model-editor-module.ts

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,11 @@ import { isQueryLanguage } from "../common/query-language";
1515
import { DisposableObject } from "../common/disposable-object";
1616
import { MethodsUsagePanel } from "./methods-usage/methods-usage-panel";
1717
import { Mode } from "./shared/mode";
18-
import { showResolvableLocation } from "../databases/local-databases/locations";
1918
import { Method, Usage } from "./method";
2019
import { setUpPack } from "./model-editor-queries";
2120
import { MethodModelingPanel } from "./method-modeling/method-modeling-panel";
2221
import { ModelingStore } from "./modeling-store";
22+
import { showResolvableLocation } from "../databases/local-databases/locations";
2323

2424
const SUPPORTED_LANGUAGES: string[] = ["java", "csharp"];
2525

@@ -43,6 +43,8 @@ export class ModelEditorModule extends DisposableObject {
4343
new MethodsUsagePanel(this.modelingStore, cliServer),
4444
);
4545
this.methodModelingPanel = this.push(new MethodModelingPanel(app));
46+
47+
this.registerToModelingStoreEvents();
4648
}
4749

4850
public static async initialize(
@@ -151,7 +153,6 @@ export class ModelEditorModule extends DisposableObject {
151153
db,
152154
modelFile,
153155
Mode.Application,
154-
this.showMethod.bind(this),
155156
);
156157

157158
this.modelingStore.onDbClosed(async (dbUri) => {
@@ -179,8 +180,7 @@ export class ModelEditorModule extends DisposableObject {
179180
usage: Usage,
180181
databaseItem: DatabaseItem,
181182
) => {
182-
await this.methodModelingPanel.setMethod(method);
183-
await showResolvableLocation(usage.url, databaseItem, this.app.logger);
183+
this.modelingStore.setSelectedMethod(databaseItem, method, usage);
184184
},
185185
};
186186
}
@@ -189,8 +189,21 @@ export class ModelEditorModule extends DisposableObject {
189189
await ensureDir(this.queryStorageDir);
190190
}
191191

192-
private async showMethod(method: Method, usage: Usage): Promise<void> {
192+
private registerToModelingStoreEvents(): void {
193+
this.push(
194+
this.modelingStore.onSelectedMethodChanged(async (event) => {
195+
await this.showMethod(event.databaseItem, event.method, event.usage);
196+
}),
197+
);
198+
}
199+
200+
private async showMethod(
201+
databaseItem: DatabaseItem,
202+
method: Method,
203+
usage: Usage,
204+
): Promise<void> {
193205
await this.methodsUsagePanel.revealItem(usage);
194206
await this.methodModelingPanel.setMethod(method);
207+
await showResolvableLocation(usage.url, databaseItem, this.app.logger);
195208
}
196209
}

extensions/ql-vscode/src/model-editor/model-editor-view.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,6 @@ import { asError, assertNever, getErrorMessage } from "../common/helpers-pure";
2626
import { runFlowModelQueries } from "./flow-model-queries";
2727
import { promptImportGithubDatabase } from "../databases/database-fetcher";
2828
import { App } from "../common/app";
29-
import { showResolvableLocation } from "../databases/local-databases/locations";
3029
import { redactableError } from "../common/errors";
3130
import {
3231
externalApiQueriesProgressMaxStep,
@@ -61,10 +60,6 @@ export class ModelEditorView extends AbstractWebview<
6160
private readonly databaseItem: DatabaseItem,
6261
private readonly extensionPack: ExtensionPack,
6362
private mode: Mode,
64-
private readonly showMethod: (
65-
method: Method,
66-
usage: Usage,
67-
) => Promise<void>,
6863
) {
6964
super(app);
7065

@@ -359,8 +354,7 @@ export class ModelEditorView extends AbstractWebview<
359354
}
360355

361356
protected async handleJumpToUsage(method: Method, usage: Usage) {
362-
await this.showMethod(method, usage);
363-
await showResolvableLocation(usage.url, this.databaseItem, this.app.logger);
357+
this.modelingStore.setSelectedMethod(this.databaseItem, method, usage);
364358
}
365359

366360
protected async loadExistingModeledMethods(): Promise<void> {
@@ -511,7 +505,6 @@ export class ModelEditorView extends AbstractWebview<
511505
addedDatabase,
512506
modelFile,
513507
Mode.Framework,
514-
this.showMethod,
515508
);
516509
await view.openView();
517510
});

extensions/ql-vscode/src/model-editor/modeling-store.ts

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { App } from "../common/app";
22
import { DisposableObject } from "../common/disposable-object";
33
import { AppEvent, AppEventEmitter } from "../common/events";
44
import { DatabaseItem } from "../databases/local-databases";
5-
import { Method } from "./method";
5+
import { Method, Usage } from "./method";
66
import { ModeledMethod } from "./modeled-method";
77
import { INITIAL_HIDE_MODELED_METHODS_VALUE } from "./shared/hide-modeled-methods";
88

@@ -12,6 +12,8 @@ interface DbModelingState {
1212
hideModeledMethods: boolean;
1313
modeledMethods: Record<string, ModeledMethod>;
1414
modifiedMethodSignatures: Set<string>;
15+
selectedMethod: Method | undefined;
16+
selectedUsage: Usage | undefined;
1517
}
1618

1719
interface MethodsChangedEvent {
@@ -37,13 +39,22 @@ interface ModifiedMethodsChangedEvent {
3739
isActiveDb: boolean;
3840
}
3941

42+
interface SelectedMethodChangedEvent {
43+
databaseItem: DatabaseItem;
44+
method: Method;
45+
usage: Usage;
46+
modeledMethod: ModeledMethod | undefined;
47+
isModified: boolean;
48+
}
49+
4050
export class ModelingStore extends DisposableObject {
4151
public readonly onActiveDbChanged: AppEvent<void>;
4252
public readonly onDbClosed: AppEvent<string>;
4353
public readonly onMethodsChanged: AppEvent<MethodsChangedEvent>;
4454
public readonly onHideModeledMethodsChanged: AppEvent<HideModeledMethodsChangedEvent>;
4555
public readonly onModeledMethodsChanged: AppEvent<ModeledMethodsChangedEvent>;
4656
public readonly onModifiedMethodsChanged: AppEvent<ModifiedMethodsChangedEvent>;
57+
public readonly onSelectedMethodChanged: AppEvent<SelectedMethodChangedEvent>;
4758

4859
private readonly state: Map<string, DbModelingState>;
4960
private activeDb: string | undefined;
@@ -54,6 +65,7 @@ export class ModelingStore extends DisposableObject {
5465
private readonly onHideModeledMethodsChangedEventEmitter: AppEventEmitter<HideModeledMethodsChangedEvent>;
5566
private readonly onModeledMethodsChangedEventEmitter: AppEventEmitter<ModeledMethodsChangedEvent>;
5667
private readonly onModifiedMethodsChangedEventEmitter: AppEventEmitter<ModifiedMethodsChangedEvent>;
68+
private readonly onSelectedMethodChangedEventEmitter: AppEventEmitter<SelectedMethodChangedEvent>;
5769

5870
constructor(app: App) {
5971
super();
@@ -92,6 +104,12 @@ export class ModelingStore extends DisposableObject {
92104
);
93105
this.onModifiedMethodsChanged =
94106
this.onModifiedMethodsChangedEventEmitter.event;
107+
108+
this.onSelectedMethodChangedEventEmitter = this.push(
109+
app.createEventEmitter<SelectedMethodChangedEvent>(),
110+
);
111+
this.onSelectedMethodChanged =
112+
this.onSelectedMethodChangedEventEmitter.event;
95113
}
96114

97115
public initializeStateForDb(databaseItem: DatabaseItem) {
@@ -102,6 +120,8 @@ export class ModelingStore extends DisposableObject {
102120
hideModeledMethods: INITIAL_HIDE_MODELED_METHODS_VALUE,
103121
modeledMethods: {},
104122
modifiedMethodSignatures: new Set(),
123+
selectedMethod: undefined,
124+
selectedUsage: undefined,
105125
});
106126
}
107127

@@ -229,6 +249,21 @@ export class ModelingStore extends DisposableObject {
229249
});
230250
}
231251

252+
public setSelectedMethod(dbItem: DatabaseItem, method: Method, usage: Usage) {
253+
const dbState = this.getState(dbItem);
254+
255+
dbState.selectedMethod = method;
256+
dbState.selectedUsage = usage;
257+
258+
this.onSelectedMethodChangedEventEmitter.fire({
259+
databaseItem: dbItem,
260+
method,
261+
usage,
262+
modeledMethod: dbState.modeledMethods[method.signature],
263+
isModified: dbState.modifiedMethodSignatures.has(method.signature),
264+
});
265+
}
266+
232267
private getState(databaseItem: DatabaseItem): DbModelingState {
233268
if (!this.state.has(databaseItem.databaseUri.toString())) {
234269
throw Error(

extensions/ql-vscode/test/vscode-tests/no-workspace/model-editor/model-editor-view.test.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ describe("ModelEditorView", () => {
3131
dataExtensions: ["models/**/*.yml"],
3232
};
3333
const mode = Mode.Application;
34-
const showMethod = jest.fn();
3534

3635
let view: ModelEditorView;
3736

@@ -47,7 +46,6 @@ describe("ModelEditorView", () => {
4746
databaseItem,
4847
extensionPack,
4948
mode,
50-
showMethod,
5149
);
5250
});
5351

0 commit comments

Comments
 (0)