Skip to content

Commit d33c267

Browse files
committed
Introduce modeling store
1 parent 19890b8 commit d33c267

File tree

4 files changed

+76
-0
lines changed

4 files changed

+76
-0
lines changed

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@ import { showResolvableLocation } from "../databases/local-databases/locations";
1919
import { Method, Usage } from "./method";
2020
import { setUpPack } from "./model-editor-queries";
2121
import { MethodModelingPanel } from "./method-modeling/method-modeling-panel";
22+
import { ModelingStore } from "./modeling-store";
2223

2324
const SUPPORTED_LANGUAGES: string[] = ["java", "csharp"];
2425

2526
export class ModelEditorModule extends DisposableObject {
2627
private readonly queryStorageDir: string;
28+
private readonly modelingStore: ModelingStore;
2729
private readonly methodsUsagePanel: MethodsUsagePanel;
2830
private readonly methodModelingPanel: MethodModelingPanel;
2931

@@ -38,6 +40,7 @@ export class ModelEditorModule extends DisposableObject {
3840
) {
3941
super();
4042
this.queryStorageDir = join(baseQueryStorageDir, "model-editor-results");
43+
this.modelingStore = new ModelingStore(app);
4144
this.methodsUsagePanel = this.push(new MethodsUsagePanel(cliServer));
4245
this.methodModelingPanel = this.push(new MethodModelingPanel(app));
4346
}
@@ -153,6 +156,7 @@ export class ModelEditorModule extends DisposableObject {
153156

154157
const view = new ModelEditorView(
155158
this.app,
159+
this.modelingStore,
156160
this.databaseManager,
157161
this.cliServer,
158162
this.queryRunner,

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import { getLanguageDisplayName } from "../common/query-language";
4343
import { AutoModeler } from "./auto-modeler";
4444
import { INITIAL_HIDE_MODELED_METHODS_VALUE } from "./shared/hide-modeled-methods";
4545
import { telemetryListener } from "../common/vscode/telemetry";
46+
import { ModelingStore } from "./modeling-store";
4647

4748
export class ModelEditorView extends AbstractWebview<
4849
ToModelEditorMessage,
@@ -55,6 +56,7 @@ export class ModelEditorView extends AbstractWebview<
5556

5657
public constructor(
5758
protected readonly app: App,
59+
private readonly modelingStore: ModelingStore,
5860
private readonly databaseManager: DatabaseManager,
5961
private readonly cliServer: CodeQLCliServer,
6062
private readonly queryRunner: QueryRunner,
@@ -80,6 +82,8 @@ export class ModelEditorView extends AbstractWebview<
8082
) {
8183
super(app);
8284

85+
this.modelingStore.initializeStateForDb(databaseItem);
86+
8387
this.autoModeler = new AutoModeler(
8488
app,
8589
cliServer,
@@ -527,6 +531,7 @@ export class ModelEditorView extends AbstractWebview<
527531

528532
const view = new ModelEditorView(
529533
this.app,
534+
this.modelingStore,
530535
this.databaseManager,
531536
this.cliServer,
532537
this.queryRunner,
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
import { App } from "../common/app";
2+
import { DisposableObject } from "../common/disposable-object";
3+
import { AppEvent, AppEventEmitter } from "../common/events";
4+
import { DatabaseItem } from "../databases/local-databases";
5+
6+
interface DbModelingState {
7+
// Currently empty but will soon contain information about methods, etc.
8+
}
9+
10+
export class ModelingStore extends DisposableObject {
11+
public readonly onActiveDbChanged: AppEvent<void>;
12+
public readonly onDbClosed: AppEvent<string>;
13+
14+
private state: Map<string, DbModelingState>;
15+
private activeDb: string | undefined;
16+
17+
private readonly onActiveDbChangedEventEmitter: AppEventEmitter<void>;
18+
private readonly onDbClosedEventEmitter: AppEventEmitter<string>;
19+
20+
constructor(app: App) {
21+
super();
22+
23+
// State initialization
24+
this.activeDb = undefined;
25+
this.state = new Map<string, DbModelingState>();
26+
27+
// Event initialization
28+
this.onActiveDbChangedEventEmitter = this.push(
29+
app.createEventEmitter<void>(),
30+
);
31+
this.onActiveDbChanged = this.onActiveDbChangedEventEmitter.event;
32+
33+
this.onDbClosedEventEmitter = this.push(app.createEventEmitter<string>());
34+
this.onDbClosed = this.onDbClosedEventEmitter.event;
35+
}
36+
37+
public initializeStateForDb(databaseItem: DatabaseItem) {
38+
const dbUri = databaseItem.databaseUri.toString();
39+
this.state.set(dbUri, {
40+
databaseItem,
41+
});
42+
}
43+
44+
public setActiveDb(databaseItem: DatabaseItem) {
45+
this.activeDb = databaseItem.databaseUri.toString();
46+
this.onActiveDbChangedEventEmitter.fire();
47+
}
48+
49+
public removeDb(databaseItem: DatabaseItem) {
50+
const dbUri = databaseItem.databaseUri.toString();
51+
52+
if (!this.state.has(dbUri)) {
53+
throw Error("Cannot remove a database that has not been initialized");
54+
}
55+
56+
if (this.activeDb === dbUri) {
57+
this.activeDb = undefined;
58+
this.onActiveDbChangedEventEmitter.fire();
59+
}
60+
61+
this.state.delete(dbUri);
62+
this.onDbClosedEventEmitter.fire(dbUri);
63+
}
64+
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@ import { createMockApp } from "../../../__mocks__/appMock";
88
import { mockEmptyDatabaseManager } from "../query-testing/test-runner-helpers";
99
import { QueryRunner } from "../../../../src/query-server";
1010
import { ExtensionPack } from "../../../../src/model-editor/shared/extension-pack";
11+
import { ModelingStore } from "../../../../src/model-editor/modeling-store";
1112

1213
describe("ModelEditorView", () => {
1314
const app = createMockApp({});
15+
const modelingStore = mockedObject<ModelingStore>({});
1416
const databaseManager = mockEmptyDatabaseManager();
1517
const cliServer = mockedObject<CodeQLCliServer>({});
1618
const queryRunner = mockedObject<QueryRunner>({});
@@ -40,6 +42,7 @@ describe("ModelEditorView", () => {
4042
beforeEach(() => {
4143
view = new ModelEditorView(
4244
app,
45+
modelingStore,
4346
databaseManager,
4447
cliServer,
4548
queryRunner,

0 commit comments

Comments
 (0)