Skip to content

Commit 623df4c

Browse files
authored
Merge pull request #2919 from github/koesie10/show-multiple-models-listener
Listen to modeling setting changes in the model editor and method modeling panel
2 parents c620939 + 951bd13 commit 623df4c

File tree

10 files changed

+119
-115
lines changed

10 files changed

+119
-115
lines changed

extensions/ql-vscode/src/config.ts

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -705,20 +705,33 @@ const LLM_GENERATION = new Setting("llmGeneration", MODEL_SETTING);
705705
const EXTENSIONS_DIRECTORY = new Setting("extensionsDirectory", MODEL_SETTING);
706706
const SHOW_MULTIPLE_MODELS = new Setting("showMultipleModels", MODEL_SETTING);
707707

708-
export function showFlowGeneration(): boolean {
709-
return !!FLOW_GENERATION.getValue<boolean>();
708+
export interface ModelConfig {
709+
flowGeneration: boolean;
710+
llmGeneration: boolean;
711+
getExtensionsDirectory(languageId: string): string | undefined;
712+
showMultipleModels: boolean;
710713
}
711714

712-
export function showLlmGeneration(): boolean {
713-
return !!LLM_GENERATION.getValue<boolean>();
714-
}
715+
export class ModelConfigListener extends ConfigListener implements ModelConfig {
716+
protected handleDidChangeConfiguration(e: ConfigurationChangeEvent): void {
717+
this.handleDidChangeConfigurationForRelevantSettings([MODEL_SETTING], e);
718+
}
715719

716-
export function getExtensionsDirectory(languageId: string): string | undefined {
717-
return EXTENSIONS_DIRECTORY.getValue<string>({
718-
languageId,
719-
});
720-
}
720+
public get flowGeneration(): boolean {
721+
return !!FLOW_GENERATION.getValue<boolean>();
722+
}
721723

722-
export function showMultipleModels(): boolean {
723-
return !!SHOW_MULTIPLE_MODELS.getValue<boolean>();
724+
public get llmGeneration(): boolean {
725+
return !!LLM_GENERATION.getValue<boolean>();
726+
}
727+
728+
public getExtensionsDirectory(languageId: string): string | undefined {
729+
return EXTENSIONS_DIRECTORY.getValue<string>({
730+
languageId,
731+
});
732+
}
733+
734+
public get showMultipleModels(): boolean {
735+
return !!SHOW_MULTIPLE_MODELS.getValue<boolean>();
736+
}
724737
}

extensions/ql-vscode/src/model-editor/extension-pack-picker.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { getQlPackPath, QLPACK_FILENAMES } from "../common/ql";
1111
import { getErrorMessage } from "../common/helpers-pure";
1212
import { ExtensionPack } from "./shared/extension-pack";
1313
import { NotificationLogger, showAndLogErrorMessage } from "../common/logging";
14-
import { getExtensionsDirectory } from "../config";
14+
import { ModelConfig } from "../config";
1515
import {
1616
autoNameExtensionPack,
1717
ExtensionPackName,
@@ -28,6 +28,7 @@ const extensionPackValidate = ajv.compile(extensionPackMetadataSchemaJson);
2828
export async function pickExtensionPack(
2929
cliServer: Pick<CodeQLCliServer, "resolveQlpacks">,
3030
databaseItem: Pick<DatabaseItem, "name" | "language">,
31+
modelConfig: ModelConfig,
3132
logger: NotificationLogger,
3233
progress: ProgressCallback,
3334
maxStep: number,
@@ -56,7 +57,9 @@ export async function pickExtensionPack(
5657
});
5758

5859
// Get the `codeQL.model.extensionsDirectory` setting for the language
59-
const userExtensionsDirectory = getExtensionsDirectory(databaseItem.language);
60+
const userExtensionsDirectory = modelConfig.getExtensionsDirectory(
61+
databaseItem.language,
62+
);
6063

6164
// If the setting is not set, automatically pick a suitable directory
6265
const extensionsDirectory = userExtensionsDirectory

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { MethodModelingViewProvider } from "./method-modeling-view-provider";
55
import { Method } from "../method";
66
import { ModelingStore } from "../modeling-store";
77
import { ModelEditorViewTracker } from "../model-editor-view-tracker";
8+
import { ModelConfigListener } from "../../config";
89

910
export class MethodModelingPanel extends DisposableObject {
1011
private readonly provider: MethodModelingViewProvider;
@@ -16,10 +17,16 @@ export class MethodModelingPanel extends DisposableObject {
1617
) {
1718
super();
1819

20+
// This is here instead of in MethodModelingViewProvider because we need to
21+
// dispose this when the extension gets disposed, not when the webview gets
22+
// disposed.
23+
const modelConfig = this.push(new ModelConfigListener());
24+
1925
this.provider = new MethodModelingViewProvider(
2026
app,
2127
modelingStore,
2228
editorViewTracker,
29+
modelConfig,
2330
);
2431
this.push(
2532
window.registerWebviewViewProvider(

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

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { DbModelingState, ModelingStore } from "../modeling-store";
1212
import { AbstractWebviewViewProvider } from "../../common/vscode/abstract-webview-view-provider";
1313
import { assertNever } from "../../common/helpers-pure";
1414
import { ModelEditorViewTracker } from "../model-editor-view-tracker";
15-
import { showMultipleModels } from "../../config";
15+
import { ModelConfigListener } from "../../config";
1616

1717
export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
1818
ToMethodModelingMessage,
@@ -26,20 +26,22 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
2626
app: App,
2727
private readonly modelingStore: ModelingStore,
2828
private readonly editorViewTracker: ModelEditorViewTracker,
29+
private readonly modelConfig: ModelConfigListener,
2930
) {
3031
super(app, "method-modeling");
3132
}
3233

3334
protected override async onWebViewLoaded(): Promise<void> {
3435
await Promise.all([this.setViewState(), this.setInitialState()]);
3536
this.registerToModelingStoreEvents();
37+
this.registerToModelConfigEvents();
3638
}
3739

3840
private async setViewState(): Promise<void> {
3941
await this.postMessage({
4042
t: "setMethodModelingPanelViewState",
4143
viewState: {
42-
showMultipleModels: showMultipleModels(),
44+
showMultipleModels: this.modelConfig.showMultipleModels,
4345
},
4446
});
4547
}
@@ -198,4 +200,12 @@ export class MethodModelingViewProvider extends AbstractWebviewViewProvider<
198200
}),
199201
);
200202
}
203+
204+
private registerToModelConfigEvents(): void {
205+
this.push(
206+
this.modelConfig.onDidChangeConfiguration(() => {
207+
void this.setViewState();
208+
}),
209+
);
210+
}
201211
}

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { MethodModelingPanel } from "./method-modeling/method-modeling-panel";
2121
import { ModelingStore } from "./modeling-store";
2222
import { showResolvableLocation } from "../databases/local-databases/locations";
2323
import { ModelEditorViewTracker } from "./model-editor-view-tracker";
24+
import { ModelConfigListener } from "../config";
2425

2526
const SUPPORTED_LANGUAGES: string[] = ["java", "csharp"];
2627

@@ -150,9 +151,12 @@ export class ModelEditorModule extends DisposableObject {
150151
return;
151152
}
152153

154+
const modelConfig = this.push(new ModelConfigListener());
155+
153156
const modelFile = await pickExtensionPack(
154157
this.cliServer,
155158
db,
159+
modelConfig,
156160
this.app.logger,
157161
progress,
158162
maxStep,
@@ -172,7 +176,12 @@ export class ModelEditorModule extends DisposableObject {
172176
unsafeCleanup: true,
173177
});
174178

175-
const success = await setUpPack(this.cliServer, queryDir, language);
179+
const success = await setUpPack(
180+
this.cliServer,
181+
queryDir,
182+
language,
183+
modelConfig,
184+
);
176185
if (!success) {
177186
await cleanupQueryDir();
178187
return;
@@ -188,6 +197,7 @@ export class ModelEditorModule extends DisposableObject {
188197
this.app,
189198
this.modelingStore,
190199
this.editorViewTracker,
200+
modelConfig,
191201
this.databaseManager,
192202
this.cliServer,
193203
this.queryRunner,

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { writeFile } from "fs-extra";
44
import { dump } from "js-yaml";
55
import { prepareExternalApiQuery } from "./external-api-usage-queries";
66
import { CodeQLCliServer } from "../codeql-cli/cli";
7-
import { showLlmGeneration } from "../config";
7+
import { ModelConfig } from "../config";
88
import { Mode } from "./shared/mode";
99
import { resolveQueriesFromPacks } from "../local-queries";
1010
import { modeTag } from "./mode-tag";
@@ -28,12 +28,14 @@ export const syntheticQueryPackName = "codeql/external-api-usage";
2828
* @param cliServer The CodeQL CLI server to use.
2929
* @param queryDir The directory to set up.
3030
* @param language The language to use for the queries.
31+
* @param modelConfig The model config to use.
3132
* @returns true if the setup was successful, false otherwise.
3233
*/
3334
export async function setUpPack(
3435
cliServer: CodeQLCliServer,
3536
queryDir: string,
3637
language: QueryLanguage,
38+
modelConfig: ModelConfig,
3739
): Promise<boolean> {
3840
// Download the required query packs
3941
await cliServer.packDownload([`codeql/${language}-queries`]);
@@ -84,7 +86,7 @@ export async function setUpPack(
8486
}
8587

8688
// Download any other required packs
87-
if (language === "java" && showLlmGeneration()) {
89+
if (language === "java" && modelConfig.llmGeneration) {
8890
await cliServer.packDownload([`codeql/${language}-automodel-queries`]);
8991
}
9092

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

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ import {
1717
import { ProgressCallback, withProgress } from "../common/vscode/progress";
1818
import { QueryRunner } from "../query-server";
1919
import {
20-
showAndLogExceptionWithTelemetry,
2120
showAndLogErrorMessage,
21+
showAndLogExceptionWithTelemetry,
2222
} from "../common/logging";
2323
import { DatabaseItem, DatabaseManager } from "../databases/local-databases";
2424
import { CodeQLCliServer } from "../codeql-cli/cli";
@@ -34,11 +34,7 @@ import {
3434
import { Method, Usage } from "./method";
3535
import { ModeledMethod } from "./modeled-method";
3636
import { ExtensionPack } from "./shared/extension-pack";
37-
import {
38-
showFlowGeneration,
39-
showLlmGeneration,
40-
showMultipleModels,
41-
} from "../config";
37+
import { ModelConfigListener } from "../config";
4238
import { Mode } from "./shared/mode";
4339
import { loadModeledMethods, saveModeledMethods } from "./modeled-method-fs";
4440
import { pickExtensionPack } from "./extension-pack-picker";
@@ -62,6 +58,7 @@ export class ModelEditorView extends AbstractWebview<
6258
protected readonly app: App,
6359
private readonly modelingStore: ModelingStore,
6460
private readonly viewTracker: ModelEditorViewTracker<ModelEditorView>,
61+
private readonly modelConfig: ModelConfigListener,
6562
private readonly databaseManager: DatabaseManager,
6663
private readonly cliServer: CodeQLCliServer,
6764
private readonly queryRunner: QueryRunner,
@@ -75,6 +72,7 @@ export class ModelEditorView extends AbstractWebview<
7572

7673
this.modelingStore.initializeStateForDb(databaseItem);
7774
this.registerToModelingStoreEvents();
75+
this.registerToModelConfigEvents();
7876

7977
this.viewTracker.registerView(this);
8078

@@ -349,15 +347,15 @@ export class ModelEditorView extends AbstractWebview<
349347

350348
private async setViewState(): Promise<void> {
351349
const showLlmButton =
352-
this.databaseItem.language === "java" && showLlmGeneration();
350+
this.databaseItem.language === "java" && this.modelConfig.llmGeneration;
353351

354352
await this.postMessage({
355353
t: "setModelEditorViewState",
356354
viewState: {
357355
extensionPack: this.extensionPack,
358-
showFlowGeneration: showFlowGeneration(),
356+
showFlowGeneration: this.modelConfig.flowGeneration,
359357
showLlmButton,
360-
showMultipleModels: showMultipleModels(),
358+
showMultipleModels: this.modelConfig.showMultipleModels,
361359
mode: this.mode,
362360
},
363361
});
@@ -499,6 +497,7 @@ export class ModelEditorView extends AbstractWebview<
499497
const modelFile = await pickExtensionPack(
500498
this.cliServer,
501499
addedDatabase,
500+
this.modelConfig,
502501
this.app.logger,
503502
progress,
504503
3,
@@ -511,6 +510,7 @@ export class ModelEditorView extends AbstractWebview<
511510
this.app,
512511
this.modelingStore,
513512
this.viewTracker,
513+
this.modelConfig,
514514
this.databaseManager,
515515
this.cliServer,
516516
this.queryRunner,
@@ -632,6 +632,14 @@ export class ModelEditorView extends AbstractWebview<
632632
);
633633
}
634634

635+
private registerToModelConfigEvents() {
636+
this.push(
637+
this.modelConfig.onDidChangeConfiguration(() => {
638+
void this.setViewState();
639+
}),
640+
);
641+
}
642+
635643
private addModeledMethods(modeledMethods: Record<string, ModeledMethod>) {
636644
this.modelingStore.addModeledMethods(this.databaseItem, modeledMethods);
637645

0 commit comments

Comments
 (0)