Skip to content

Commit 923e13f

Browse files
committed
Add better support for different languages in data extension editor
There were still some places where we were hardcoding Java in the data extension editor. This changes these places to use the database item language instead.
1 parent 1367d38 commit 923e13f

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)