Skip to content

Commit f35d11b

Browse files
authored
Merge branch 'main' into koesie10/markdown-lint-ci
2 parents f7bcd58 + 7470e72 commit f35d11b

File tree

26 files changed

+1253
-45
lines changed

26 files changed

+1253
-45
lines changed

CODEOWNERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
**/* @github/codeql-vscode-reviewers
22
**/variant-analysis/ @github/code-scanning-secexp-reviewers
33
**/databases/ @github/code-scanning-secexp-reviewers
4+
**/data-extensions-editor/ @github/code-scanning-secexp-reviewers

extensions/ql-vscode/package-lock.json

Lines changed: 9 additions & 9 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: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -703,6 +703,10 @@
703703
"title": "CodeQL: Go to QL Code",
704704
"enablement": "codeql.hasQLSource"
705705
},
706+
{
707+
"command": "codeQL.openDataExtensionsEditor",
708+
"title": "CodeQL: Open Data Extensions Editor"
709+
},
706710
{
707711
"command": "codeQL.mockGitHubApiServer.startRecording",
708712
"title": "CodeQL: Mock GitHub API Server: Start Scenario Recording"
@@ -1086,6 +1090,10 @@
10861090
"command": "codeQL.viewCfgContextEditor",
10871091
"when": "false"
10881092
},
1093+
{
1094+
"command": "codeQL.openDataExtensionsEditor",
1095+
"when": "config.codeQL.canary && config.codeQL.dataExtensions.editor"
1096+
},
10891097
{
10901098
"command": "codeQLVariantAnalysisRepositories.openConfigFile",
10911099
"when": "false"

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ export type BaseCommands = {
6969

7070
"codeQL.copyVersion": () => Promise<void>;
7171
"codeQL.restartQueryServer": () => Promise<void>;
72+
"codeQL.restartQueryServerOnConfigChange": () => Promise<void>;
73+
"codeQL.restartLegacyQueryServerOnConfigChange": () => Promise<void>;
7274
};
7375

7476
// Commands used when working with queries in the editor
@@ -196,7 +198,10 @@ export type VariantAnalysisCommands = {
196198
variantAnalysisId: number,
197199
repositoryFullName: string,
198200
) => Promise<VariantAnalysisScannedRepositoryResult>;
199-
"codeQL.monitorVariantAnalysis": (
201+
"codeQL.monitorNewVariantAnalysis": (
202+
variantAnalysis: VariantAnalysis,
203+
) => Promise<void>;
204+
"codeQL.monitorRehydratedVariantAnalysis": (
200205
variantAnalysis: VariantAnalysis,
201206
) => Promise<void>;
202207
"codeQL.openVariantAnalysisLogs": (
@@ -241,6 +246,10 @@ export type PackagingCommands = {
241246
"codeQL.downloadPacks": () => Promise<void>;
242247
};
243248

249+
export type DataExtensionsEditorCommands = {
250+
"codeQL.openDataExtensionsEditor": () => Promise<void>;
251+
};
252+
244253
export type EvalLogViewerCommands = {
245254
"codeQLEvalLogViewer.clear": () => Promise<void>;
246255
};
@@ -273,6 +282,7 @@ export type AllExtensionCommands = BaseCommands &
273282
AstCfgCommands &
274283
AstViewerCommands &
275284
PackagingCommands &
285+
DataExtensionsEditorCommands &
276286
EvalLogViewerCommands &
277287
SummaryLanguageSupportCommands &
278288
Partial<TestUICommands> &
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { DecodedBqrsChunk } from "../pure/bqrs-cli-types";
2+
import { Call, ExternalApiUsage } from "./external-api-usage";
3+
4+
export function decodeBqrsToExternalApiUsages(
5+
chunk: DecodedBqrsChunk,
6+
): ExternalApiUsage[] {
7+
const methodsByApiName = new Map<string, ExternalApiUsage>();
8+
9+
chunk?.tuples.forEach((tuple) => {
10+
const signature = tuple[0] as string;
11+
const supported = tuple[1] as boolean;
12+
const usage = tuple[2] as Call;
13+
14+
const [packageWithType, methodDeclaration] = signature.split("#");
15+
16+
const packageName = packageWithType.substring(
17+
0,
18+
packageWithType.lastIndexOf("."),
19+
);
20+
const typeName = packageWithType.substring(
21+
packageWithType.lastIndexOf(".") + 1,
22+
);
23+
24+
const methodName = methodDeclaration.substring(
25+
0,
26+
methodDeclaration.indexOf("("),
27+
);
28+
const methodParameters = methodDeclaration.substring(
29+
methodDeclaration.indexOf("("),
30+
);
31+
32+
if (!methodsByApiName.has(signature)) {
33+
methodsByApiName.set(signature, {
34+
signature,
35+
packageName,
36+
typeName,
37+
methodName,
38+
methodParameters,
39+
supported,
40+
usages: [],
41+
});
42+
}
43+
44+
const method = methodsByApiName.get(signature)!;
45+
method.usages.push(usage);
46+
});
47+
48+
const externalApiUsages = Array.from(methodsByApiName.values());
49+
externalApiUsages.sort((a, b) => {
50+
// Sort by number of usages descending
51+
return b.usages.length - a.usages.length;
52+
});
53+
return externalApiUsages;
54+
}
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import { ExtensionContext } from "vscode";
2+
import { DataExtensionsEditorView } from "./data-extensions-editor-view";
3+
import { DataExtensionsEditorCommands } from "../common/commands";
4+
import { CodeQLCliServer } from "../cli";
5+
import { QueryRunner } from "../queryRunner";
6+
import { DatabaseManager } from "../local-databases";
7+
import { extLogger } from "../common";
8+
import { ensureDir } from "fs-extra";
9+
import { join } from "path";
10+
11+
export class DataExtensionsEditorModule {
12+
private readonly queryStorageDir: string;
13+
14+
private constructor(
15+
private readonly ctx: ExtensionContext,
16+
private readonly databaseManager: DatabaseManager,
17+
private readonly cliServer: CodeQLCliServer,
18+
private readonly queryRunner: QueryRunner,
19+
baseQueryStorageDir: string,
20+
) {
21+
this.queryStorageDir = join(
22+
baseQueryStorageDir,
23+
"data-extensions-editor-results",
24+
);
25+
}
26+
27+
public static async initialize(
28+
ctx: ExtensionContext,
29+
databaseManager: DatabaseManager,
30+
cliServer: CodeQLCliServer,
31+
queryRunner: QueryRunner,
32+
queryStorageDir: string,
33+
): Promise<DataExtensionsEditorModule> {
34+
const dataExtensionsEditorModule = new DataExtensionsEditorModule(
35+
ctx,
36+
databaseManager,
37+
cliServer,
38+
queryRunner,
39+
queryStorageDir,
40+
);
41+
42+
await dataExtensionsEditorModule.initialize();
43+
return dataExtensionsEditorModule;
44+
}
45+
46+
public getCommands(): DataExtensionsEditorCommands {
47+
return {
48+
"codeQL.openDataExtensionsEditor": async () => {
49+
const db = this.databaseManager.currentDatabaseItem;
50+
if (!db) {
51+
void extLogger.log("No database selected");
52+
return;
53+
}
54+
55+
const view = new DataExtensionsEditorView(
56+
this.ctx,
57+
this.cliServer,
58+
this.queryRunner,
59+
this.queryStorageDir,
60+
db,
61+
);
62+
await view.openView();
63+
},
64+
};
65+
}
66+
67+
private async initialize(): Promise<void> {
68+
await ensureDir(this.queryStorageDir);
69+
}
70+
}

0 commit comments

Comments
 (0)