Skip to content

Commit 8e721a6

Browse files
committed
Use new language definitions for reading/writing
1 parent df3b94c commit 8e721a6

File tree

9 files changed

+118
-55
lines changed

9 files changed

+118
-55
lines changed

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { Mode } from "./shared/mode";
1818
import { CancellationTokenSource } from "vscode";
1919
import { ModelingStore } from "./modeling-store";
2020
import { ModelConfigListener } from "../config";
21+
import { QueryLanguage } from "../common/query-language";
2122

2223
/**
2324
* The auto-modeler holds state around auto-modeling jobs and allows
@@ -36,6 +37,7 @@ export class AutoModeler {
3637
private readonly modelingStore: ModelingStore,
3738
private readonly queryStorageDir: string,
3839
private readonly databaseItem: DatabaseItem,
40+
private readonly language: QueryLanguage,
3941
private readonly addModeledMethods: (
4042
modeledMethods: Record<string, ModeledMethod[]>,
4143
) => Promise<void>,
@@ -202,7 +204,7 @@ export class AutoModeler {
202204
filename: "auto-model.yml",
203205
});
204206

205-
const loadedMethods = loadDataExtensionYaml(models);
207+
const loadedMethods = loadDataExtensionYaml(models, this.language);
206208
if (!loadedMethods) {
207209
return;
208210
}

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

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,20 +5,22 @@ import { QueryRunner } from "../query-server";
55
import { CodeQLCliServer } from "../codeql-cli/cli";
66
import { showAndLogExceptionWithTelemetry } from "../common/logging";
77
import { extLogger } from "../common/logging/vscode";
8-
import { extensiblePredicateDefinitions } from "./languages";
8+
import { getModelsAsDataLanguage } from "./languages";
99
import { ProgressCallback } from "../common/vscode/progress";
1010
import { getOnDiskWorkspaceFolders } from "../common/vscode/workspace-folders";
1111
import { ModeledMethod, ModeledMethodType } from "./modeled-method";
1212
import { redactableError } from "../common/errors";
1313
import { telemetryListener } from "../common/vscode/telemetry";
1414
import { runQuery } from "../local-queries/run-query";
1515
import { resolveQueries } from "../local-queries";
16+
import { QueryLanguage } from "../common/query-language";
1617

1718
type FlowModelOptions = {
1819
cliServer: CodeQLCliServer;
1920
queryRunner: QueryRunner;
2021
queryStorageDir: string;
2122
databaseItem: DatabaseItem;
23+
language: QueryLanguage;
2224
progress: ProgressCallback;
2325
token: CancellationToken;
2426
onResults: (results: ModeledMethod[]) => void | Promise<void>;
@@ -104,6 +106,7 @@ async function runSingleFlowQuery(
104106
queryRunner,
105107
queryStorageDir,
106108
databaseItem,
109+
language,
107110
progress,
108111
token,
109112
}: Omit<FlowModelOptions, "onResults">,
@@ -140,7 +143,12 @@ async function runSingleFlowQuery(
140143
}
141144

142145
// Interpret the results
143-
const definition = extensiblePredicateDefinitions[type];
146+
const modelsAsDataLanguage = getModelsAsDataLanguage(language);
147+
if (!modelsAsDataLanguage) {
148+
throw new Error(`No models-as-data definition for ${language}`);
149+
}
150+
151+
const definition = modelsAsDataLanguage[type];
144152

145153
const bqrsPath = completedQuery.outputDir.bqrsPath;
146154

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1+
export * from "./languages";
2+
export * from "./models-as-data";
13
export * from "./predicates";
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { QueryLanguage } from "../../common/query-language";
2+
import { ModelsAsDataLanguage } from "./models-as-data";
3+
import { staticLanguage } from "./static";
4+
5+
const languages: Partial<Record<QueryLanguage, ModelsAsDataLanguage>> = {
6+
[QueryLanguage.CSharp]: staticLanguage,
7+
[QueryLanguage.Java]: staticLanguage,
8+
};
9+
10+
export function getModelsAsDataLanguage(
11+
language: QueryLanguage,
12+
): ModelsAsDataLanguage | undefined {
13+
return languages[language];
14+
}

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ export class ModelEditorView extends AbstractWebview<
8787
modelingStore,
8888
queryStorageDir,
8989
databaseItem,
90+
language,
9091
async (modeledMethods) => {
9192
this.addModeledMethods(modeledMethods);
9293
},
@@ -223,7 +224,7 @@ export class ModelEditorView extends AbstractWebview<
223224
});
224225
await saveModeledMethods(
225226
this.extensionPack,
226-
this.databaseItem.language,
227+
this.language,
227228
methods,
228229
modeledMethods,
229230
mode,
@@ -399,6 +400,7 @@ export class ModelEditorView extends AbstractWebview<
399400
try {
400401
const modeledMethods = await loadModeledMethods(
401402
this.extensionPack,
403+
this.language,
402404
this.cliServer,
403405
this.app.logger,
404406
);
@@ -463,6 +465,14 @@ export class ModelEditorView extends AbstractWebview<
463465
if (!addedDatabase) {
464466
return;
465467
}
468+
469+
if (addedDatabase.language !== this.language) {
470+
void showAndLogErrorMessage(
471+
this.app.logger,
472+
`The selected database is for ${addedDatabase.language}, but the current database is for ${this.language}.`,
473+
);
474+
return;
475+
}
466476
}
467477

468478
progress({
@@ -477,6 +487,7 @@ export class ModelEditorView extends AbstractWebview<
477487
queryRunner: this.queryRunner,
478488
queryStorageDir: this.queryStorageDir,
479489
databaseItem: addedDatabase ?? this.databaseItem,
490+
language: this.language,
480491
onResults: async (modeledMethods) => {
481492
const modeledMethodsByName: Record<string, ModeledMethod[]> = {};
482493

extensions/ql-vscode/src/model-editor/modeled-method-fs.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,11 @@ import { getOnDiskWorkspaceFolders } from "../common/vscode/workspace-folders";
1010
import { load as loadYaml } from "js-yaml";
1111
import { CodeQLCliServer } from "../codeql-cli/cli";
1212
import { pathsEqual } from "../common/files";
13+
import { QueryLanguage } from "../common/query-language";
1314

1415
export async function saveModeledMethods(
1516
extensionPack: ExtensionPack,
16-
language: string,
17+
language: QueryLanguage,
1718
methods: readonly Method[],
1819
modeledMethods: Readonly<Record<string, readonly ModeledMethod[]>>,
1920
mode: Mode,
@@ -22,6 +23,7 @@ export async function saveModeledMethods(
2223
): Promise<void> {
2324
const existingModeledMethods = await loadModeledMethodFiles(
2425
extensionPack,
26+
language,
2527
cliServer,
2628
logger,
2729
);
@@ -43,6 +45,7 @@ export async function saveModeledMethods(
4345

4446
async function loadModeledMethodFiles(
4547
extensionPack: ExtensionPack,
48+
language: QueryLanguage,
4649
cliServer: CodeQLCliServer,
4750
logger: NotificationLogger,
4851
): Promise<Record<string, Record<string, ModeledMethod[]>>> {
@@ -60,7 +63,7 @@ async function loadModeledMethodFiles(
6063
filename: modelFile,
6164
});
6265

63-
const modeledMethods = loadDataExtensionYaml(data);
66+
const modeledMethods = loadDataExtensionYaml(data, language);
6467
if (!modeledMethods) {
6568
void showAndLogErrorMessage(
6669
logger,
@@ -76,13 +79,15 @@ async function loadModeledMethodFiles(
7679

7780
export async function loadModeledMethods(
7881
extensionPack: ExtensionPack,
82+
language: QueryLanguage,
7983
cliServer: CodeQLCliServer,
8084
logger: NotificationLogger,
8185
): Promise<Record<string, ModeledMethod[]>> {
8286
const existingModeledMethods: Record<string, ModeledMethod[]> = {};
8387

8488
const modeledMethodsByFile = await loadModeledMethodFiles(
8589
extensionPack,
90+
language,
8691
cliServer,
8792
logger,
8893
);

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

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,21 +3,22 @@ import Ajv from "ajv";
33
import { Method } from "./method";
44
import { ModeledMethod, ModeledMethodType } from "./modeled-method";
55
import {
6-
ExtensiblePredicateDefinition,
7-
extensiblePredicateDefinitions,
6+
getModelsAsDataLanguage,
7+
ModelsAsDataLanguageModel,
88
} from "./languages";
99

1010
import * as modelExtensionFileSchema from "./model-extension-file.schema.json";
1111
import { Mode } from "./shared/mode";
1212
import { assertNever } from "../common/helpers-pure";
1313
import { ModelExtensionFile } from "./model-extension-file";
14+
import { QueryLanguage } from "../common/query-language";
1415

1516
const ajv = new Ajv({ allErrors: true, allowUnionTypes: true });
1617
const modelExtensionFileSchemaValidate = ajv.compile(modelExtensionFileSchema);
1718

1819
function createDataProperty(
1920
methods: readonly ModeledMethod[],
20-
definition: ExtensiblePredicateDefinition,
21+
definition: ModelsAsDataLanguageModel,
2122
) {
2223
if (methods.length === 0) {
2324
return " []";
@@ -34,9 +35,14 @@ function createDataProperty(
3435
}
3536

3637
export function createDataExtensionYaml(
37-
language: string,
38+
language: QueryLanguage,
3839
modeledMethods: readonly ModeledMethod[],
3940
) {
41+
const modelsAsDataLanguage = getModelsAsDataLanguage(language);
42+
if (!modelsAsDataLanguage) {
43+
throw new Error(`No models as data language for ${language}`);
44+
}
45+
4046
const methodsByType: Record<
4147
Exclude<ModeledMethodType, "none">,
4248
ModeledMethod[]
@@ -53,7 +59,7 @@ export function createDataExtensionYaml(
5359
}
5460
}
5561

56-
const extensions = Object.entries(extensiblePredicateDefinitions).map(
62+
const extensions = Object.entries(modelsAsDataLanguage).map(
5763
([type, definition]) => ` - addsTo:
5864
pack: codeql/${language}-all
5965
extensible: ${definition.extensiblePredicate}
@@ -69,7 +75,7 @@ ${extensions.join("\n")}`;
6975
}
7076

7177
export function createDataExtensionYamls(
72-
language: string,
78+
language: QueryLanguage,
7379
methods: readonly Method[],
7480
newModeledMethods: Readonly<Record<string, readonly ModeledMethod[]>>,
7581
existingModeledMethods: Readonly<
@@ -98,7 +104,7 @@ export function createDataExtensionYamls(
98104
}
99105

100106
function createDataExtensionYamlsByGrouping(
101-
language: string,
107+
language: QueryLanguage,
102108
methods: readonly Method[],
103109
newModeledMethods: Readonly<Record<string, readonly ModeledMethod[]>>,
104110
existingModeledMethods: Readonly<
@@ -153,7 +159,7 @@ function createDataExtensionYamlsByGrouping(
153159
}
154160

155161
export function createDataExtensionYamlsForApplicationMode(
156-
language: string,
162+
language: QueryLanguage,
157163
methods: readonly Method[],
158164
newModeledMethods: Readonly<Record<string, readonly ModeledMethod[]>>,
159165
existingModeledMethods: Readonly<
@@ -170,7 +176,7 @@ export function createDataExtensionYamlsForApplicationMode(
170176
}
171177

172178
export function createDataExtensionYamlsForFrameworkMode(
173-
language: string,
179+
language: QueryLanguage,
174180
methods: readonly Method[],
175181
newModeledMethods: Readonly<Record<string, readonly ModeledMethod[]>>,
176182
existingModeledMethods: Readonly<
@@ -240,11 +246,17 @@ function validateModelExtensionFile(data: unknown): data is ModelExtensionFile {
240246

241247
export function loadDataExtensionYaml(
242248
data: unknown,
249+
language: QueryLanguage,
243250
): Record<string, ModeledMethod[]> | undefined {
244251
if (!validateModelExtensionFile(data)) {
245252
return undefined;
246253
}
247254

255+
const modelsAsDataLanguage = getModelsAsDataLanguage(language);
256+
if (!modelsAsDataLanguage) {
257+
throw new Error(`No models as data language for ${language}`);
258+
}
259+
248260
const extensions = data.extensions;
249261

250262
const modeledMethods: Record<string, ModeledMethod[]> = {};
@@ -254,7 +266,7 @@ export function loadDataExtensionYaml(
254266
const extensible = addsTo.extensible;
255267
const data = extension.data;
256268

257-
const definition = Object.values(extensiblePredicateDefinitions).find(
269+
const definition = Object.values(modelsAsDataLanguage).find(
258270
(definition) => definition.extensiblePredicate === extensible,
259271
);
260272
if (!definition) {

0 commit comments

Comments
 (0)