Skip to content

Commit 951bd13

Browse files
committed
Use ModelConfig for all model settings
This switches all places where we're retrieving some model configuration to use the `ModelConfig` or `ModelConfigListener` types. This makes it much easier to mock these settings in tests. This also adds a listener to the `ModelEditorView` to send the new view state when any of the settings is changed. This should make it easier to test settings changes in the model editor without having to re-open the model editor.
1 parent 08944a2 commit 951bd13

File tree

8 files changed

+80
-122
lines changed

8 files changed

+80
-122
lines changed

extensions/ql-vscode/src/config.ts

Lines changed: 5 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -714,7 +714,7 @@ const SHOW_MULTIPLE_MODELS = new Setting("showMultipleModels", MODEL_SETTING);
714714
export interface ModelConfig {
715715
flowGeneration: boolean;
716716
llmGeneration: boolean;
717-
extensionsDirectory: string | undefined;
717+
getExtensionsDirectory(languageId: string): string | undefined;
718718
showMultipleModels: boolean;
719719
}
720720

@@ -731,29 +731,13 @@ export class ModelConfigListener extends ConfigListener implements ModelConfig {
731731
return !!LLM_GENERATION.getValue<boolean>();
732732
}
733733

734-
public get extensionsDirectory(): string | undefined {
735-
return EXTENSIONS_DIRECTORY.getValue<string>();
734+
public getExtensionsDirectory(languageId: string): string | undefined {
735+
return EXTENSIONS_DIRECTORY.getValue<string>({
736+
languageId,
737+
});
736738
}
737739

738740
public get showMultipleModels(): boolean {
739741
return !!SHOW_MULTIPLE_MODELS.getValue<boolean>();
740742
}
741743
}
742-
743-
export function showFlowGeneration(): boolean {
744-
return !!FLOW_GENERATION.getValue<boolean>();
745-
}
746-
747-
export function showLlmGeneration(): boolean {
748-
return !!LLM_GENERATION.getValue<boolean>();
749-
}
750-
751-
export function getExtensionsDirectory(languageId: string): string | undefined {
752-
return EXTENSIONS_DIRECTORY.getValue<string>({
753-
languageId,
754-
});
755-
}
756-
757-
export function showMultipleModels(): boolean {
758-
return !!SHOW_MULTIPLE_MODELS.getValue<boolean>();
759-
}

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/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";
@@ -58,6 +54,7 @@ export class ModelEditorView extends AbstractWebview<
5854
protected readonly app: App,
5955
private readonly modelingStore: ModelingStore,
6056
private readonly viewTracker: ModelEditorViewTracker<ModelEditorView>,
57+
private readonly modelConfig: ModelConfigListener,
6158
private readonly databaseManager: DatabaseManager,
6259
private readonly cliServer: CodeQLCliServer,
6360
private readonly queryRunner: QueryRunner,
@@ -71,6 +68,7 @@ export class ModelEditorView extends AbstractWebview<
7168

7269
this.modelingStore.initializeStateForDb(databaseItem);
7370
this.registerToModelingStoreEvents();
71+
this.registerToModelConfigEvents();
7472

7573
this.viewTracker.registerView(this);
7674

@@ -334,15 +332,15 @@ export class ModelEditorView extends AbstractWebview<
334332

335333
private async setViewState(): Promise<void> {
336334
const showLlmButton =
337-
this.databaseItem.language === "java" && showLlmGeneration();
335+
this.databaseItem.language === "java" && this.modelConfig.llmGeneration;
338336

339337
await this.postMessage({
340338
t: "setModelEditorViewState",
341339
viewState: {
342340
extensionPack: this.extensionPack,
343-
showFlowGeneration: showFlowGeneration(),
341+
showFlowGeneration: this.modelConfig.flowGeneration,
344342
showLlmButton,
345-
showMultipleModels: showMultipleModels(),
343+
showMultipleModels: this.modelConfig.showMultipleModels,
346344
mode: this.mode,
347345
},
348346
});
@@ -481,6 +479,7 @@ export class ModelEditorView extends AbstractWebview<
481479
const modelFile = await pickExtensionPack(
482480
this.cliServer,
483481
addedDatabase,
482+
this.modelConfig,
484483
this.app.logger,
485484
progress,
486485
3,
@@ -493,6 +492,7 @@ export class ModelEditorView extends AbstractWebview<
493492
this.app,
494493
this.modelingStore,
495494
this.viewTracker,
495+
this.modelConfig,
496496
this.databaseManager,
497497
this.cliServer,
498498
this.queryRunner,
@@ -614,6 +614,14 @@ export class ModelEditorView extends AbstractWebview<
614614
);
615615
}
616616

617+
private registerToModelConfigEvents() {
618+
this.push(
619+
this.modelConfig.onDidChangeConfiguration(() => {
620+
void this.setViewState();
621+
}),
622+
);
623+
}
624+
617625
private addModeledMethods(modeledMethods: Record<string, ModeledMethod>) {
618626
this.modelingStore.addModeledMethods(this.databaseItem, modeledMethods);
619627

0 commit comments

Comments
 (0)