Skip to content

Commit be2891d

Browse files
authored
Replace ModelEditorViewTracker with modeling store and events (#3065)
1 parent 9e914c9 commit be2891d

File tree

10 files changed

+79
-102
lines changed

10 files changed

+79
-102
lines changed

extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-panel.ts

-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { DisposableObject } from "../../common/disposable-object";
44
import { MethodModelingViewProvider } from "./method-modeling-view-provider";
55
import { Method } from "../method";
66
import { ModelingStore } from "../modeling-store";
7-
import { ModelEditorViewTracker } from "../model-editor-view-tracker";
87
import { ModelConfigListener } from "../../config";
98
import { DatabaseItem } from "../../databases/local-databases";
109
import { ModelingEvents } from "../modeling-events";
@@ -16,7 +15,6 @@ export class MethodModelingPanel extends DisposableObject {
1615
app: App,
1716
modelingStore: ModelingStore,
1817
modelingEvents: ModelingEvents,
19-
editorViewTracker: ModelEditorViewTracker,
2018
) {
2119
super();
2220

@@ -29,7 +27,6 @@ export class MethodModelingPanel extends DisposableObject {
2927
app,
3028
modelingStore,
3129
modelingEvents,
32-
editorViewTracker,
3330
modelConfig,
3431
);
3532
this.push(

extensions/ql-vscode/src/model-editor/method-modeling/method-modeling-view-provider.ts

+2-4
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import { Method } from "../method";
1010
import { ModelingStore } from "../modeling-store";
1111
import { AbstractWebviewViewProvider } from "../../common/vscode/abstract-webview-view-provider";
1212
import { assertNever } from "../../common/helpers-pure";
13-
import { ModelEditorViewTracker } from "../model-editor-view-tracker";
1413
import { ModelConfigListener } from "../../config";
1514
import { DatabaseItem } from "../../databases/local-databases";
1615
import { ModelingEvents } from "../modeling-events";
@@ -33,7 +32,6 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
3332
app: App,
3433
private readonly modelingStore: ModelingStore,
3534
private readonly modelingEvents: ModelingEvents,
36-
private readonly editorViewTracker: ModelEditorViewTracker,
3735
private readonly modelConfig: ModelConfigListener,
3836
) {
3937
super(app, "method-modeling");
@@ -158,10 +156,10 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
158156
return;
159157
}
160158

161-
const view = this.editorViewTracker.getView(
159+
this.modelingEvents.fireRevealInModelEditorEvent(
162160
this.databaseItem.databaseUri.toString(),
161+
method,
163162
);
164-
await view?.revealMethod(method);
165163
}
166164

167165
private registerToModelingEvents(): void {

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

+9-22
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import { setUpPack } from "./model-editor-queries-setup";
1919
import { MethodModelingPanel } from "./method-modeling/method-modeling-panel";
2020
import { ModelingStore } from "./modeling-store";
2121
import { showResolvableLocation } from "../databases/local-databases/locations";
22-
import { ModelEditorViewTracker } from "./model-editor-view-tracker";
2322
import { ModelConfigListener } from "../config";
2423
import { ModelingEvents } from "./modeling-events";
2524
import { getModelsAsDataLanguage } from "./languages";
@@ -30,7 +29,6 @@ export class ModelEditorModule extends DisposableObject {
3029
private readonly queryStorageDir: string;
3130
private readonly modelingStore: ModelingStore;
3231
private readonly modelingEvents: ModelingEvents;
33-
private readonly editorViewTracker: ModelEditorViewTracker<ModelEditorView>;
3432
private readonly methodsUsagePanel: MethodsUsagePanel;
3533
private readonly methodModelingPanel: MethodModelingPanel;
3634
private readonly modelConfig: ModelConfigListener;
@@ -46,17 +44,11 @@ export class ModelEditorModule extends DisposableObject {
4644
this.queryStorageDir = join(baseQueryStorageDir, "model-editor-results");
4745
this.modelingEvents = new ModelingEvents(app);
4846
this.modelingStore = new ModelingStore(this.modelingEvents);
49-
this.editorViewTracker = new ModelEditorViewTracker();
5047
this.methodsUsagePanel = this.push(
5148
new MethodsUsagePanel(this.modelingStore, this.modelingEvents, cliServer),
5249
);
5350
this.methodModelingPanel = this.push(
54-
new MethodModelingPanel(
55-
app,
56-
this.modelingStore,
57-
this.modelingEvents,
58-
this.editorViewTracker,
59-
),
51+
new MethodModelingPanel(app, this.modelingStore, this.modelingEvents),
6052
);
6153
this.modelConfig = this.push(new ModelConfigListener());
6254

@@ -144,12 +136,10 @@ export class ModelEditorModule extends DisposableObject {
144136

145137
const initialMode = definition.availableModes?.[0] ?? INITIAL_MODE;
146138

147-
const existingView = this.editorViewTracker.getView(
148-
db.databaseUri.toString(),
149-
);
150-
if (existingView) {
151-
await existingView.focusView();
152-
139+
if (this.modelingStore.isDbOpen(db.databaseUri.toString())) {
140+
this.modelingEvents.fireFocusModelEditorEvent(
141+
db.databaseUri.toString(),
142+
);
153143
return;
154144
}
155145

@@ -218,20 +208,17 @@ export class ModelEditorModule extends DisposableObject {
218208

219209
// Check again just before opening the editor to ensure no model editor has been opened between
220210
// our first check and now.
221-
const existingView = this.editorViewTracker.getView(
222-
db.databaseUri.toString(),
223-
);
224-
if (existingView) {
225-
await existingView.focusView();
226-
211+
if (this.modelingStore.isDbOpen(db.databaseUri.toString())) {
212+
this.modelingEvents.fireFocusModelEditorEvent(
213+
db.databaseUri.toString(),
214+
);
227215
return;
228216
}
229217

230218
const view = new ModelEditorView(
231219
this.app,
232220
this.modelingStore,
233221
this.modelingEvents,
234-
this.editorViewTracker,
235222
this.modelConfig,
236223
this.databaseManager,
237224
this.cliServer,

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

-33
This file was deleted.

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

+22-18
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@ import {
4444
import { AutoModeler } from "./auto-modeler";
4545
import { telemetryListener } from "../common/vscode/telemetry";
4646
import { ModelingStore } from "./modeling-store";
47-
import { ModelEditorViewTracker } from "./model-editor-view-tracker";
4847
import { ModelingEvents } from "./modeling-events";
4948
import { getModelsAsDataLanguage, ModelsAsDataLanguage } from "./languages";
5049
import { runGenerateQueries } from "./generate";
@@ -60,7 +59,6 @@ export class ModelEditorView extends AbstractWebview<
6059
protected readonly app: App,
6160
private readonly modelingStore: ModelingStore,
6261
private readonly modelingEvents: ModelingEvents,
63-
private readonly viewTracker: ModelEditorViewTracker<ModelEditorView>,
6462
private readonly modelConfig: ModelConfigListener,
6563
private readonly databaseManager: DatabaseManager,
6664
private readonly cliServer: CodeQLCliServer,
@@ -79,8 +77,6 @@ export class ModelEditorView extends AbstractWebview<
7977
this.registerToModelingEvents();
8078
this.registerToModelConfigEvents();
8179

82-
this.viewTracker.registerView(this);
83-
8480
this.autoModeler = new AutoModeler(
8581
app,
8682
cliServer,
@@ -166,7 +162,7 @@ export class ModelEditorView extends AbstractWebview<
166162
}
167163

168164
protected onPanelDispose(): void {
169-
this.viewTracker.unregisterView(this);
165+
// Nothing to do
170166
}
171167

172168
protected async onMessage(msg: FromModelEditorMessage): Promise<void> {
@@ -573,12 +569,9 @@ export class ModelEditorView extends AbstractWebview<
573569
return;
574570
}
575571

576-
let existingView = this.viewTracker.getView(
577-
addedDatabase.databaseUri.toString(),
578-
);
579-
if (existingView) {
580-
await existingView.focusView();
581-
572+
const addedDbUri = addedDatabase.databaseUri.toString();
573+
if (this.modelingStore.isDbOpen(addedDbUri)) {
574+
this.modelingEvents.fireFocusModelEditorEvent(addedDbUri);
582575
return;
583576
}
584577

@@ -596,20 +589,15 @@ export class ModelEditorView extends AbstractWebview<
596589

597590
// Check again just before opening the editor to ensure no model editor has been opened between
598591
// our first check and now.
599-
existingView = this.viewTracker.getView(
600-
addedDatabase.databaseUri.toString(),
601-
);
602-
if (existingView) {
603-
await existingView.focusView();
604-
592+
if (this.modelingStore.isDbOpen(addedDbUri)) {
593+
this.modelingEvents.fireFocusModelEditorEvent(addedDbUri);
605594
return;
606595
}
607596

608597
const view = new ModelEditorView(
609598
this.app,
610599
this.modelingStore,
611600
this.modelingEvents,
612-
this.viewTracker,
613601
this.modelConfig,
614602
this.databaseManager,
615603
this.cliServer,
@@ -742,6 +730,22 @@ export class ModelEditorView extends AbstractWebview<
742730
}
743731
}),
744732
);
733+
734+
this.push(
735+
this.modelingEvents.onRevealInModelEditor(async (event) => {
736+
if (event.dbUri === this.databaseItem.databaseUri.toString()) {
737+
await this.revealMethod(event.method);
738+
}
739+
}),
740+
);
741+
742+
this.push(
743+
this.modelingEvents.onFocusModelEditor(async (event) => {
744+
if (event.dbUri === this.databaseItem.databaseUri.toString()) {
745+
await this.focusView();
746+
}
747+
}),
748+
);
745749
}
746750

747751
private registerToModelConfigEvents() {

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

+36
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,15 @@ interface InProgressMethodsChangedEvent {
4848
readonly methods: ReadonlySet<string>;
4949
}
5050

51+
interface RevealInModelEditorEvent {
52+
dbUri: string;
53+
method: Method;
54+
}
55+
56+
interface FocusModelEditorEvent {
57+
dbUri: string;
58+
}
59+
5160
export class ModelingEvents extends DisposableObject {
5261
public readonly onActiveDbChanged: AppEvent<void>;
5362
public readonly onDbOpened: AppEvent<DatabaseItem>;
@@ -59,6 +68,8 @@ export class ModelingEvents extends DisposableObject {
5968
public readonly onModifiedMethodsChanged: AppEvent<ModifiedMethodsChangedEvent>;
6069
public readonly onSelectedMethodChanged: AppEvent<SelectedMethodChangedEvent>;
6170
public readonly onInProgressMethodsChanged: AppEvent<InProgressMethodsChangedEvent>;
71+
public readonly onRevealInModelEditor: AppEvent<RevealInModelEditorEvent>;
72+
public readonly onFocusModelEditor: AppEvent<FocusModelEditorEvent>;
6273

6374
private readonly onActiveDbChangedEventEmitter: AppEventEmitter<void>;
6475
private readonly onDbOpenedEventEmitter: AppEventEmitter<DatabaseItem>;
@@ -70,6 +81,8 @@ export class ModelingEvents extends DisposableObject {
7081
private readonly onModifiedMethodsChangedEventEmitter: AppEventEmitter<ModifiedMethodsChangedEvent>;
7182
private readonly onSelectedMethodChangedEventEmitter: AppEventEmitter<SelectedMethodChangedEvent>;
7283
private readonly onInProgressMethodsChangedEventEmitter: AppEventEmitter<InProgressMethodsChangedEvent>;
84+
private readonly onRevealInModelEditorEventEmitter: AppEventEmitter<RevealInModelEditorEvent>;
85+
private readonly onFocusModelEditorEventEmitter: AppEventEmitter<FocusModelEditorEvent>;
7386

7487
constructor(app: App) {
7588
super();
@@ -126,6 +139,16 @@ export class ModelingEvents extends DisposableObject {
126139
);
127140
this.onInProgressMethodsChanged =
128141
this.onInProgressMethodsChangedEventEmitter.event;
142+
143+
this.onRevealInModelEditorEventEmitter = this.push(
144+
app.createEventEmitter<RevealInModelEditorEvent>(),
145+
);
146+
this.onRevealInModelEditor = this.onRevealInModelEditorEventEmitter.event;
147+
148+
this.onFocusModelEditorEventEmitter = this.push(
149+
app.createEventEmitter<FocusModelEditorEvent>(),
150+
);
151+
this.onFocusModelEditor = this.onFocusModelEditorEventEmitter.event;
129152
}
130153

131154
public fireActiveDbChangedEvent() {
@@ -220,4 +243,17 @@ export class ModelingEvents extends DisposableObject {
220243
methods,
221244
});
222245
}
246+
247+
public fireRevealInModelEditorEvent(dbUri: string, method: Method) {
248+
this.onRevealInModelEditorEventEmitter.fire({
249+
dbUri,
250+
method,
251+
});
252+
}
253+
254+
public fireFocusModelEditorEvent(dbUri: string) {
255+
this.onFocusModelEditorEventEmitter.fire({
256+
dbUri,
257+
});
258+
}
223259
}

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

+4
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,10 @@ export class ModelingStore extends DisposableObject {
112112
return this.state.size > 0;
113113
}
114114

115+
public isDbOpen(dbUri: string): boolean {
116+
return this.state.has(dbUri);
117+
}
118+
115119
/**
116120
* Returns the method for the given database item and method signature.
117121
* Returns undefined if no method exists with that signature.

extensions/ql-vscode/test/__mocks__/model-editor/modelEditorViewTrackerMock.ts

-19
This file was deleted.

extensions/ql-vscode/test/__mocks__/model-editor/modelingEventsMock.ts

+6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ export function createMockModelingEvents({
1010
onModeledMethodsChanged = jest.fn(),
1111
onModifiedMethodsChanged = jest.fn(),
1212
onInProgressMethodsChanged = jest.fn(),
13+
onRevealInModelEditor = jest.fn(),
14+
onFocusModelEditor = jest.fn(),
1315
}: {
1416
onActiveDbChanged?: ModelingEvents["onActiveDbChanged"];
1517
onDbClosed?: ModelingEvents["onDbClosed"];
@@ -19,6 +21,8 @@ export function createMockModelingEvents({
1921
onModeledMethodsChanged?: ModelingEvents["onModeledMethodsChanged"];
2022
onModifiedMethodsChanged?: ModelingEvents["onModifiedMethodsChanged"];
2123
onInProgressMethodsChanged?: ModelingEvents["onInProgressMethodsChanged"];
24+
onRevealInModelEditor?: ModelingEvents["onRevealInModelEditor"];
25+
onFocusModelEditor?: ModelingEvents["onFocusModelEditor"];
2226
} = {}): ModelingEvents {
2327
return mockedObject<ModelingEvents>({
2428
onActiveDbChanged,
@@ -29,5 +33,7 @@ export function createMockModelingEvents({
2933
onModeledMethodsChanged,
3034
onModifiedMethodsChanged,
3135
onInProgressMethodsChanged,
36+
onRevealInModelEditor,
37+
onFocusModelEditor,
3238
});
3339
}

0 commit comments

Comments
 (0)