Skip to content

Commit 3c0b3e4

Browse files
authored
Merge pull request #2333 from github/koesie10/data-extension-editor-csharp
Add better support for different languages in data extension editor
2 parents 97e9129 + 923e13f commit 3c0b3e4

File tree

5 files changed

+104
-6
lines changed

5 files changed

+104
-6
lines changed

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,11 @@ export class DataExtensionsEditorView extends AbstractWebview<
148148
externalApiUsages: ExternalApiUsage[],
149149
modeledMethods: Record<string, ModeledMethod>,
150150
): Promise<void> {
151-
const yaml = createDataExtensionYaml(externalApiUsages, modeledMethods);
151+
const yaml = createDataExtensionYaml(
152+
this.databaseItem.language,
153+
externalApiUsages,
154+
modeledMethods,
155+
);
152156

153157
await outputFile(this.modelFilename, yaml);
154158

extensions/ql-vscode/src/data-extensions-editor/extension-pack-picker.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ const packNameLength = 128;
2323

2424
export async function pickExtensionPackModelFile(
2525
cliServer: Pick<CodeQLCliServer, "resolveQlpacks" | "resolveExtensions">,
26-
databaseItem: Pick<DatabaseItem, "name">,
26+
databaseItem: Pick<DatabaseItem, "name" | "language">,
2727
progress: ProgressCallback,
2828
token: CancellationToken,
2929
): Promise<string | undefined> {
@@ -53,7 +53,7 @@ export async function pickExtensionPackModelFile(
5353

5454
async function pickExtensionPack(
5555
cliServer: Pick<CodeQLCliServer, "resolveQlpacks">,
56-
databaseItem: Pick<DatabaseItem, "name">,
56+
databaseItem: Pick<DatabaseItem, "name" | "language">,
5757
progress: ProgressCallback,
5858
token: CancellationToken,
5959
): Promise<string | undefined> {
@@ -184,7 +184,7 @@ async function pickModelFile(
184184
}
185185

186186
async function pickNewExtensionPack(
187-
databaseItem: Pick<DatabaseItem, "name">,
187+
databaseItem: Pick<DatabaseItem, "name" | "language">,
188188
token: CancellationToken,
189189
): Promise<string | undefined> {
190190
const workspaceFolders = getOnDiskWorkspaceFoldersObjects();
@@ -257,7 +257,7 @@ async function pickNewExtensionPack(
257257
version: "0.0.0",
258258
library: true,
259259
extensionTargets: {
260-
"codeql/java-all": "*",
260+
[`codeql/${databaseItem.language}-all`]: "*",
261261
},
262262
dataExtensions: ["models/**/*.yml"],
263263
}),

extensions/ql-vscode/src/data-extensions-editor/yaml.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ function createDataProperty(
4343
}
4444

4545
export function createDataExtensionYaml(
46+
language: string,
4647
externalApiUsages: ExternalApiUsage[],
4748
modeledMethods: Record<string, ModeledMethod>,
4849
) {
@@ -69,7 +70,7 @@ export function createDataExtensionYaml(
6970

7071
const extensions = Object.entries(extensiblePredicateDefinitions).map(
7172
([type, definition]) => ` - addsTo:
72-
pack: codeql/java-all
73+
pack: codeql/${language}-all
7374
extensible: ${definition.extensiblePredicate}
7475
data:${createDataProperty(
7576
methodsByType[type as Exclude<ModeledMethodType, "none">],

extensions/ql-vscode/test/unit-tests/data-extensions-editor/yaml.test.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
describe("createDataExtensionYaml", () => {
77
it("creates the correct YAML file", () => {
88
const yaml = createDataExtensionYaml(
9+
"java",
910
[
1011
{
1112
signature: "org.sql2o.Connection#createQuery(String)",
@@ -99,6 +100,32 @@ describe("createDataExtensionYaml", () => {
99100
pack: codeql/java-all
100101
extensible: neutralModel
101102
data: []
103+
`);
104+
});
105+
106+
it("includes the correct language", () => {
107+
const yaml = createDataExtensionYaml("csharp", [], {});
108+
109+
expect(yaml).toEqual(`extensions:
110+
- addsTo:
111+
pack: codeql/csharp-all
112+
extensible: sourceModel
113+
data: []
114+
115+
- addsTo:
116+
pack: codeql/csharp-all
117+
extensible: sinkModel
118+
data: []
119+
120+
- addsTo:
121+
pack: codeql/csharp-all
122+
extensible: summaryModel
123+
data: []
124+
125+
- addsTo:
126+
pack: codeql/csharp-all
127+
extensible: neutralModel
128+
data: []
102129
`);
103130
});
104131
});

extensions/ql-vscode/test/vscode-tests/no-workspace/data-extensions-editor/extension-pack-picker.test.ts

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ describe("pickExtensionPackModelFile", () => {
2727
};
2828
const databaseItem = {
2929
name: "github/vscode-codeql",
30+
language: "java",
3031
};
3132

3233
const cancellationTokenSource = new CancellationTokenSource();
@@ -304,6 +305,71 @@ describe("pickExtensionPackModelFile", () => {
304305
});
305306
});
306307

308+
it("allows user to create an extension pack when there are no extension packs with a different language", async () => {
309+
const cliServer = mockCliServer({}, { models: [], data: {} });
310+
311+
const tmpDir = await dir({
312+
unsafeCleanup: true,
313+
});
314+
315+
showQuickPickSpy.mockResolvedValueOnce({
316+
label: "codeql-custom-queries-java",
317+
path: tmpDir.path,
318+
} as QuickPickItem);
319+
showInputBoxSpy.mockResolvedValueOnce("my-extension-pack");
320+
showInputBoxSpy.mockResolvedValue("models/my-model.yml");
321+
322+
expect(
323+
await pickExtensionPackModelFile(
324+
cliServer,
325+
{
326+
...databaseItem,
327+
language: "csharp",
328+
},
329+
progress,
330+
token,
331+
),
332+
).toEqual(join(tmpDir.path, "my-extension-pack", "models", "my-model.yml"));
333+
expect(showQuickPickSpy).toHaveBeenCalledTimes(1);
334+
expect(showInputBoxSpy).toHaveBeenCalledTimes(2);
335+
expect(showInputBoxSpy).toHaveBeenCalledWith(
336+
{
337+
title: expect.stringMatching(/extension pack/i),
338+
prompt: expect.stringMatching(/extension pack/i),
339+
placeHolder: expect.stringMatching(/github\/vscode-codeql-extensions/),
340+
validateInput: expect.any(Function),
341+
},
342+
token,
343+
);
344+
expect(showInputBoxSpy).toHaveBeenCalledWith(
345+
{
346+
title: expect.stringMatching(/model file/),
347+
value: "models/github.vscode-codeql.model.yml",
348+
validateInput: expect.any(Function),
349+
},
350+
token,
351+
);
352+
expect(cliServer.resolveQlpacks).toHaveBeenCalled();
353+
expect(cliServer.resolveExtensions).toHaveBeenCalled();
354+
355+
expect(
356+
loadYaml(
357+
await readFile(
358+
join(tmpDir.path, "my-extension-pack", "codeql-pack.yml"),
359+
"utf8",
360+
),
361+
),
362+
).toEqual({
363+
name: "my-extension-pack",
364+
version: "0.0.0",
365+
library: true,
366+
extensionTargets: {
367+
"codeql/csharp-all": "*",
368+
},
369+
dataExtensions: ["models/**/*.yml"],
370+
});
371+
});
372+
307373
it("allows cancelling the workspace folder selection", async () => {
308374
const cliServer = mockCliServer({}, { models: [], data: {} });
309375

0 commit comments

Comments
 (0)