Skip to content

Commit f4a2d85

Browse files
authored
Merge pull request #3028 from github/koesie10/bqrs-decode-languages
Use MaD definition when decoding BQRS
2 parents 14c6f98 + ecb2503 commit f4a2d85

File tree

11 files changed

+189
-148
lines changed

11 files changed

+189
-148
lines changed

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,18 @@ import { ModeledMethodType } from "./modeled-method";
44
import { parseLibraryFilename } from "./library";
55
import { Mode } from "./shared/mode";
66
import { ApplicationModeTuple, FrameworkModeTuple } from "./queries/query";
7+
import { QueryLanguage } from "../common/query-language";
8+
import { getModelsAsDataLanguage } from "./languages";
79

810
export function decodeBqrsToMethods(
911
chunk: DecodedBqrsChunk,
1012
mode: Mode,
13+
language: QueryLanguage,
1114
): Method[] {
1215
const methodsByApiName = new Map<string, Method>();
1316

17+
const definition = getModelsAsDataLanguage(language);
18+
1419
chunk?.tuples.forEach((tuple) => {
1520
let usage: Call;
1621
let packageName: string;
@@ -51,7 +56,12 @@ export function decodeBqrsToMethods(
5156
classification = CallClassification.Unknown;
5257
}
5358

54-
const signature = `${packageName}.${typeName}#${methodName}${methodParameters}`;
59+
const signature = definition.createMethodSignature({
60+
packageName,
61+
typeName,
62+
methodName,
63+
methodParameters,
64+
});
5565

5666
// For Java, we'll always get back a .jar file, and the library version may be bad because not all library authors
5767
// properly specify the version. Therefore, we'll always try to parse the name and version from the library filename

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ async function runSingleFlowQuery(
156156
// Interpret the results
157157
const modelsAsDataLanguage = getModelsAsDataLanguage(language);
158158

159-
const definition = modelsAsDataLanguage[type];
159+
const definition = modelsAsDataLanguage.predicates[type];
160160

161161
const bqrsPath = completedQuery.outputDir.bqrsPath;
162162

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { MethodDefinition } from "../method";
12
import { ModeledMethod, ModeledMethodType } from "../modeled-method";
23
import { DataTuple } from "../model-extension-file";
34

@@ -6,14 +7,19 @@ type ReadModeledMethod = (row: DataTuple[]) => ModeledMethod;
67

78
export type ModelsAsDataLanguageModelType = Exclude<ModeledMethodType, "none">;
89

9-
export type ModelsAsDataLanguageModel = {
10+
export type ModelsAsDataLanguagePredicate = {
1011
extensiblePredicate: string;
1112
supportedKinds: string[];
1213
generateMethodDefinition: GenerateMethodDefinition;
1314
readModeledMethod: ReadModeledMethod;
1415
};
1516

16-
export type ModelsAsDataLanguage = Record<
17+
export type ModelsAsDataLanguagePredicates = Record<
1718
ModelsAsDataLanguageModelType,
18-
ModelsAsDataLanguageModel
19+
ModelsAsDataLanguagePredicate
1920
>;
21+
22+
export type ModelsAsDataLanguage = {
23+
createMethodSignature: (method: MethodDefinition) => string;
24+
predicates: ModelsAsDataLanguagePredicates;
25+
};

extensions/ql-vscode/src/model-editor/languages/static.ts

Lines changed: 128 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -8,125 +8,133 @@ function readRowToMethod(row: DataTuple[]): string {
88
}
99

1010
export const staticLanguage: ModelsAsDataLanguage = {
11-
source: {
12-
extensiblePredicate: sharedExtensiblePredicates.source,
13-
supportedKinds: sharedKinds.source,
14-
// extensible predicate sourceModel(
15-
// string package, string type, boolean subtypes, string name, string signature, string ext,
16-
// string output, string kind, string provenance
17-
// );
18-
generateMethodDefinition: (method) => [
19-
method.packageName,
20-
method.typeName,
21-
true,
22-
method.methodName,
23-
method.methodParameters,
24-
"",
25-
method.output,
26-
method.kind,
27-
method.provenance,
28-
],
29-
readModeledMethod: (row) => ({
30-
type: "source" as ModeledMethodType,
31-
input: "",
32-
output: row[6] as string,
33-
kind: row[7] as string,
34-
provenance: row[8] as Provenance,
35-
signature: readRowToMethod(row),
36-
packageName: row[0] as string,
37-
typeName: row[1] as string,
38-
methodName: row[3] as string,
39-
methodParameters: row[4] as string,
40-
}),
41-
},
42-
sink: {
43-
extensiblePredicate: sharedExtensiblePredicates.sink,
44-
supportedKinds: sharedKinds.sink,
45-
// extensible predicate sinkModel(
46-
// string package, string type, boolean subtypes, string name, string signature, string ext,
47-
// string input, string kind, string provenance
48-
// );
49-
generateMethodDefinition: (method) => [
50-
method.packageName,
51-
method.typeName,
52-
true,
53-
method.methodName,
54-
method.methodParameters,
55-
"",
56-
method.input,
57-
method.kind,
58-
method.provenance,
59-
],
60-
readModeledMethod: (row) => ({
61-
type: "sink",
62-
input: row[6] as string,
63-
output: "",
64-
kind: row[7] as string,
65-
provenance: row[8] as Provenance,
66-
signature: readRowToMethod(row),
67-
packageName: row[0] as string,
68-
typeName: row[1] as string,
69-
methodName: row[3] as string,
70-
methodParameters: row[4] as string,
71-
}),
72-
},
73-
summary: {
74-
extensiblePredicate: sharedExtensiblePredicates.summary,
75-
supportedKinds: sharedKinds.summary,
76-
// extensible predicate summaryModel(
77-
// string package, string type, boolean subtypes, string name, string signature, string ext,
78-
// string input, string output, string kind, string provenance
79-
// );
80-
generateMethodDefinition: (method) => [
81-
method.packageName,
82-
method.typeName,
83-
true,
84-
method.methodName,
85-
method.methodParameters,
86-
"",
87-
method.input,
88-
method.output,
89-
method.kind,
90-
method.provenance,
91-
],
92-
readModeledMethod: (row) => ({
93-
type: "summary",
94-
input: row[6] as string,
95-
output: row[7] as string,
96-
kind: row[8] as string,
97-
provenance: row[9] as Provenance,
98-
signature: readRowToMethod(row),
99-
packageName: row[0] as string,
100-
typeName: row[1] as string,
101-
methodName: row[3] as string,
102-
methodParameters: row[4] as string,
103-
}),
104-
},
105-
neutral: {
106-
extensiblePredicate: sharedExtensiblePredicates.neutral,
107-
supportedKinds: sharedKinds.neutral,
108-
// extensible predicate neutralModel(
109-
// string package, string type, string name, string signature, string kind, string provenance
110-
// );
111-
generateMethodDefinition: (method) => [
112-
method.packageName,
113-
method.typeName,
114-
method.methodName,
115-
method.methodParameters,
116-
method.kind,
117-
method.provenance,
118-
],
119-
readModeledMethod: (row) => ({
120-
type: "neutral",
121-
input: "",
122-
output: "",
123-
kind: row[4] as string,
124-
provenance: row[5] as Provenance,
125-
signature: `${row[0]}.${row[1]}#${row[2]}${row[3]}`,
126-
packageName: row[0] as string,
127-
typeName: row[1] as string,
128-
methodName: row[2] as string,
129-
methodParameters: row[3] as string,
130-
}),
11+
createMethodSignature: ({
12+
packageName,
13+
typeName,
14+
methodName,
15+
methodParameters,
16+
}) => `${packageName}.${typeName}#${methodName}${methodParameters}`,
17+
predicates: {
18+
source: {
19+
extensiblePredicate: sharedExtensiblePredicates.source,
20+
supportedKinds: sharedKinds.source,
21+
// extensible predicate sourceModel(
22+
// string package, string type, boolean subtypes, string name, string signature, string ext,
23+
// string output, string kind, string provenance
24+
// );
25+
generateMethodDefinition: (method) => [
26+
method.packageName,
27+
method.typeName,
28+
true,
29+
method.methodName,
30+
method.methodParameters,
31+
"",
32+
method.output,
33+
method.kind,
34+
method.provenance,
35+
],
36+
readModeledMethod: (row) => ({
37+
type: "source" as ModeledMethodType,
38+
input: "",
39+
output: row[6] as string,
40+
kind: row[7] as string,
41+
provenance: row[8] as Provenance,
42+
signature: readRowToMethod(row),
43+
packageName: row[0] as string,
44+
typeName: row[1] as string,
45+
methodName: row[3] as string,
46+
methodParameters: row[4] as string,
47+
}),
48+
},
49+
sink: {
50+
extensiblePredicate: sharedExtensiblePredicates.sink,
51+
supportedKinds: sharedKinds.sink,
52+
// extensible predicate sinkModel(
53+
// string package, string type, boolean subtypes, string name, string signature, string ext,
54+
// string input, string kind, string provenance
55+
// );
56+
generateMethodDefinition: (method) => [
57+
method.packageName,
58+
method.typeName,
59+
true,
60+
method.methodName,
61+
method.methodParameters,
62+
"",
63+
method.input,
64+
method.kind,
65+
method.provenance,
66+
],
67+
readModeledMethod: (row) => ({
68+
type: "sink",
69+
input: row[6] as string,
70+
output: "",
71+
kind: row[7] as string,
72+
provenance: row[8] as Provenance,
73+
signature: readRowToMethod(row),
74+
packageName: row[0] as string,
75+
typeName: row[1] as string,
76+
methodName: row[3] as string,
77+
methodParameters: row[4] as string,
78+
}),
79+
},
80+
summary: {
81+
extensiblePredicate: sharedExtensiblePredicates.summary,
82+
supportedKinds: sharedKinds.summary,
83+
// extensible predicate summaryModel(
84+
// string package, string type, boolean subtypes, string name, string signature, string ext,
85+
// string input, string output, string kind, string provenance
86+
// );
87+
generateMethodDefinition: (method) => [
88+
method.packageName,
89+
method.typeName,
90+
true,
91+
method.methodName,
92+
method.methodParameters,
93+
"",
94+
method.input,
95+
method.output,
96+
method.kind,
97+
method.provenance,
98+
],
99+
readModeledMethod: (row) => ({
100+
type: "summary",
101+
input: row[6] as string,
102+
output: row[7] as string,
103+
kind: row[8] as string,
104+
provenance: row[9] as Provenance,
105+
signature: readRowToMethod(row),
106+
packageName: row[0] as string,
107+
typeName: row[1] as string,
108+
methodName: row[3] as string,
109+
methodParameters: row[4] as string,
110+
}),
111+
},
112+
neutral: {
113+
extensiblePredicate: sharedExtensiblePredicates.neutral,
114+
supportedKinds: sharedKinds.neutral,
115+
// extensible predicate neutralModel(
116+
// string package, string type, string name, string signature, string kind, string provenance
117+
// );
118+
generateMethodDefinition: (method) => [
119+
method.packageName,
120+
method.typeName,
121+
method.methodName,
122+
method.methodParameters,
123+
method.kind,
124+
method.provenance,
125+
],
126+
readModeledMethod: (row) => ({
127+
type: "neutral",
128+
input: "",
129+
output: "",
130+
kind: row[4] as string,
131+
provenance: row[5] as Provenance,
132+
signature: `${row[0]}.${row[1]}#${row[2]}${row[3]}`,
133+
packageName: row[0] as string,
134+
typeName: row[1] as string,
135+
methodName: row[2] as string,
136+
methodParameters: row[3] as string,
137+
}),
138+
},
131139
},
132140
};

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

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,19 +17,7 @@ export type Usage = Call & {
1717
readonly classification: CallClassification;
1818
};
1919

20-
export interface MethodSignature {
21-
/**
22-
* Contains the version of the library if it can be determined by CodeQL, e.g. `4.2.2.2`
23-
*/
24-
readonly libraryVersion?: string;
25-
/**
26-
* A unique signature that can be used to identify this external API usage.
27-
*
28-
* The signature contains the package name, type name, method name, and method parameters
29-
* in the form "packageName.typeName#methodName(methodParameters)".
30-
* e.g. `org.sql2o.Connection#createQuery(String)`
31-
*/
32-
readonly signature: string;
20+
export interface MethodDefinition {
3321
/**
3422
* The package name in Java, or the namespace in C#, e.g. `org.sql2o` or `System.Net.Http.Headers`.
3523
*
@@ -44,6 +32,21 @@ export interface MethodSignature {
4432
readonly methodParameters: string;
4533
}
4634

35+
export interface MethodSignature extends MethodDefinition {
36+
/**
37+
* Contains the version of the library if it can be determined by CodeQL, e.g. `4.2.2.2`
38+
*/
39+
readonly libraryVersion?: string;
40+
/**
41+
* A unique signature that can be used to identify this external API usage.
42+
*
43+
* The signature contains the package name, type name, method name, and method parameters
44+
* in the form "packageName.typeName#methodName(methodParameters)".
45+
* e.g. `org.sql2o.Connection#createQuery(String)`
46+
*/
47+
readonly signature: string;
48+
}
49+
4750
export interface Method extends MethodSignature {
4851
/**
4952
* Contains the name of the library containing the method declaration, e.g. `sql2o-1.6.0.jar` or `System.Runtime.dll`

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ type RunQueryOptions = {
2525
cliServer: CodeQLCliServer;
2626
queryRunner: QueryRunner;
2727
databaseItem: DatabaseItem;
28+
language: QueryLanguage;
2829
queryStorageDir: string;
2930
queryDir: string;
3031

@@ -70,6 +71,7 @@ export async function runModelEditorQueries(
7071
cliServer,
7172
queryRunner,
7273
databaseItem,
74+
language,
7375
queryStorageDir,
7476
queryDir,
7577
progress,
@@ -157,7 +159,7 @@ export async function runModelEditorQueries(
157159
maxStep: externalApiQueriesProgressMaxStep,
158160
});
159161

160-
return decodeBqrsToMethods(bqrsChunk, mode);
162+
return decodeBqrsToMethods(bqrsChunk, mode, language);
161163
}
162164

163165
type GetResultsOptions = {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -430,6 +430,7 @@ export class ModelEditorView extends AbstractWebview<
430430
cliServer: this.cliServer,
431431
queryRunner: this.queryRunner,
432432
databaseItem: this.databaseItem,
433+
language: this.language,
433434
queryStorageDir: this.queryStorageDir,
434435
queryDir: this.queryDir,
435436
progress: (update) =>

0 commit comments

Comments
 (0)