Skip to content

Commit c9be2ce

Browse files
committed
Add endpoint type to method definition
This adds an `endpointType` property to method definitions since we already have different endpoints (for example methods and modules in Ruby) and it would be useful to make a distinction between these (it's not possible to model a module as a source/sink/summary, but it should be possible to model as a type).
1 parent bbfc5d8 commit c9be2ce

File tree

16 files changed

+121
-8
lines changed

16 files changed

+121
-8
lines changed

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type {
33
BqrsEntityValue,
44
} from "../common/bqrs-cli-types";
55
import type { Method, Usage } from "./method";
6-
import { CallClassification } from "./method";
6+
import { EndpointType, CallClassification } from "./method";
77
import type { ModeledMethodType } from "./modeled-method";
88
import { parseLibraryFilename } from "./library";
99
import { Mode } from "./shared/mode";
@@ -33,6 +33,7 @@ export function decodeBqrsToMethods(
3333
let libraryVersion: string | undefined;
3434
let type: ModeledMethodType;
3535
let classification: CallClassification;
36+
let endpointType = EndpointType.Method;
3637

3738
if (mode === Mode.Application) {
3839
[
@@ -62,7 +63,12 @@ export function decodeBqrsToMethods(
6263
classification = CallClassification.Unknown;
6364
}
6465

66+
if (methodName === "") {
67+
endpointType = EndpointType.Class;
68+
}
69+
6570
const signature = definition.createMethodSignature({
71+
endpointType,
6672
packageName,
6773
typeName,
6874
methodName,
@@ -93,6 +99,7 @@ export function decodeBqrsToMethods(
9399
library,
94100
libraryVersion,
95101
signature,
102+
endpointType,
96103
packageName,
97104
typeName,
98105
methodName,

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { parseAccessPathTokens } from "../../shared/access-paths";
2+
import { EndpointType } from "../../method";
23

34
const methodTokenRegex = /^Method\[(.+)]$/;
45

@@ -62,3 +63,7 @@ export function rubyPath(methodName: string, path: string) {
6263

6364
return `${methodPath}.${path}`;
6465
}
66+
67+
export function rubyEndpointType(methodName: string) {
68+
return methodName === "" ? EndpointType.Class : EndpointType.Method;
69+
}

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { getArgumentsList } from "../../method";
77
import {
88
parseRubyAccessPath,
99
parseRubyMethodFromPath,
10+
rubyEndpointType,
1011
rubyMethodPath,
1112
rubyMethodSignature,
1213
rubyPath,
@@ -42,6 +43,7 @@ export const ruby: ModelsAsDataLanguage = {
4243
kind: row[2] as string,
4344
provenance: "manual",
4445
signature: rubyMethodSignature(typeName, methodName),
46+
endpointType: rubyEndpointType(methodName),
4547
packageName: "",
4648
typeName,
4749
methodName,
@@ -74,6 +76,7 @@ export const ruby: ModelsAsDataLanguage = {
7476
kind: row[2] as string,
7577
provenance: "manual",
7678
signature: rubyMethodSignature(typeName, methodName),
79+
endpointType: rubyEndpointType(methodName),
7780
packageName: "",
7881
typeName,
7982
methodName,
@@ -104,6 +107,7 @@ export const ruby: ModelsAsDataLanguage = {
104107
kind: row[4] as string,
105108
provenance: "manual",
106109
signature: rubyMethodSignature(typeName, methodName),
110+
endpointType: rubyEndpointType(methodName),
107111
packageName: "",
108112
typeName,
109113
methodName,
@@ -132,6 +136,7 @@ export const ruby: ModelsAsDataLanguage = {
132136
kind: row[2] as string,
133137
provenance: "manual",
134138
signature: rubyMethodSignature(typeName, methodName),
139+
endpointType: rubyEndpointType(methodName),
135140
packageName: "",
136141
typeName,
137142
methodName,
@@ -156,6 +161,7 @@ export const ruby: ModelsAsDataLanguage = {
156161
relatedTypeName: row[0] as string,
157162
path,
158163
signature: rubyMethodSignature(typeName, methodName),
164+
endpointType: rubyEndpointType(methodName),
159165
packageName: "",
160166
typeName,
161167
methodName,

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,11 @@ import type {
77
import type { ModelsAsDataLanguage } from "../models-as-data";
88
import type { AccessPathSuggestionRow } from "../../suggestions";
99
import { isDefinitionType } from "../../suggestions";
10-
import { parseRubyMethodFromPath, rubyMethodSignature } from "./access-paths";
10+
import {
11+
parseRubyMethodFromPath,
12+
rubyEndpointType,
13+
rubyMethodSignature,
14+
} from "./access-paths";
1115

1216
function checkTupleFormat(
1317
tuple: BqrsCellValue[],
@@ -64,6 +68,7 @@ export function parseAccessPathSuggestionsResults(
6468
return {
6569
method: {
6670
packageName: "",
71+
endpointType: rubyEndpointType(methodName),
6772
typeName: type,
6873
methodName,
6974
methodParameters: "",

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type { DataTuple } from "../../model-extension-file";
44
import { sharedExtensiblePredicates, sharedKinds } from "../shared";
55
import { filterFlowModelQueries, parseFlowModelResults } from "./generate";
66
import type { MethodArgument } from "../../method";
7-
import { getArgumentsList } from "../../method";
7+
import { EndpointType, getArgumentsList } from "../../method";
88

99
function readRowToMethod(row: DataTuple[]): string {
1010
return `${row[0]}.${row[1]}#${row[3]}${row[4]}`;
@@ -43,6 +43,7 @@ export const staticLanguage: ModelsAsDataLanguage = {
4343
kind: row[7] as string,
4444
provenance: row[8] as Provenance,
4545
signature: readRowToMethod(row),
46+
endpointType: EndpointType.Method,
4647
packageName: row[0] as string,
4748
typeName: row[1] as string,
4849
methodName: row[3] as string,
@@ -74,6 +75,7 @@ export const staticLanguage: ModelsAsDataLanguage = {
7475
kind: row[7] as string,
7576
provenance: row[8] as Provenance,
7677
signature: readRowToMethod(row),
78+
endpointType: EndpointType.Method,
7779
packageName: row[0] as string,
7880
typeName: row[1] as string,
7981
methodName: row[3] as string,
@@ -106,6 +108,7 @@ export const staticLanguage: ModelsAsDataLanguage = {
106108
kind: row[8] as string,
107109
provenance: row[9] as Provenance,
108110
signature: readRowToMethod(row),
111+
endpointType: EndpointType.Method,
109112
packageName: row[0] as string,
110113
typeName: row[1] as string,
111114
methodName: row[3] as string,
@@ -133,6 +136,7 @@ export const staticLanguage: ModelsAsDataLanguage = {
133136
kind: row[4] as string,
134137
provenance: row[5] as Provenance,
135138
signature: `${row[0]}.${row[1]}#${row[2]}${row[3]}`,
139+
endpointType: EndpointType.Method,
136140
packageName: row[0] as string,
137141
typeName: row[1] as string,
138142
methodName: row[2] as string,

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

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

20+
export enum EndpointType {
21+
Method = "method",
22+
Class = "class",
23+
}
24+
2025
export interface MethodDefinition {
26+
readonly endpointType: EndpointType;
2127
/**
2228
* The package name in Java, or the namespace in C#, e.g. `org.sql2o` or `System.Net.Http.Headers`.
2329
*

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export function createEmptyModeledMethod(
77
methodSignature: MethodSignature,
88
) {
99
const canonicalMethodSignature: MethodSignature = {
10+
endpointType: methodSignature.endpointType,
1011
packageName: methodSignature.packageName,
1112
typeName: methodSignature.typeName,
1213
methodName: methodSignature.methodName,

extensions/ql-vscode/src/model-editor/shared/validation.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ function canonicalizeModeledMethod(
2525
modeledMethod: ModeledMethod,
2626
): ModeledMethod {
2727
const methodSignature: MethodSignature = {
28+
endpointType: modeledMethod.endpointType,
2829
signature: modeledMethod.signature,
2930
packageName: modeledMethod.packageName,
3031
typeName: modeledMethod.typeName,

extensions/ql-vscode/src/stories/model-editor/LibraryRow.stories.tsx

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import type { Meta, StoryFn } from "@storybook/react";
22

33
import { LibraryRow as LibraryRowComponent } from "../../view/model-editor/LibraryRow";
4-
import { CallClassification } from "../../model-editor/method";
4+
import { CallClassification, EndpointType } from "../../model-editor/method";
55
import { createMockModelEditorViewState } from "../../../test/factories/model-editor/view-state";
66

77
export default {
@@ -22,6 +22,7 @@ LibraryRow.args = {
2222
library: "sql2o",
2323
libraryVersion: "1.6.0",
2424
signature: "org.sql2o.Connection#createQuery(String)",
25+
endpointType: EndpointType.Method,
2526
packageName: "org.sql2o",
2627
typeName: "Connection",
2728
methodName: "createQuery",
@@ -44,6 +45,7 @@ LibraryRow.args = {
4445
library: "sql2o",
4546
libraryVersion: "1.6.0",
4647
signature: "org.sql2o.Query#executeScalar(Class)",
48+
endpointType: EndpointType.Method,
4749
packageName: "org.sql2o",
4850
typeName: "Query",
4951
methodName: "executeScalar",
@@ -66,6 +68,7 @@ LibraryRow.args = {
6668
library: "sql2o",
6769
libraryVersion: "1.6.0",
6870
signature: "org.sql2o.Sql2o#open()",
71+
endpointType: EndpointType.Method,
6972
packageName: "org.sql2o",
7073
typeName: "Sql2o",
7174
methodName: "open",
@@ -88,6 +91,7 @@ LibraryRow.args = {
8891
library: "sql2o",
8992
libraryVersion: "1.6.0",
9093
signature: "org.sql2o.Sql2o#Sql2o(String,String,String)",
94+
endpointType: EndpointType.Method,
9195
packageName: "org.sql2o",
9296
typeName: "Sql2o",
9397
methodName: "Sql2o",
@@ -110,6 +114,7 @@ LibraryRow.args = {
110114
library: "sql2o",
111115
libraryVersion: "1.6.0",
112116
signature: "org.sql2o.Sql2o#Sql2o(String)",
117+
endpointType: EndpointType.Method,
113118
packageName: "org.sql2o",
114119
typeName: "Sql2o",
115120
methodName: "Sql2o",
@@ -150,6 +155,7 @@ LibraryRow.args = {
150155
kind: "jndi-injection",
151156
provenance: "df-generated",
152157
signature: "org.sql2o.Sql2o#Sql2o(String)",
158+
endpointType: EndpointType.Method,
153159
packageName: "org.sql2o",
154160
typeName: "Sql2o",
155161
methodName: "Sql2o",
@@ -164,6 +170,7 @@ LibraryRow.args = {
164170
kind: "taint",
165171
provenance: "df-manual",
166172
signature: "org.sql2o.Connection#createQuery(String)",
173+
endpointType: EndpointType.Method,
167174
packageName: "org.sql2o",
168175
typeName: "Connection",
169176
methodName: "createQuery",
@@ -178,6 +185,7 @@ LibraryRow.args = {
178185
kind: "taint",
179186
provenance: "manual",
180187
signature: "org.sql2o.Sql2o#open()",
188+
endpointType: EndpointType.Method,
181189
packageName: "org.sql2o",
182190
typeName: "Sql2o",
183191
methodName: "open",
@@ -190,6 +198,7 @@ LibraryRow.args = {
190198
kind: "summary",
191199
provenance: "df-generated",
192200
signature: "org.sql2o.Query#executeScalar(Class)",
201+
endpointType: EndpointType.Method,
193202
packageName: "org.sql2o",
194203
typeName: "Query",
195204
methodName: "executeScalar",
@@ -202,6 +211,7 @@ LibraryRow.args = {
202211
kind: "sink",
203212
provenance: "df-generated",
204213
signature: "org.sql2o.Sql2o#Sql2o(String,String,String)",
214+
endpointType: EndpointType.Method,
205215
packageName: "org.sql2o",
206216
typeName: "Sql2o",
207217
methodName: "Sql2o",

extensions/ql-vscode/src/stories/model-editor/MethodRow.stories.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type { Meta, StoryFn } from "@storybook/react";
44

55
import { MethodRow as MethodRowComponent } from "../../view/model-editor/MethodRow";
66
import type { Method } from "../../model-editor/method";
7-
import { CallClassification } from "../../model-editor/method";
7+
import { EndpointType, CallClassification } from "../../model-editor/method";
88
import type { ModeledMethod } from "../../model-editor/modeled-method";
99
import { MULTIPLE_MODELS_GRID_TEMPLATE_COLUMNS } from "../../view/model-editor/ModeledMethodDataGrid";
1010
import { DataGrid } from "../../view/common/DataGrid";
@@ -46,6 +46,7 @@ const Template: StoryFn<typeof MethodRowComponent> = (args) => {
4646
const method: Method = {
4747
library: "sql2o-1.6.0.jar",
4848
signature: "org.sql2o.Sql2o#open()",
49+
endpointType: EndpointType.Method,
4950
packageName: "org.sql2o",
5051
typeName: "Sql2o",
5152
methodName: "open",
@@ -86,6 +87,7 @@ const modeledMethod: ModeledMethod = {
8687
kind: "taint",
8788
provenance: "manual",
8889
signature: "org.sql2o.Sql2o#open()",
90+
endpointType: EndpointType.Method,
8991
packageName: "org.sql2o",
9092
typeName: "Sql2o",
9193
methodName: "open",

0 commit comments

Comments
 (0)