Skip to content

Commit a52e067

Browse files
Merge branch 'main' into robertbrignull/ResultTables-Header
2 parents 69c92b4 + 2171147 commit a52e067

File tree

87 files changed

+3060
-8807
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

87 files changed

+3060
-8807
lines changed

extensions/ql-vscode/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
- Remove "last updated" information and sorting from variant analysis results view. [#2637](https://github.com/github/vscode-codeql/pull/2637)
88
- Links to code on GitHub now include column numbers as well as line numbers. [#2406](https://github.com/github/vscode-codeql/pull/2406)
99
- No longer highlight trailing commas for jump to definition. [#2615](https://github.com/github/vscode-codeql/pull/2615)
10+
- Fix a bug where the QHelp preview page was not being refreshed after changes to the underlying `.qhelp` file. [#2660](https://github.com/github/vscode-codeql/pull/2660)
1011

1112
## 1.8.8 - 17 July 2023
1213

extensions/ql-vscode/package-lock.json

Lines changed: 1731 additions & 8446 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

extensions/ql-vscode/package.json

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1655,6 +1655,13 @@
16551655
"title": "CodeQL",
16561656
"icon": "media/logo.svg"
16571657
}
1658+
],
1659+
"panel": [
1660+
{
1661+
"id": "codeql-model-details",
1662+
"title": "CodeQL Model Details",
1663+
"icon": "media/logo.svg"
1664+
}
16581665
]
16591666
},
16601667
"views": {
@@ -1685,9 +1692,20 @@
16851692
"name": "Evaluator Log Viewer",
16861693
"when": "config.codeQL.canary"
16871694
}
1695+
],
1696+
"codeql-model-details": [
1697+
{
1698+
"id": "codeQLModelDetails",
1699+
"name": "CodeQL Model Details",
1700+
"when": "config.codeQL.canary && config.codeQL.dataExtensions.modelDetailsView"
1701+
}
16881702
]
16891703
},
16901704
"viewsWelcome": [
1705+
{
1706+
"view": "codeQLModelDetails",
1707+
"contents": "Loading..."
1708+
},
16911709
{
16921710
"view": "codeQLAstViewer",
16931711
"contents": "Run the 'CodeQL: View AST' command on an open source file from a CodeQL database.\n[View AST](command:codeQL.viewAst)"
@@ -1756,8 +1774,6 @@
17561774
"fs-extra": "^11.1.1",
17571775
"immutable": "^4.0.0",
17581776
"js-yaml": "^4.1.0",
1759-
"minimatch": "^9.0.0",
1760-
"minimist": "^1.2.6",
17611777
"msw": "^1.2.0",
17621778
"nanoid": "^3.2.0",
17631779
"node-fetch": "^2.6.7",
@@ -1767,10 +1783,8 @@
17671783
"semver": "^7.5.2",
17681784
"source-map": "^0.7.4",
17691785
"source-map-support": "^0.5.21",
1770-
"stream": "^0.0.2",
1771-
"stream-chain": "^2.2.4",
17721786
"stream-json": "^1.7.3",
1773-
"styled-components": "^5.3.3",
1787+
"styled-components": "^6.0.2",
17741788
"tmp": "^0.1.0",
17751789
"tmp-promise": "^3.0.2",
17761790
"tree-kill": "^1.2.2",
@@ -1811,21 +1825,17 @@
18111825
"@types/d3-graphviz": "^2.6.6",
18121826
"@types/del": "^4.0.0",
18131827
"@types/fs-extra": "^11.0.1",
1814-
"@types/google-protobuf": "^3.2.7",
18151828
"@types/gulp": "^4.0.9",
18161829
"@types/gulp-replace": "^1.1.0",
1817-
"@types/gulp-sourcemaps": "0.0.32",
18181830
"@types/jest": "^29.0.2",
18191831
"@types/js-yaml": "^3.12.5",
1820-
"@types/jszip": "^3.1.6",
18211832
"@types/nanoid": "^3.0.0",
18221833
"@types/node": "^16.11.25",
18231834
"@types/node-fetch": "^2.5.2",
18241835
"@types/react": "^18.0.28",
18251836
"@types/react-dom": "^18.0.11",
18261837
"@types/sarif": "^2.1.2",
18271838
"@types/semver": "^7.2.0",
1828-
"@types/stream-chain": "^2.0.1",
18291839
"@types/stream-json": "^1.7.1",
18301840
"@types/styled-components": "^5.1.11",
18311841
"@types/tar-stream": "^2.2.2",
@@ -1835,19 +1845,19 @@
18351845
"@types/vscode": "^1.67.0",
18361846
"@types/webpack": "^5.28.0",
18371847
"@types/webpack-env": "^1.18.0",
1838-
"@typescript-eslint/eslint-plugin": "^5.38.0",
1839-
"@typescript-eslint/parser": "^5.38.0",
1848+
"@typescript-eslint/eslint-plugin": "^6.2.1",
1849+
"@typescript-eslint/parser": "^6.2.1",
18401850
"@vscode/test-electron": "^2.2.0",
18411851
"@vscode/vsce": "^2.19.0",
18421852
"ansi-colors": "^4.1.1",
18431853
"applicationinsights": "^2.3.5",
1844-
"cosmiconfig": "^7.1.0",
1854+
"cosmiconfig": "^8.2.0",
18451855
"cross-env": "^7.0.3",
18461856
"css-loader": "^6.8.1",
18471857
"del": "^6.0.0",
18481858
"esbuild": "^0.15.15",
18491859
"eslint": "^8.23.1",
1850-
"eslint-config-prettier": "^8.5.0",
1860+
"eslint-config-prettier": "^9.0.0",
18511861
"eslint-plugin-etc": "^2.0.2",
18521862
"eslint-plugin-github": "^4.4.1",
18531863
"eslint-plugin-jest-dom": "^5.0.1",
@@ -1871,7 +1881,7 @@
18711881
"markdownlint-cli2-formatter-pretty": "^0.0.4",
18721882
"mini-css-extract-plugin": "^2.6.1",
18731883
"npm-run-all": "^4.1.5",
1874-
"patch-package": "^7.0.0",
1884+
"patch-package": "^8.0.0",
18751885
"prettier": "^3.0.0",
18761886
"storybook": "^7.1.0",
18771887
"tar-stream": "^3.0.0",
@@ -1880,8 +1890,7 @@
18801890
"ts-json-schema-generator": "^1.1.2",
18811891
"ts-loader": "^9.4.2",
18821892
"ts-node": "^10.7.0",
1883-
"ts-protoc-gen": "^0.9.0",
1884-
"ts-unused-exports": "^9.0.5",
1893+
"ts-unused-exports": "^10.0.0",
18851894
"typescript": "^5.0.2",
18861895
"webpack": "^5.76.0",
18871896
"webpack-cli": "^5.0.1"

extensions/ql-vscode/src/common/commands.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import type {
1212
} from "../variant-analysis/shared/variant-analysis";
1313
import type { QLDebugConfiguration } from "../debugger/debug-configuration";
1414
import type { QueryTreeViewItem } from "../queries-panel/query-tree-view-item";
15+
import type { Usage } from "../data-extensions-editor/external-api-usage";
1516

1617
// A command function matching the signature that VS Code calls when
1718
// a command is invoked from a context menu on a TreeView with
@@ -58,7 +59,9 @@ export type ExplorerSelectionCommandFunction<Item> = (
5859
type BuiltInVsCodeCommands = {
5960
// The codeQLDatabases.focus command is provided by VS Code because we've registered the custom view
6061
"codeQLDatabases.focus": () => Promise<void>;
62+
"codeQLModelDetails.focus": () => Promise<void>;
6163
"markdown.showPreviewToSide": (uri: Uri) => Promise<void>;
64+
"workbench.action.closeActiveEditor": () => Promise<void>;
6265
revealFileInOS: (uri: Uri) => Promise<void>;
6366
setContext: (
6467
key: `${"codeql" | "codeQL"}${string}`,
@@ -302,6 +305,10 @@ export type PackagingCommands = {
302305

303306
export type DataExtensionsEditorCommands = {
304307
"codeQL.openDataExtensionsEditor": () => Promise<void>;
308+
"codeQLDataExtensionsEditor.jumpToUsageLocation": (
309+
usage: Usage,
310+
databaseItem: DatabaseItem,
311+
) => Promise<void>;
305312
};
306313

307314
export type EvalLogViewerCommands = {

extensions/ql-vscode/src/common/interface-types.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,12 @@ interface AddModeledMethodsMessage {
510510
modeledMethods: Record<string, ModeledMethod>;
511511
}
512512

513+
interface SetInProgressMethodsMessage {
514+
t: "setInProgressMethods";
515+
packageName: string;
516+
inProgressMethods: string[];
517+
}
518+
513519
interface SwitchModeMessage {
514520
t: "switchMode";
515521
mode: Mode;
@@ -544,10 +550,16 @@ interface GenerateExternalApiMessage {
544550

545551
interface GenerateExternalApiFromLlmMessage {
546552
t: "generateExternalApiFromLlm";
553+
packageName: string;
547554
externalApiUsages: ExternalApiUsage[];
548555
modeledMethods: Record<string, ModeledMethod>;
549556
}
550557

558+
interface StopGeneratingExternalApiFromLlmMessage {
559+
t: "stopGeneratingExternalApiFromLlm";
560+
packageName: string;
561+
}
562+
551563
interface ModelDependencyMessage {
552564
t: "modelDependency";
553565
}
@@ -556,7 +568,8 @@ export type ToDataExtensionsEditorMessage =
556568
| SetExtensionPackStateMessage
557569
| SetExternalApiUsagesMessage
558570
| LoadModeledMethodsMessage
559-
| AddModeledMethodsMessage;
571+
| AddModeledMethodsMessage
572+
| SetInProgressMethodsMessage;
560573

561574
export type FromDataExtensionsEditorMessage =
562575
| ViewLoadedMsg
@@ -568,4 +581,5 @@ export type FromDataExtensionsEditorMessage =
568581
| SaveModeledMethods
569582
| GenerateExternalApiMessage
570583
| GenerateExternalApiFromLlmMessage
584+
| StopGeneratingExternalApiFromLlmMessage
571585
| ModelDependencyMessage;

extensions/ql-vscode/src/common/sarif-utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import * as Sarif from "sarif";
22
import type { HighlightedRegion } from "../variant-analysis/shared/analysis-result";
33
import { ResolvableLocationValue } from "../common/bqrs-cli-types";
44

5-
interface SarifLink {
5+
export interface SarifLink {
66
dest: number;
77
text: string;
88
}

extensions/ql-vscode/src/config.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -714,6 +714,11 @@ const EXTENSIONS_DIRECTORY = new Setting(
714714
"extensionsDirectory",
715715
DATA_EXTENSIONS,
716716
);
717+
const MODEL_DETAILS_VIEW = new Setting("modelDetailsView", DATA_EXTENSIONS);
718+
719+
export function showModelDetailsView(): boolean {
720+
return !!MODEL_DETAILS_VIEW.getValue<boolean>();
721+
}
717722

718723
export function showLlmGeneration(): boolean {
719724
return !!LLM_GENERATION.getValue<boolean>();

extensions/ql-vscode/src/data-extensions-editor/auto-model-codeml-queries.ts

Lines changed: 76 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@ import { redactableError } from "../common/errors";
1717
import { interpretResultsSarif } from "../query-results";
1818
import { join } from "path";
1919
import { assertNever } from "../common/helpers-pure";
20+
import { dir } from "tmp-promise";
21+
import { writeFile, outputFile } from "fs-extra";
22+
import { dump as dumpYaml } from "js-yaml";
23+
import { MethodSignature } from "./external-api-usage";
2024

2125
type AutoModelQueryOptions = {
2226
queryTag: string;
@@ -26,6 +30,7 @@ type AutoModelQueryOptions = {
2630
databaseItem: DatabaseItem;
2731
qlpack: QlPacksForLanguage;
2832
sourceInfo: SourceInfo | undefined;
33+
additionalPacks: string[];
2934
extensionPacks: string[];
3035
queryStorageDir: string;
3136

@@ -52,6 +57,7 @@ async function runAutoModelQuery({
5257
databaseItem,
5358
qlpack,
5459
sourceInfo,
60+
additionalPacks,
5561
extensionPacks,
5662
queryStorageDir,
5763
progress,
@@ -99,7 +105,7 @@ async function runAutoModelQuery({
99105
quickEvalCountOnly: false,
100106
},
101107
false,
102-
getOnDiskWorkspaceFolders(),
108+
additionalPacks,
103109
extensionPacks,
104110
queryStorageDir,
105111
undefined,
@@ -147,12 +153,14 @@ async function runAutoModelQuery({
147153

148154
type AutoModelQueriesOptions = {
149155
mode: Mode;
156+
candidateMethods: MethodSignature[];
150157
cliServer: CodeQLCliServer;
151158
queryRunner: QueryRunner;
152159
databaseItem: DatabaseItem;
153160
queryStorageDir: string;
154161

155162
progress: ProgressCallback;
163+
cancellationTokenSource: CancellationTokenSource;
156164
};
157165

158166
export type AutoModelQueriesResult = {
@@ -161,17 +169,14 @@ export type AutoModelQueriesResult = {
161169

162170
export async function runAutoModelQueries({
163171
mode,
172+
candidateMethods,
164173
cliServer,
165174
queryRunner,
166175
databaseItem,
167176
queryStorageDir,
168177
progress,
178+
cancellationTokenSource,
169179
}: AutoModelQueriesOptions): Promise<AutoModelQueriesResult | undefined> {
170-
// maxStep for this part is 1500
171-
const maxStep = 1500;
172-
173-
const cancellationTokenSource = new CancellationTokenSource();
174-
175180
const qlpack = await qlpackOfDatabase(cliServer, databaseItem);
176181

177182
// CodeQL needs to have access to the database to be able to retrieve the
@@ -189,17 +194,17 @@ export async function runAutoModelQueries({
189194
sourceLocationPrefix,
190195
};
191196

192-
const additionalPacks = getOnDiskWorkspaceFolders();
197+
// Generate a pack containing the candidate filters
198+
const filterPackDir = await generateCandidateFilterPack(
199+
databaseItem.language,
200+
candidateMethods,
201+
);
202+
203+
const additionalPacks = [...getOnDiskWorkspaceFolders(), filterPackDir];
193204
const extensionPacks = Object.keys(
194205
await cliServer.resolveQlpacks(additionalPacks, true),
195206
);
196207

197-
progress({
198-
step: 0,
199-
maxStep,
200-
message: "Finding candidates and examples",
201-
});
202-
203208
const candidates = await runAutoModelQuery({
204209
mode,
205210
queryTag: "candidates",
@@ -208,15 +213,10 @@ export async function runAutoModelQueries({
208213
databaseItem,
209214
qlpack,
210215
sourceInfo,
216+
additionalPacks,
211217
extensionPacks,
212218
queryStorageDir,
213-
progress: (update) => {
214-
progress({
215-
step: update.step,
216-
maxStep,
217-
message: "Finding candidates and examples",
218-
});
219-
},
219+
progress,
220220
token: cancellationTokenSource.token,
221221
});
222222

@@ -228,3 +228,59 @@ export async function runAutoModelQueries({
228228
candidates,
229229
};
230230
}
231+
232+
/**
233+
* generateCandidateFilterPack will create a temporary extension pack.
234+
* This pack will contain a filter that will restrict the automodel queries
235+
* to the specified candidate methods only.
236+
* This is done using the `extensible` predicate "automodelCandidateFilter".
237+
* @param language
238+
* @param candidateMethods
239+
* @returns
240+
*/
241+
export async function generateCandidateFilterPack(
242+
language: string,
243+
candidateMethods: MethodSignature[],
244+
): Promise<string> {
245+
// Pack resides in a temporary directory, to not pollute the workspace.
246+
const packDir = (await dir({ unsafeCleanup: true })).path;
247+
248+
const syntheticConfigPack = {
249+
name: "codeql/automodel-filter",
250+
version: "0.0.0",
251+
library: true,
252+
extensionTargets: {
253+
[`codeql/${language}-queries`]: "*",
254+
},
255+
dataExtensions: ["filter.yml"],
256+
};
257+
258+
const qlpackFile = join(packDir, "codeql-pack.yml");
259+
await outputFile(qlpackFile, dumpYaml(syntheticConfigPack), "utf8");
260+
261+
// The predicate has the following defintion:
262+
// extensible predicate automodelCandidateFilter(string package, string type, string name, string signature)
263+
const dataRows = candidateMethods.map((method) => [
264+
method.packageName,
265+
method.typeName,
266+
method.methodName,
267+
method.methodParameters,
268+
]);
269+
270+
const filter = {
271+
extensions: [
272+
{
273+
addsTo: {
274+
pack: `codeql/${language}-queries`,
275+
extensible: "automodelCandidateFilter",
276+
},
277+
data: dataRows,
278+
},
279+
],
280+
};
281+
282+
const filterFile = join(packDir, "filter.yml");
283+
await writeFile(filterFile, dumpYaml(filter), "utf8");
284+
285+
return packDir;
286+
}

0 commit comments

Comments
 (0)