Skip to content

Commit 23dc8f1

Browse files
authored
Move in-progress methods state to modeling store (#2971)
1 parent d78a4d1 commit 23dc8f1

File tree

7 files changed

+65
-39
lines changed

7 files changed

+65
-39
lines changed

extensions/ql-vscode/src/common/interface-types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
} from "../model-editor/shared/view-state";
2626
import { Mode } from "../model-editor/shared/mode";
2727
import { QueryLanguage } from "./query-language";
28+
import { InProgressMethods } from "../model-editor/shared/in-progress-methods";
2829

2930
/**
3031
* This module contains types and code that are shared between
@@ -517,8 +518,7 @@ interface SetModifiedMethodsMessage {
517518

518519
interface SetInProgressMethodsMessage {
519520
t: "setInProgressMethods";
520-
packageName: string;
521-
inProgressMethods: string[];
521+
methods: InProgressMethods;
522522
}
523523

524524
interface SwitchModeMessage {

extensions/ql-vscode/src/model-editor/auto-modeler.ts

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { QueryRunner } from "../query-server";
1616
import { DatabaseItem } from "../databases/local-databases";
1717
import { Mode } from "./shared/mode";
1818
import { CancellationTokenSource } from "vscode";
19+
import { ModelingStore } from "./modeling-store";
1920

2021
// Limit the number of candidates we send to the model in each request
2122
// to avoid long requests.
@@ -35,12 +36,9 @@ export class AutoModeler {
3536
private readonly app: App,
3637
private readonly cliServer: CodeQLCliServer,
3738
private readonly queryRunner: QueryRunner,
39+
private readonly modelingStore: ModelingStore,
3840
private readonly queryStorageDir: string,
3941
private readonly databaseItem: DatabaseItem,
40-
private readonly setInProgressMethods: (
41-
packageName: string,
42-
inProgressMethods: string[],
43-
) => Promise<void>,
4442
private readonly addModeledMethods: (
4543
modeledMethods: Record<string, ModeledMethod[]>,
4644
) => Promise<void>,
@@ -137,7 +135,8 @@ export class AutoModeler {
137135
const candidatesToProcess = allCandidateMethods.slice(start, end);
138136

139137
// Let the UI know which candidates we are modeling
140-
await this.setInProgressMethods(
138+
this.modelingStore.setInProgressMethods(
139+
this.databaseItem,
141140
packageName,
142141
candidatesToProcess.map((c) => c.signature),
143142
);
@@ -152,7 +151,11 @@ export class AutoModeler {
152151
}
153152
} finally {
154153
// Clear out in progress methods
155-
await this.setInProgressMethods(packageName, []);
154+
this.modelingStore.setInProgressMethods(
155+
this.databaseItem,
156+
packageName,
157+
[],
158+
);
156159
}
157160
});
158161
}

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

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -76,15 +76,9 @@ export class ModelEditorView extends AbstractWebview<
7676
app,
7777
cliServer,
7878
queryRunner,
79+
modelingStore,
7980
queryStorageDir,
8081
databaseItem,
81-
async (packageName, inProgressMethods) => {
82-
await this.postMessage({
83-
t: "setInProgressMethods",
84-
packageName,
85-
inProgressMethods,
86-
});
87-
},
8882
async (modeledMethods) => {
8983
this.addModeledMethods(modeledMethods);
9084
},
@@ -683,6 +677,17 @@ export class ModelEditorView extends AbstractWebview<
683677
}
684678
}),
685679
);
680+
681+
this.push(
682+
this.modelingStore.onInProgressMethodsChanged(async (event) => {
683+
if (event.dbUri === this.databaseItem.databaseUri.toString()) {
684+
await this.postMessage({
685+
t: "setInProgressMethods",
686+
methods: event.methods,
687+
});
688+
}
689+
}),
690+
);
686691
}
687692

688693
private registerToModelConfigEvents() {

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

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { DatabaseItem } from "../databases/local-databases";
55
import { Method, Usage } from "./method";
66
import { ModeledMethod } from "./modeled-method";
77
import { INITIAL_HIDE_MODELED_METHODS_VALUE } from "./shared/hide-modeled-methods";
8+
import { InProgressMethods } from "./shared/in-progress-methods";
89
import { INITIAL_MODE, Mode } from "./shared/mode";
910

1011
interface InternalDbModelingState {
@@ -14,6 +15,7 @@ interface InternalDbModelingState {
1415
mode: Mode;
1516
modeledMethods: Record<string, ModeledMethod[]>;
1617
modifiedMethodSignatures: Set<string>;
18+
inProgressMethods: InProgressMethods;
1719
selectedMethod: Method | undefined;
1820
selectedUsage: Usage | undefined;
1921
}
@@ -73,6 +75,11 @@ interface SelectedMethodChangedEvent {
7375
readonly isModified: boolean;
7476
}
7577

78+
interface InProgressMethodsChangedEvent {
79+
readonly dbUri: string;
80+
readonly methods: InProgressMethods;
81+
}
82+
7683
export class ModelingStore extends DisposableObject {
7784
public readonly onActiveDbChanged: AppEvent<void>;
7885
public readonly onDbOpened: AppEvent<string>;
@@ -83,6 +90,7 @@ export class ModelingStore extends DisposableObject {
8390
public readonly onModeledMethodsChanged: AppEvent<ModeledMethodsChangedEvent>;
8491
public readonly onModifiedMethodsChanged: AppEvent<ModifiedMethodsChangedEvent>;
8592
public readonly onSelectedMethodChanged: AppEvent<SelectedMethodChangedEvent>;
93+
public readonly onInProgressMethodsChanged: AppEvent<InProgressMethodsChangedEvent>;
8694

8795
private readonly state: Map<string, InternalDbModelingState>;
8896
private activeDb: string | undefined;
@@ -96,6 +104,7 @@ export class ModelingStore extends DisposableObject {
96104
private readonly onModeledMethodsChangedEventEmitter: AppEventEmitter<ModeledMethodsChangedEvent>;
97105
private readonly onModifiedMethodsChangedEventEmitter: AppEventEmitter<ModifiedMethodsChangedEvent>;
98106
private readonly onSelectedMethodChangedEventEmitter: AppEventEmitter<SelectedMethodChangedEvent>;
107+
private readonly onInProgressMethodsChangedEventEmitter: AppEventEmitter<InProgressMethodsChangedEvent>;
99108

100109
constructor(app: App) {
101110
super();
@@ -148,6 +157,12 @@ export class ModelingStore extends DisposableObject {
148157
);
149158
this.onSelectedMethodChanged =
150159
this.onSelectedMethodChangedEventEmitter.event;
160+
161+
this.onInProgressMethodsChangedEventEmitter = this.push(
162+
app.createEventEmitter<InProgressMethodsChangedEvent>(),
163+
);
164+
this.onInProgressMethodsChanged =
165+
this.onInProgressMethodsChangedEventEmitter.event;
151166
}
152167

153168
public initializeStateForDb(
@@ -164,6 +179,7 @@ export class ModelingStore extends DisposableObject {
164179
modifiedMethodSignatures: new Set(),
165180
selectedMethod: undefined,
166181
selectedUsage: undefined,
182+
inProgressMethods: {},
167183
});
168184

169185
this.onDbOpenedEventEmitter.fire(dbUri);
@@ -396,6 +412,24 @@ export class ModelingStore extends DisposableObject {
396412
});
397413
}
398414

415+
public setInProgressMethods(
416+
dbItem: DatabaseItem,
417+
packageName: string,
418+
inProgressMethods: string[],
419+
) {
420+
const dbState = this.getState(dbItem);
421+
422+
dbState.inProgressMethods = {
423+
...dbState.inProgressMethods,
424+
[packageName]: inProgressMethods,
425+
};
426+
427+
this.onInProgressMethodsChangedEventEmitter.fire({
428+
dbUri: dbItem.databaseUri.toString(),
429+
methods: dbState.inProgressMethods,
430+
});
431+
}
432+
399433
public getSelectedMethodDetails(): SelectedMethodDetails | undefined {
400434
const dbState = this.getInternalStateForActiveDb();
401435
if (!dbState) {

extensions/ql-vscode/src/model-editor/shared/in-progress-methods.ts

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,7 @@
11
/**
22
* An interface to help keep track of which methods are in progress for each package.
33
*/
4-
export type InProgressMethods = Record<string, string[]>;
5-
6-
export function setPackageInProgressMethods(
7-
inProgressMethods: InProgressMethods,
8-
packageName: string,
9-
methods: string[],
10-
): InProgressMethods {
11-
return {
12-
...inProgressMethods,
13-
[packageName]: methods,
14-
};
15-
}
4+
export type InProgressMethods = Readonly<Record<string, readonly string[]>>;
165

