Skip to content

Commit 71f59b1

Browse files
committed
Move model generation functions to language definition
1 parent 2a47714 commit 71f59b1

File tree

14 files changed

+352
-295
lines changed

14 files changed

+352
-295
lines changed

extensions/ql-vscode/src/local-queries/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
export * from "./local-queries";
22
export * from "./local-query-run";
3+
export * from "./query-constraints";
34
export * from "./query-resolver";
45
export * from "./quick-eval-code-lens-provider";
56
export * from "./quick-query";
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
export interface QueryConstraints {
2+
kind?: string;
3+
"tags contain"?: string[];
4+
"tags contain all"?: string[];
5+
"query filename"?: string;
6+
"query path"?: string;
7+
}

extensions/ql-vscode/src/local-queries/query-resolver.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { showAndLogExceptionWithTelemetry } from "../common/logging";
1414
import { extLogger } from "../common/logging/vscode";
1515
import { telemetryListener } from "../common/vscode/telemetry";
1616
import { SuiteInstruction } from "../packaging/suite-instruction";
17+
import { QueryConstraints } from "./query-constraints";
1718

1819
export async function qlpackOfDatabase(
1920
cli: Pick<CodeQLCliServer, "resolveQlpacks">,
@@ -27,14 +28,6 @@ export async function qlpackOfDatabase(
2728
return await getQlPackForDbscheme(cli, dbscheme);
2829
}
2930

30-
export interface QueryConstraints {
31-
kind?: string;
32-
"tags contain"?: string[];
33-
"tags contain all"?: string[];
34-
"query filename"?: string;
35-
"query path"?: string;
36-
}
37-
3831
/**
3932
* Finds the queries with the specified kind and tags in a list of CodeQL packs.
4033
*

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

Lines changed: 0 additions & 109 deletions
This file was deleted.

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

Lines changed: 0 additions & 81 deletions
This file was deleted.

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ type GenerateQueriesQueryOptions = {
2525
/**
2626
* Options that are passed through by the caller of `runGenerateQueries`.
2727
*/
28-
export type GenerateQueriesOptions = {
28+
type GenerateQueriesOptions = {
2929
cliServer: CodeQLCliServer;
3030
queryRunner: QueryRunner;
3131
queryStorageDir: string;

extensions/ql-vscode/src/model-editor/languages/models-as-data.ts

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ import { MethodDefinition } from "../method";
22
import { ModeledMethod, ModeledMethodType } from "../modeled-method";
33
import { DataTuple } from "../model-extension-file";
44
import { Mode } from "../shared/mode";
5+
import type { QueryConstraints } from "../../local-queries/query-constraints";
6+
import { DecodedBqrs } from "../../common/bqrs-cli-types";
7+
import { BaseLogger } from "../../common/logging";
58

69
type GenerateMethodDefinition = (method: ModeledMethod) => DataTuple[];
710
type ReadModeledMethod = (row: DataTuple[]) => ModeledMethod;
@@ -15,6 +18,22 @@ export type ModelsAsDataLanguagePredicate = {
1518
readModeledMethod: ReadModeledMethod;
1619
};
1720

21+
type ModelsAsDataLanguageModelGeneration = {
22+
queryConstraints: QueryConstraints;
23+
filterQueries?: (queryPath: string) => boolean;
24+
parseResults: (
25+
// The path to the query that generated the results.
26+
queryPath: string,
27+
// The results of the query.
28+
bqrs: DecodedBqrs,
29+
// The language-specific predicate that was used to generate the results. This is passed to allow
30+
// sharing of code between different languages.
31+
modelsAsDataLanguage: ModelsAsDataLanguage,
32+
// The logger to use for logging.
33+
logger: BaseLogger,
34+
) => ModeledMethod[];
35+
};
36+
1837
export type ModelsAsDataLanguagePredicates = Record<
1938
ModelsAsDataLanguageModelType,
2039
ModelsAsDataLanguagePredicate
@@ -28,4 +47,5 @@ export type ModelsAsDataLanguage = {
2847
availableModes?: Mode[];
2948
createMethodSignature: (method: MethodDefinition) => string;
3049
predicates: ModelsAsDataLanguagePredicates;
50+
modelGeneration?: ModelsAsDataLanguageModelGeneration;
3151
};
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import { BaseLogger } from "../../../common/logging";
2+
import { DecodedBqrs } from "../../../common/bqrs-cli-types";
3+
import { ModelsAsDataLanguage } from "../models-as-data";
4+
import { ModeledMethod } from "../../modeled-method";
5+
import { DataTuple } from "../../model-extension-file";
6+
7+
export function parseGenerateModelResults(
8+
_queryPath: string,
9+
bqrs: DecodedBqrs,
10+
modelsAsDataLanguage: ModelsAsDataLanguage,
11+
logger: BaseLogger,
12+
): ModeledMethod[] {
13+
const modeledMethods: ModeledMethod[] = [];
14+
15+
for (const resultSetName in bqrs) {
16+
const definition = Object.values(modelsAsDataLanguage.predicates).find(
17+
(definition) => definition.extensiblePredicate === resultSetName,
18+
);
19+
if (definition === undefined) {
20+
void logger.log(`No predicate found for ${resultSetName}`);
21+
22+
continue;
23+
}
24+
25+
const resultSet = bqrs[resultSetName];
26+
27+
if (
28+
resultSet.tuples.some((tuple) =>
29+
tuple.some((value) => typeof value === "object"),
30+
)
31+
) {
32+
void logger.log(
33+
`Skipping ${resultSetName} because it contains undefined values`,
34+
);
35+
continue;
36+
}
37+
38+
modeledMethods.push(
39+
...resultSet.tuples.map((tuple) => {
40+
const row = tuple.filter(
41+
(value): value is DataTuple => typeof value !== "object",
42+
);
43+
44+
return definition.readModeledMethod(row);
45+
}),
46+
);
47+
}
48+
49+
return modeledMethods;
50+
}

extensions/ql-vscode/src/model-editor/languages/ruby/index.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { ModelsAsDataLanguage } from "../models-as-data";
22
import { sharedExtensiblePredicates, sharedKinds } from "../shared";
33
import { Mode } from "../../shared/mode";
4+
import { parseGenerateModelResults } from "./generate";
45

56
function parseRubyMethodFromPath(path: string): string {
67
const match = path.match(/Method\[([^\]]+)].*/);
@@ -150,4 +151,10 @@ export const ruby: ModelsAsDataLanguage = {
150151
},
151152
},
152153
},
154+
modelGeneration: {
155+
queryConstraints: {
156+
"query path": "queries/modeling/GenerateModel.ql",
157+
},
158+
parseResults: parseGenerateModelResults,
159+
},
153160
};

0 commit comments

Comments
 (0)