Move modeling events to new ModelingEvents class (#3005)

This commit is contained in:
Charis Kyriakou
2023-10-23 08:57:48 +01:00
committed by GitHub
parent 48df8de2c2
commit 1ab198fe49
11 changed files with 360 additions and 208 deletions

View File

@@ -7,6 +7,7 @@ import { ModelingStore } from "../modeling-store";
import { ModelEditorViewTracker } from "../model-editor-view-tracker";
import { ModelConfigListener } from "../../config";
import { DatabaseItem } from "../../databases/local-databases";
import { ModelingEvents } from "../modeling-events";
export class MethodModelingPanel extends DisposableObject {
private readonly provider: MethodModelingViewProvider;
@@ -14,6 +15,7 @@ export class MethodModelingPanel extends DisposableObject {
constructor(
app: App,
modelingStore: ModelingStore,
modelingEvents: ModelingEvents,
editorViewTracker: ModelEditorViewTracker,
) {
super();
@@ -26,6 +28,7 @@ export class MethodModelingPanel extends DisposableObject {
this.provider = new MethodModelingViewProvider(
app,
modelingStore,
modelingEvents,
editorViewTracker,
modelConfig,
);

View File

@@ -14,6 +14,7 @@ import { assertNever } from "../../common/helpers-pure";
import { ModelEditorViewTracker } from "../model-editor-view-tracker";
import { ModelConfigListener } from "../../config";
import { DatabaseItem } from "../../databases/local-databases";
import { ModelingEvents } from "../modeling-events";
export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
ToMethodModelingMessage,
@@ -27,6 +28,7 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
constructor(
app: App,
private readonly modelingStore: ModelingStore,
private readonly modelingEvents: ModelingEvents,
private readonly editorViewTracker: ModelEditorViewTracker,
private readonly modelConfig: ModelConfigListener,
) {
@@ -35,7 +37,7 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
protected override async onWebViewLoaded(): Promise<void> {
await Promise.all([this.setViewState(), this.setInitialState()]);
this.registerToModelingStoreEvents();
this.registerToModelingEvents();
this.registerToModelConfigEvents();
}
@@ -150,9 +152,9 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
await view?.revealMethod(method);
}
private registerToModelingStoreEvents(): void {
private registerToModelingEvents(): void {
this.push(
this.modelingStore.onModeledMethodsChanged(async (e) => {
this.modelingEvents.onModeledMethodsChanged(async (e) => {
if (this.webviewView && e.isActiveDb && this.method) {
const modeledMethods = e.modeledMethods[this.method.signature];
if (modeledMethods) {
@@ -167,7 +169,7 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
);
this.push(
this.modelingStore.onModifiedMethodsChanged(async (e) => {
this.modelingEvents.onModifiedMethodsChanged(async (e) => {
if (this.webviewView && e.isActiveDb && this.method) {
const isModified = e.modifiedMethods.has(this.method.signature);
await this.postMessage({
@@ -179,7 +181,7 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
);
this.push(
this.modelingStore.onSelectedMethodChanged(async (e) => {
this.modelingEvents.onSelectedMethodChanged(async (e) => {
if (this.webviewView) {
this.method = e.method;
this.databaseItem = e.databaseItem;
@@ -196,7 +198,7 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
);
this.push(
this.modelingStore.onDbOpened(async () => {
this.modelingEvents.onDbOpened(async () => {
await this.postMessage({
t: "setInModelingMode",
inModelingMode: true,
@@ -205,7 +207,7 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
);
this.push(
this.modelingStore.onDbClosed(async (dbUri) => {
this.modelingEvents.onDbClosed(async (dbUri) => {
if (!this.modelingStore.anyDbsBeingModeled()) {
await this.postMessage({
t: "setInModelingMode",
@@ -220,7 +222,7 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
);
this.push(
this.modelingStore.onInProgressMethodsChanged(async (e) => {
this.modelingEvents.onInProgressMethodsChanged(async (e) => {
if (this.method && this.databaseItem) {
const dbUri = this.databaseItem.databaseUri.toString();
if (e.dbUri === dbUri) {

View File

@@ -10,6 +10,7 @@ import { CodeQLCliServer } from "../../codeql-cli/cli";
import { ModelingStore } from "../modeling-store";
import { ModeledMethod } from "../modeled-method";
import { Mode } from "../shared/mode";
import { ModelingEvents } from "../modeling-events";
export class MethodsUsagePanel extends DisposableObject {
private readonly dataProvider: MethodsUsageDataProvider;
@@ -17,6 +18,7 @@ export class MethodsUsagePanel extends DisposableObject {
public constructor(
private readonly modelingStore: ModelingStore,
private readonly modelingEvents: ModelingEvents,
cliServer: CodeQLCliServer,
) {
super();
@@ -28,7 +30,7 @@ export class MethodsUsagePanel extends DisposableObject {
});
this.push(this.treeView);
this.registerToModelingStoreEvents();
this.registerToModelingEvents();
}
public async setState(
@@ -69,15 +71,15 @@ export class MethodsUsagePanel extends DisposableObject {
}
}
private registerToModelingStoreEvents(): void {
private registerToModelingEvents(): void {
this.push(
this.modelingStore.onActiveDbChanged(async () => {
this.modelingEvents.onActiveDbChanged(async () => {
await this.handleStateChangeEvent();
}),
);
this.push(
this.modelingStore.onMethodsChanged(async (event) => {
this.modelingEvents.onMethodsChanged(async (event) => {
if (event.isActiveDb) {
await this.handleStateChangeEvent();
}
@@ -85,7 +87,7 @@ export class MethodsUsagePanel extends DisposableObject {
);
this.push(
this.modelingStore.onHideModeledMethodsChanged(async (event) => {
this.modelingEvents.onHideModeledMethodsChanged(async (event) => {
if (event.isActiveDb) {
await this.handleStateChangeEvent();
}
@@ -93,7 +95,7 @@ export class MethodsUsagePanel extends DisposableObject {
);
this.push(
this.modelingStore.onModeChanged(async (event) => {
this.modelingEvents.onModeChanged(async (event) => {
if (event.isActiveDb) {
await this.handleStateChangeEvent();
}
@@ -101,7 +103,7 @@ export class MethodsUsagePanel extends DisposableObject {
);
this.push(
this.modelingStore.onModifiedMethodsChanged(async (event) => {
this.modelingEvents.onModifiedMethodsChanged(async (event) => {
if (event.isActiveDb) {
await this.handleStateChangeEvent();
}

View File

@@ -21,12 +21,14 @@ import { ModelingStore } from "./modeling-store";
import { showResolvableLocation } from "../databases/local-databases/locations";
import { ModelEditorViewTracker } from "./model-editor-view-tracker";
import { ModelConfigListener } from "../config";
import { ModelingEvents } from "./modeling-events";
const SUPPORTED_LANGUAGES: string[] = ["java", "csharp"];
export class ModelEditorModule extends DisposableObject {
private readonly queryStorageDir: string;
private readonly modelingStore: ModelingStore;
private readonly modelingEvents: ModelingEvents;
private readonly editorViewTracker: ModelEditorViewTracker<ModelEditorView>;
private readonly methodsUsagePanel: MethodsUsagePanel;
private readonly methodModelingPanel: MethodModelingPanel;
@@ -40,16 +42,22 @@ export class ModelEditorModule extends DisposableObject {
) {
super();
this.queryStorageDir = join(baseQueryStorageDir, "model-editor-results");
this.modelingStore = new ModelingStore(app);
this.modelingEvents = new ModelingEvents(app);
this.modelingStore = new ModelingStore(this.modelingEvents);
this.editorViewTracker = new ModelEditorViewTracker();
this.methodsUsagePanel = this.push(
new MethodsUsagePanel(this.modelingStore, cliServer),
new MethodsUsagePanel(this.modelingStore, this.modelingEvents, cliServer),
);
this.methodModelingPanel = this.push(
new MethodModelingPanel(app, this.modelingStore, this.editorViewTracker),
new MethodModelingPanel(
app,
this.modelingStore,
this.modelingEvents,
this.editorViewTracker,
),
);
this.registerToModelingStoreEvents();
this.registerToModelingEvents();
}
public static async initialize(
@@ -90,9 +98,9 @@ export class ModelEditorModule extends DisposableObject {
await ensureDir(this.queryStorageDir);
}
private registerToModelingStoreEvents(): void {
private registerToModelingEvents(): void {
this.push(
this.modelingStore.onSelectedMethodChanged(async (event) => {
this.modelingEvents.onSelectedMethodChanged(async (event) => {
await this.showMethod(event.databaseItem, event.method, event.usage);
}),
);
@@ -215,6 +223,7 @@ export class ModelEditorModule extends DisposableObject {
const view = new ModelEditorView(
this.app,
this.modelingStore,
this.modelingEvents,
this.editorViewTracker,
modelConfig,
this.databaseManager,
@@ -226,7 +235,7 @@ export class ModelEditorModule extends DisposableObject {
modelFile,
);
this.modelingStore.onDbClosed(async (dbUri) => {
this.modelingEvents.onDbClosed(async (dbUri) => {
if (dbUri === db.databaseUri.toString()) {
await cleanupQueryDir();
}

View File

@@ -43,6 +43,7 @@ import { AutoModeler } from "./auto-modeler";
import { telemetryListener } from "../common/vscode/telemetry";
import { ModelingStore } from "./modeling-store";
import { ModelEditorViewTracker } from "./model-editor-view-tracker";
import { ModelingEvents } from "./modeling-events";
export class ModelEditorView extends AbstractWebview<
ToModelEditorMessage,
@@ -53,6 +54,7 @@ export class ModelEditorView extends AbstractWebview<
public constructor(
protected readonly app: App,
private readonly modelingStore: ModelingStore,
private readonly modelingEvents: ModelingEvents,
private readonly viewTracker: ModelEditorViewTracker<ModelEditorView>,
private readonly modelConfig: ModelConfigListener,
private readonly databaseManager: DatabaseManager,
@@ -67,7 +69,7 @@ export class ModelEditorView extends AbstractWebview<
super(app);
this.modelingStore.initializeStateForDb(databaseItem, initialMode);
this.registerToModelingStoreEvents();
this.registerToModelingEvents();
this.registerToModelConfigEvents();
this.viewTracker.registerView(this);
@@ -567,6 +569,7 @@ export class ModelEditorView extends AbstractWebview<
const view = new ModelEditorView(
this.app,
this.modelingStore,
this.modelingEvents,
this.viewTracker,
this.modelConfig,
this.databaseManager,
@@ -655,9 +658,9 @@ export class ModelEditorView extends AbstractWebview<
return addedDatabase;
}
private registerToModelingStoreEvents() {
private registerToModelingEvents() {
this.push(
this.modelingStore.onMethodsChanged(async (event) => {
this.modelingEvents.onMethodsChanged(async (event) => {
if (event.dbUri === this.databaseItem.databaseUri.toString()) {
await this.postMessage({
t: "setMethods",
@@ -668,7 +671,7 @@ export class ModelEditorView extends AbstractWebview<
);
this.push(
this.modelingStore.onModeledMethodsChanged(async (event) => {
this.modelingEvents.onModeledMethodsChanged(async (event) => {
if (event.dbUri === this.databaseItem.databaseUri.toString()) {
await this.postMessage({
t: "setModeledMethods",
@@ -679,7 +682,7 @@ export class ModelEditorView extends AbstractWebview<
);
this.push(
this.modelingStore.onModifiedMethodsChanged(async (event) => {
this.modelingEvents.onModifiedMethodsChanged(async (event) => {
if (event.dbUri === this.databaseItem.databaseUri.toString()) {
await this.postMessage({
t: "setModifiedMethods",
@@ -690,7 +693,7 @@ export class ModelEditorView extends AbstractWebview<
);
this.push(
this.modelingStore.onInProgressMethodsChanged(async (event) => {
this.modelingEvents.onInProgressMethodsChanged(async (event) => {
if (event.dbUri === this.databaseItem.databaseUri.toString()) {
await this.postMessage({
t: "setInProgressMethods",

View File

@@ -0,0 +1,221 @@
import { App } from "../common/app";
import { DisposableObject } from "../common/disposable-object";
import { AppEvent, AppEventEmitter } from "../common/events";
import { DatabaseItem } from "../databases/local-databases";
import { Method, Usage } from "./method";
import { ModeledMethod } from "./modeled-method";
import { Mode } from "./shared/mode";
interface MethodsChangedEvent {
readonly methods: readonly Method[];
readonly dbUri: string;
readonly isActiveDb: boolean;
}
interface HideModeledMethodsChangedEvent {
readonly hideModeledMethods: boolean;
readonly isActiveDb: boolean;
}
interface ModeChangedEvent {
readonly mode: Mode;
readonly isActiveDb: boolean;
}
interface ModeledMethodsChangedEvent {
readonly modeledMethods: Readonly<Record<string, ModeledMethod[]>>;
readonly dbUri: string;
readonly isActiveDb: boolean;
}
interface ModifiedMethodsChangedEvent {
readonly modifiedMethods: ReadonlySet<string>;
readonly dbUri: string;
readonly isActiveDb: boolean;
}
interface SelectedMethodChangedEvent {
readonly databaseItem: DatabaseItem;
readonly method: Method;
readonly usage: Usage;
readonly modeledMethods: readonly ModeledMethod[];
readonly isModified: boolean;
readonly isInProgress: boolean;
}
interface InProgressMethodsChangedEvent {
readonly dbUri: string;
readonly methods: ReadonlySet<string>;
}
export class ModelingEvents extends DisposableObject {
public readonly onActiveDbChanged: AppEvent<void>;
public readonly onDbOpened: AppEvent<string>;
public readonly onDbClosed: AppEvent<string>;
public readonly onMethodsChanged: AppEvent<MethodsChangedEvent>;
public readonly onHideModeledMethodsChanged: AppEvent<HideModeledMethodsChangedEvent>;
public readonly onModeChanged: AppEvent<ModeChangedEvent>;
public readonly onModeledMethodsChanged: AppEvent<ModeledMethodsChangedEvent>;
public readonly onModifiedMethodsChanged: AppEvent<ModifiedMethodsChangedEvent>;
public readonly onSelectedMethodChanged: AppEvent<SelectedMethodChangedEvent>;
public readonly onInProgressMethodsChanged: AppEvent<InProgressMethodsChangedEvent>;
private readonly onActiveDbChangedEventEmitter: AppEventEmitter<void>;
private readonly onDbOpenedEventEmitter: AppEventEmitter<string>;
private readonly onDbClosedEventEmitter: AppEventEmitter<string>;
private readonly onMethodsChangedEventEmitter: AppEventEmitter<MethodsChangedEvent>;
private readonly onHideModeledMethodsChangedEventEmitter: AppEventEmitter<HideModeledMethodsChangedEvent>;
private readonly onModeChangedEventEmitter: AppEventEmitter<ModeChangedEvent>;
private readonly onModeledMethodsChangedEventEmitter: AppEventEmitter<ModeledMethodsChangedEvent>;
private readonly onModifiedMethodsChangedEventEmitter: AppEventEmitter<ModifiedMethodsChangedEvent>;
private readonly onSelectedMethodChangedEventEmitter: AppEventEmitter<SelectedMethodChangedEvent>;
private readonly onInProgressMethodsChangedEventEmitter: AppEventEmitter<InProgressMethodsChangedEvent>;
constructor(app: App) {
super();
this.onActiveDbChangedEventEmitter = this.push(
app.createEventEmitter<void>(),
);
this.onActiveDbChanged = this.onActiveDbChangedEventEmitter.event;
this.onDbOpenedEventEmitter = this.push(app.createEventEmitter<string>());
this.onDbOpened = this.onDbOpenedEventEmitter.event;
this.onDbClosedEventEmitter = this.push(app.createEventEmitter<string>());
this.onDbClosed = this.onDbClosedEventEmitter.event;
this.onMethodsChangedEventEmitter = this.push(
app.createEventEmitter<MethodsChangedEvent>(),
);
this.onMethodsChanged = this.onMethodsChangedEventEmitter.event;
this.onHideModeledMethodsChangedEventEmitter = this.push(
app.createEventEmitter<HideModeledMethodsChangedEvent>(),
);
this.onHideModeledMethodsChanged =
this.onHideModeledMethodsChangedEventEmitter.event;
this.onModeChangedEventEmitter = this.push(
app.createEventEmitter<ModeChangedEvent>(),
);
this.onModeChanged = this.onModeChangedEventEmitter.event;
this.onModeledMethodsChangedEventEmitter = this.push(
app.createEventEmitter<ModeledMethodsChangedEvent>(),
);
this.onModeledMethodsChanged =
this.onModeledMethodsChangedEventEmitter.event;
this.onModifiedMethodsChangedEventEmitter = this.push(
app.createEventEmitter<ModifiedMethodsChangedEvent>(),
);
this.onModifiedMethodsChanged =
this.onModifiedMethodsChangedEventEmitter.event;
this.onSelectedMethodChangedEventEmitter = this.push(
app.createEventEmitter<SelectedMethodChangedEvent>(),
);
this.onSelectedMethodChanged =
this.onSelectedMethodChangedEventEmitter.event;
this.onInProgressMethodsChangedEventEmitter = this.push(
app.createEventEmitter<InProgressMethodsChangedEvent>(),
);
this.onInProgressMethodsChanged =
this.onInProgressMethodsChangedEventEmitter.event;
}
public fireActiveDbChangedEvent() {
this.onActiveDbChangedEventEmitter.fire();
}
public fireDbOpenedEvent(dbUri: string) {
this.onDbOpenedEventEmitter.fire(dbUri);
}
public fireDbClosedEvent(dbUri: string) {
this.onDbClosedEventEmitter.fire(dbUri);
}
public fireMethodsChangedEvent(
methods: Method[],
dbUri: string,
isActiveDb: boolean,
) {
this.onMethodsChangedEventEmitter.fire({
methods,
dbUri,
isActiveDb,
});
}
public fireHideModeledMethodsChangedEvent(
hideModeledMethods: boolean,
isActiveDb: boolean,
) {
this.onHideModeledMethodsChangedEventEmitter.fire({
hideModeledMethods,
isActiveDb,
});
}
public fireModeChangedEvent(mode: Mode, isActiveDb: boolean) {
this.onModeChangedEventEmitter.fire({
mode,
isActiveDb,
});
}
public fireModeledMethodsChangedEvent(
modeledMethods: Record<string, ModeledMethod[]>,
dbUri: string,
isActiveDb: boolean,
) {
this.onModeledMethodsChangedEventEmitter.fire({
modeledMethods,
dbUri,
isActiveDb,
});
}
public fireModifiedMethodsChangedEvent(
modifiedMethods: ReadonlySet<string>,
dbUri: string,
isActiveDb: boolean,
) {
this.onModifiedMethodsChangedEventEmitter.fire({
modifiedMethods,
dbUri,
isActiveDb,
});
}
public fireSelectedMethodChangedEvent(
databaseItem: DatabaseItem,
method: Method,
usage: Usage,
modeledMethods: ModeledMethod[],
isModified: boolean,
isInProgress: boolean,
) {
this.onSelectedMethodChangedEventEmitter.fire({
databaseItem,
method,
usage,
modeledMethods,
isModified,
isInProgress,
});
}
public fireInProgressMethodsChangedEvent(
dbUri: string,
methods: ReadonlySet<string>,
) {
this.onInProgressMethodsChangedEventEmitter.fire({
dbUri,
methods,
});
}
}

View File

@@ -1,9 +1,8 @@
import { App } from "../common/app";
import { DisposableObject } from "../common/disposable-object";
import { AppEvent, AppEventEmitter } from "../common/events";
import { DatabaseItem } from "../databases/local-databases";
import { Method, Usage } from "./method";
import { ModeledMethod } from "./modeled-method";
import { ModelingEvents } from "./modeling-events";
import { INITIAL_HIDE_MODELED_METHODS_VALUE } from "./shared/hide-modeled-methods";
import { INITIAL_MODE, Mode } from "./shared/mode";
@@ -40,131 +39,15 @@ interface SelectedMethodDetails {
readonly isInProgress: boolean;
}
interface MethodsChangedEvent {
readonly methods: readonly Method[];
readonly dbUri: string;
readonly isActiveDb: boolean;
}
interface HideModeledMethodsChangedEvent {
readonly hideModeledMethods: boolean;
readonly isActiveDb: boolean;
}
interface ModeChangedEvent {
readonly mode: Mode;
readonly isActiveDb: boolean;
}
interface ModeledMethodsChangedEvent {
readonly modeledMethods: Readonly<Record<string, ModeledMethod[]>>;
readonly dbUri: string;
readonly isActiveDb: boolean;
}
interface ModifiedMethodsChangedEvent {
readonly modifiedMethods: ReadonlySet<string>;
readonly dbUri: string;
readonly isActiveDb: boolean;
}
interface SelectedMethodChangedEvent {
readonly databaseItem: DatabaseItem;
readonly method: Method;
readonly usage: Usage;
readonly modeledMethods: readonly ModeledMethod[];
readonly isModified: boolean;
readonly isInProgress: boolean;
}
interface InProgressMethodsChangedEvent {
readonly dbUri: string;
readonly methods: ReadonlySet<string>;
}
export class ModelingStore extends DisposableObject {
public readonly onActiveDbChanged: AppEvent<void>;
public readonly onDbOpened: AppEvent<string>;
public readonly onDbClosed: AppEvent<string>;
public readonly onMethodsChanged: AppEvent<MethodsChangedEvent>;
public readonly onHideModeledMethodsChanged: AppEvent<HideModeledMethodsChangedEvent>;
public readonly onModeChanged: AppEvent<ModeChangedEvent>;
public readonly onModeledMethodsChanged: AppEvent<ModeledMethodsChangedEvent>;
public readonly onModifiedMethodsChanged: AppEvent<ModifiedMethodsChangedEvent>;
public readonly onSelectedMethodChanged: AppEvent<SelectedMethodChangedEvent>;
public readonly onInProgressMethodsChanged: AppEvent<InProgressMethodsChangedEvent>;
private readonly state: Map<string, InternalDbModelingState>;
private activeDb: string | undefined;
private readonly onActiveDbChangedEventEmitter: AppEventEmitter<void>;
private readonly onDbOpenedEventEmitter: AppEventEmitter<string>;
private readonly onDbClosedEventEmitter: AppEventEmitter<string>;
private readonly onMethodsChangedEventEmitter: AppEventEmitter<MethodsChangedEvent>;
private readonly onHideModeledMethodsChangedEventEmitter: AppEventEmitter<HideModeledMethodsChangedEvent>;
private readonly onModeChangedEventEmitter: AppEventEmitter<ModeChangedEvent>;
private readonly onModeledMethodsChangedEventEmitter: AppEventEmitter<ModeledMethodsChangedEvent>;
private readonly onModifiedMethodsChangedEventEmitter: AppEventEmitter<ModifiedMethodsChangedEvent>;
private readonly onSelectedMethodChangedEventEmitter: AppEventEmitter<SelectedMethodChangedEvent>;
private readonly onInProgressMethodsChangedEventEmitter: AppEventEmitter<InProgressMethodsChangedEvent>;
constructor(app: App) {
constructor(private readonly modelingEvents: ModelingEvents) {
super();
// State initialization
this.state = new Map<string, InternalDbModelingState>();
// Event initialization
this.onActiveDbChangedEventEmitter = this.push(
app.createEventEmitter<void>(),
);
this.onActiveDbChanged = this.onActiveDbChangedEventEmitter.event;
this.onDbOpenedEventEmitter = this.push(app.createEventEmitter<string>());
this.onDbOpened = this.onDbOpenedEventEmitter.event;
this.onDbClosedEventEmitter = this.push(app.createEventEmitter<string>());
this.onDbClosed = this.onDbClosedEventEmitter.event;
this.onMethodsChangedEventEmitter = this.push(
app.createEventEmitter<MethodsChangedEvent>(),
);
this.onMethodsChanged = this.onMethodsChangedEventEmitter.event;
this.onHideModeledMethodsChangedEventEmitter = this.push(
app.createEventEmitter<HideModeledMethodsChangedEvent>(),
);
this.onHideModeledMethodsChanged =
this.onHideModeledMethodsChangedEventEmitter.event;
this.onModeChangedEventEmitter = this.push(
app.createEventEmitter<ModeChangedEvent>(),
);
this.onModeChanged = this.onModeChangedEventEmitter.event;
this.onModeledMethodsChangedEventEmitter = this.push(
app.createEventEmitter<ModeledMethodsChangedEvent>(),
);
this.onModeledMethodsChanged =
this.onModeledMethodsChangedEventEmitter.event;
this.onModifiedMethodsChangedEventEmitter = this.push(
app.createEventEmitter<ModifiedMethodsChangedEvent>(),
);
this.onModifiedMethodsChanged =
this.onModifiedMethodsChangedEventEmitter.event;
this.onSelectedMethodChangedEventEmitter = this.push(
app.createEventEmitter<SelectedMethodChangedEvent>(),
);
this.onSelectedMethodChanged =
this.onSelectedMethodChangedEventEmitter.event;
this.onInProgressMethodsChangedEventEmitter = this.push(
app.createEventEmitter<InProgressMethodsChangedEvent>(),
);
this.onInProgressMethodsChanged =
this.onInProgressMethodsChangedEventEmitter.event;
}
public initializeStateForDb(
@@ -184,12 +67,12 @@ export class ModelingStore extends DisposableObject {
inProgressMethods: new Set(),
});
this.onDbOpenedEventEmitter.fire(dbUri);
this.modelingEvents.fireDbClosedEvent(dbUri);
}
public setActiveDb(databaseItem: DatabaseItem) {
this.activeDb = databaseItem.databaseUri.toString();
this.onActiveDbChangedEventEmitter.fire();
this.modelingEvents.fireActiveDbChangedEvent();
}
public removeDb(databaseItem: DatabaseItem) {
@@ -201,11 +84,11 @@ export class ModelingStore extends DisposableObject {
if (this.activeDb === dbUri) {
this.activeDb = undefined;
this.onActiveDbChangedEventEmitter.fire();
this.modelingEvents.fireActiveDbChangedEvent();
}
this.state.delete(dbUri);
this.onDbClosedEventEmitter.fire(dbUri);
this.modelingEvents.fireDbClosedEvent(dbUri);
}
public getStateForActiveDb(): DbModelingState | undefined {
@@ -268,11 +151,11 @@ export class ModelingStore extends DisposableObject {
dbState.methods = [...methods];
this.onMethodsChangedEventEmitter.fire({
this.modelingEvents.fireMethodsChangedEvent(
methods,
dbUri,
isActiveDb: dbUri === this.activeDb,
});
dbUri === this.activeDb,
);
}
public setHideModeledMethods(
@@ -284,10 +167,10 @@ export class ModelingStore extends DisposableObject {
dbState.hideModeledMethods = hideModeledMethods;
this.onHideModeledMethodsChangedEventEmitter.fire({
this.modelingEvents.fireHideModeledMethodsChangedEvent(
hideModeledMethods,
isActiveDb: dbUri === this.activeDb,
});
dbUri === this.activeDb,
);
}
public setMode(dbItem: DatabaseItem, mode: Mode) {
@@ -296,10 +179,7 @@ export class ModelingStore extends DisposableObject {
dbState.mode = mode;
this.onModeChangedEventEmitter.fire({
mode,
isActiveDb: dbUri === this.activeDb,
});
this.modelingEvents.fireModeChangedEvent(mode, dbUri === this.activeDb);
}
public getMode(dbItem: DatabaseItem) {
@@ -416,14 +296,17 @@ export class ModelingStore extends DisposableObject {
dbState.selectedMethod = method;
dbState.selectedUsage = usage;
this.onSelectedMethodChangedEventEmitter.fire({
databaseItem: dbItem,
const modeledMethods = dbState.modeledMethods[method.signature] ?? [];
const isModified = dbState.modifiedMethodSignatures.has(method.signature);
const isInProgress = dbState.inProgressMethods.has(method.signature);
this.modelingEvents.fireSelectedMethodChangedEvent(
dbItem,
method,
usage,
modeledMethods: dbState.modeledMethods[method.signature] ?? [],
isModified: dbState.modifiedMethodSignatures.has(method.signature),
isInProgress: dbState.inProgressMethods.has(method.signature),
});
modeledMethods,
isModified,
isInProgress,
);
}
public addInProgressMethods(
@@ -492,11 +375,11 @@ export class ModelingStore extends DisposableObject {
updateState(state);
this.onModifiedMethodsChangedEventEmitter.fire({
modifiedMethods: state.modifiedMethodSignatures,
dbUri: dbItem.databaseUri.toString(),
isActiveDb: dbItem.databaseUri.toString() === this.activeDb,
});
this.modelingEvents.fireModifiedMethodsChangedEvent(
state.modifiedMethodSignatures,
dbItem.databaseUri.toString(),
dbItem.databaseUri.toString() === this.activeDb,
);
}
private changeModeledMethods(
@@ -507,11 +390,11 @@ export class ModelingStore extends DisposableObject {
updateState(state);
this.onModeledMethodsChangedEventEmitter.fire({
modeledMethods: state.modeledMethods,
dbUri: dbItem.databaseUri.toString(),
isActiveDb: dbItem.databaseUri.toString() === this.activeDb,
});
this.modelingEvents.fireModeledMethodsChangedEvent(
state.modeledMethods,
dbItem.databaseUri.toString(),
dbItem.databaseUri.toString() === this.activeDb,
);
}
private changeInProgressMethods(
@@ -522,9 +405,9 @@ export class ModelingStore extends DisposableObject {
updateState(state);
this.onInProgressMethodsChangedEventEmitter.fire({
dbUri: dbItem.databaseUri.toString(),
methods: state.inProgressMethods,
});
this.modelingEvents.fireInProgressMethodsChangedEvent(
dbItem.databaseUri.toString(),
state.inProgressMethods,
);
}
}

View File

@@ -0,0 +1,33 @@
import { mockedObject } from "../../vscode-tests/utils/mocking.helpers";
import { ModelingEvents } from "../../../src/model-editor/modeling-events";
export function createMockModelingEvents({
onActiveDbChanged = jest.fn(),
onDbClosed = jest.fn(),
onMethodsChanged = jest.fn(),
onHideModeledMethodsChanged = jest.fn(),
onModeChanged = jest.fn(),
onModeledMethodsChanged = jest.fn(),
onModifiedMethodsChanged = jest.fn(),
onInProgressMethodsChanged = jest.fn(),
}: {
onActiveDbChanged?: ModelingEvents["onActiveDbChanged"];
onDbClosed?: ModelingEvents["onDbClosed"];
onMethodsChanged?: ModelingEvents["onMethodsChanged"];
onHideModeledMethodsChanged?: ModelingEvents["onHideModeledMethodsChanged"];
onModeChanged?: ModelingEvents["onModeChanged"];
onModeledMethodsChanged?: ModelingEvents["onModeledMethodsChanged"];
onModifiedMethodsChanged?: ModelingEvents["onModifiedMethodsChanged"];
onInProgressMethodsChanged?: ModelingEvents["onInProgressMethodsChanged"];
} = {}): ModelingEvents {
return mockedObject<ModelingEvents>({
onActiveDbChanged,
onDbClosed,
onMethodsChanged,
onHideModeledMethodsChanged,
onModeChanged,
onModeledMethodsChanged,
onModifiedMethodsChanged,
onInProgressMethodsChanged,
});
}

View File

@@ -4,36 +4,12 @@ import { ModelingStore } from "../../../src/model-editor/modeling-store";
export function createMockModelingStore({
initializeStateForDb = jest.fn(),
getStateForActiveDb = jest.fn(),
onActiveDbChanged = jest.fn(),
onDbClosed = jest.fn(),
onMethodsChanged = jest.fn(),
onHideModeledMethodsChanged = jest.fn(),
onModeChanged = jest.fn(),
onModeledMethodsChanged = jest.fn(),
onModifiedMethodsChanged = jest.fn(),
onInProgressMethodsChanged = jest.fn(),
}: {
initializeStateForDb?: ModelingStore["initializeStateForDb"];
getStateForActiveDb?: ModelingStore["getStateForActiveDb"];
onActiveDbChanged?: ModelingStore["onActiveDbChanged"];
onDbClosed?: ModelingStore["onDbClosed"];
onMethodsChanged?: ModelingStore["onMethodsChanged"];
onHideModeledMethodsChanged?: ModelingStore["onHideModeledMethodsChanged"];
onModeChanged?: ModelingStore["onModeChanged"];
onModeledMethodsChanged?: ModelingStore["onModeledMethodsChanged"];
onModifiedMethodsChanged?: ModelingStore["onModifiedMethodsChanged"];
onInProgressMethodsChanged?: ModelingStore["onInProgressMethodsChanged"];
} = {}): ModelingStore {
return mockedObject<ModelingStore>({
initializeStateForDb,
getStateForActiveDb,
onActiveDbChanged,
onDbClosed,
onMethodsChanged,
onHideModeledMethodsChanged,
onModeChanged,
onModeledMethodsChanged,
onModifiedMethodsChanged,
onInProgressMethodsChanged,
});
}

View File

@@ -12,6 +12,8 @@ import { ModelingStore } from "../../../../../src/model-editor/modeling-store";
import { createMockModelingStore } from "../../../../__mocks__/model-editor/modelingStoreMock";
import { ModeledMethod } from "../../../../../src/model-editor/modeled-method";
import { Mode } from "../../../../../src/model-editor/shared/mode";
import { createMockModelingEvents } from "../../../../__mocks__/model-editor/modelingEventsMock";
import { ModelingEvents } from "../../../../../src/model-editor/modeling-events";
describe("MethodsUsagePanel", () => {
const mockCliServer = mockedObject<CodeQLCliServer>({});
@@ -33,8 +35,13 @@ describe("MethodsUsagePanel", () => {
jest.spyOn(window, "createTreeView").mockReturnValue(mockTreeView);
const modelingStore = createMockModelingStore();
const modelingEvents = createMockModelingEvents();
const panel = new MethodsUsagePanel(modelingStore, mockCliServer);
const panel = new MethodsUsagePanel(
modelingStore,
modelingEvents,
mockCliServer,
);
await panel.setState(
methods,
dbItem,
@@ -51,6 +58,7 @@ describe("MethodsUsagePanel", () => {
describe("revealItem", () => {
let mockTreeView: TreeView<unknown>;
let modelingStore: ModelingStore;
let modelingEvents: ModelingEvents;
const hideModeledMethods: boolean = false;
const mode = Mode.Application;
@@ -65,6 +73,7 @@ describe("MethodsUsagePanel", () => {
jest.spyOn(window, "createTreeView").mockReturnValue(mockTreeView);
modelingStore = createMockModelingStore();
modelingEvents = createMockModelingEvents();
});
it("should reveal the correct item in the tree view", async () => {
@@ -73,7 +82,11 @@ describe("MethodsUsagePanel", () => {
});
const methods = [method];
const panel = new MethodsUsagePanel(modelingStore, mockCliServer);
const panel = new MethodsUsagePanel(
modelingStore,
modelingEvents,
mockCliServer,
);
await panel.setState(
methods,
dbItem,
@@ -96,7 +109,11 @@ describe("MethodsUsagePanel", () => {
it("should do nothing if usage cannot be found", async () => {
const method = createMethod({});
const methods = [method];
const panel = new MethodsUsagePanel(modelingStore, mockCliServer);
const panel = new MethodsUsagePanel(
modelingStore,
modelingEvents,
mockCliServer,
);
await panel.setState(
methods,
dbItem,

View File

@@ -11,10 +11,12 @@ import { ExtensionPack } from "../../../../src/model-editor/shared/extension-pac
import { createMockModelingStore } from "../../../__mocks__/model-editor/modelingStoreMock";
import { createMockModelEditorViewTracker } from "../../../__mocks__/model-editor/modelEditorViewTrackerMock";
import { ModelConfigListener } from "../../../../src/config";
import { createMockModelingEvents } from "../../../__mocks__/model-editor/modelingEventsMock";
describe("ModelEditorView", () => {
const app = createMockApp({});
const modelingStore = createMockModelingStore();
const modelingEvents = createMockModelingEvents();
const viewTracker = createMockModelEditorViewTracker();
const modelConfig = mockedObject<ModelConfigListener>({
onDidChangeConfiguration: jest.fn(),
@@ -44,6 +46,7 @@ describe("ModelEditorView", () => {
view = new ModelEditorView(
app,
modelingStore,
modelingEvents,
viewTracker,
modelConfig,
databaseManager,