176
export function hasInProgressMethod(
187
inProgressMethods: InProgressMethods,

extensions/ql-vscode/src/view/model-editor/ModelEditor.tsx

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,7 @@ import { ModelEditorViewState } from "../../model-editor/shared/view-state";
1717
import { ModeledMethodsList } from "./ModeledMethodsList";
1818
import { percentFormatter } from "./formatters";
1919
import { Mode } from "../../model-editor/shared/mode";
20-
import {
21-
InProgressMethods,
22-
setPackageInProgressMethods,
23-
} from "../../model-editor/shared/in-progress-methods";
20+
import { InProgressMethods } from "../../model-editor/shared/in-progress-methods";
2421
import { getLanguageDisplayName } from "../../common/query-language";
2522
import { INITIAL_HIDE_MODELED_METHODS_VALUE } from "../../model-editor/shared/hide-modeled-methods";
2623

@@ -136,15 +133,10 @@ export function ModelEditor({
136133
case "setModifiedMethods":
137134
setModifiedSignatures(new Set(msg.methodSignatures));
138135
break;
139-
case "setInProgressMethods":
140-
setInProgressMethods((oldInProgressMethods) =>
141-
setPackageInProgressMethods(
142-
oldInProgressMethods,
143-
msg.packageName,
144-
msg.inProgressMethods,
145-
),
146-
);
136+
case "setInProgressMethods": {
137+
setInProgressMethods(msg.methods);
147138
break;
139+
}
148140
case "revealMethod":
149141
setRevealedMethodSignature(msg.methodSignature);
150142

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export function createMockModelingStore({
1111
onModeChanged = jest.fn(),
1212
onModeledMethodsChanged = jest.fn(),
1313
onModifiedMethodsChanged = jest.fn(),
14+
onInProgressMethodsChanged = jest.fn(),
1415
}: {
1516
initializeStateForDb?: ModelingStore["initializeStateForDb"];
1617
getStateForActiveDb?: ModelingStore["getStateForActiveDb"];
@@ -21,6 +22,7 @@ export function createMockModelingStore({
2122
onModeChanged?: ModelingStore["onModeChanged"];
2223
onModeledMethodsChanged?: ModelingStore["onModeledMethodsChanged"];
2324
onModifiedMethodsChanged?: ModelingStore["onModifiedMethodsChanged"];
25+
onInProgressMethodsChanged?: ModelingStore["onInProgressMethodsChanged"];
2426
} = {}): ModelingStore {
2527
return mockedObject<ModelingStore>({
2628
initializeStateForDb,
@@ -32,5 +34,6 @@ export function createMockModelingStore({
3234
onModeChanged,
3335
onModeledMethodsChanged,
3436
onModifiedMethodsChanged,
37+
onInProgressMethodsChanged,
3538
});
3639
}

0 commit comments

Comments
 (0)