Skip to content

Commit bf2680e

Browse files
authored
Substitute variables in task "args" (#1544)
- Expand list of supported variables to include some vscode defines that make more sense in the context of tasks - Apply to the list of "args" to "swift" and "swift-plugin" tasks - Add unit tests to track Issue: #1150
1 parent 9ba3b41 commit bf2680e

File tree

5 files changed

+75
-5
lines changed

5 files changed

+75
-5
lines changed

src/configuration.ts

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,7 @@ const configuration = {
473473
};
474474

475475
const vsCodeVariableRegex = new RegExp(/\$\{(.+?)\}/g);
476-
function substituteVariablesInString(val: string): string {
476+
export function substituteVariablesInString(val: string): string {
477477
return val.replace(vsCodeVariableRegex, (substring: string, varName: string) =>
478478
typeof varName === "string" ? computeVscodeVar(varName) || substring : substring
479479
);
@@ -494,14 +494,24 @@ function computeVscodeVar(varName: string): string | null {
494494
return vscode.workspace.workspaceFolders?.at(0)?.uri.fsPath ?? "";
495495
};
496496

497+
const file = () => vscode.window.activeTextEditor?.document?.uri?.fsPath || "";
498+
497499
// https://code.visualstudio.com/docs/editor/variables-reference
498500
// Variables to be substituted should be added here.
499501
const supportedVariables: { [k: string]: () => string } = {
500502
workspaceFolder,
503+
fileWorkspaceFolder: workspaceFolder,
501504
workspaceFolderBasename: () => path.basename(workspaceFolder()),
502505
cwd: () => process.cwd(),
503506
userHome: () => os.homedir(),
504507
pathSeparator: () => path.sep,
508+
file,
509+
relativeFile: () => path.relative(workspaceFolder(), file()),
510+
relativeFileDirname: () => path.dirname(path.relative(workspaceFolder(), file())),
511+
fileBasename: () => path.basename(file()),
512+
fileExtname: () => path.extname(file()),
513+
fileDirname: () => path.dirname(file()),
514+
fileDirnameBasename: () => path.basename(path.dirname(file())),
505515
};
506516

507517
return varName in supportedVariables ? supportedVariables[varName]() : null;

src/tasks/SwiftPluginTaskProvider.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ import { PackagePlugin } from "../SwiftPackage";
1919
import { swiftRuntimeEnv } from "../utilities/utilities";
2020
import { SwiftExecution } from "../tasks/SwiftExecution";
2121
import { resolveTaskCwd } from "../utilities/tasks";
22-
import configuration, { PluginPermissionConfiguration } from "../configuration";
22+
import configuration, {
23+
PluginPermissionConfiguration,
24+
substituteVariablesInString,
25+
} from "../configuration";
2326
import { SwiftTask } from "./SwiftTaskProvider";
2427
import { SwiftToolchain } from "../toolchain/toolchain";
2528

@@ -86,7 +89,7 @@ export class SwiftPluginTaskProvider implements vscode.TaskProvider {
8689
"package",
8790
...this.pluginArguments(task.definition as PluginPermissionConfiguration),
8891
task.definition.command,
89-
...task.definition.args,
92+
...(task.definition.args ?? []).map(substituteVariablesInString),
9093
];
9194
swiftArgs = currentFolder.toolchain.buildFlags.withAdditionalFlags(swiftArgs);
9295

src/tasks/SwiftTaskProvider.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,10 @@ import * as vscode from "vscode";
1616
import { WorkspaceContext } from "../WorkspaceContext";
1717
import { FolderContext } from "../FolderContext";
1818
import { Product } from "../SwiftPackage";
19-
import configuration, { ShowBuildStatusOptions } from "../configuration";
19+
import configuration, {
20+
ShowBuildStatusOptions,
21+
substituteVariablesInString,
22+
} from "../configuration";
2023
import { swiftRuntimeEnv } from "../utilities/utilities";
2124
import { Version } from "../utilities/version";
2225
import { SwiftToolchain } from "../toolchain/toolchain";
@@ -442,7 +445,9 @@ export class SwiftTaskProvider implements vscode.TaskProvider {
442445
platform = task.definition.macos;
443446
}
444447
// get args and cwd values from either platform specific block or base
445-
const args = platform?.args ?? task.definition.args;
448+
const args = (platform?.args ?? task.definition.args ?? []).map(
449+
substituteVariablesInString
450+
);
446451
const env = platform?.env ?? task.definition.env;
447452
const fullCwd = resolveTaskCwd(task, platform?.cwd ?? task.definition.cwd);
448453
const fullEnv = {

test/unit-tests/tasks/SwiftPluginTaskProvider.test.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import * as vscode from "vscode";
1616
import * as assert from "assert";
17+
import * as os from "os";
1718
import * as path from "path";
1819
import { match } from "sinon";
1920
import { WorkspaceContext } from "../../../src/WorkspaceContext";
@@ -269,5 +270,30 @@ suite("SwiftPluginTaskProvider Unit Test Suite", () => {
269270
"my-plugin",
270271
]);
271272
});
273+
274+
test("substitutes variables", async () => {
275+
const taskProvider = new SwiftPluginTaskProvider(instance(workspaceContext));
276+
const task = new vscode.Task(
277+
{
278+
type: "swift-plugin",
279+
args: ["${cwd}", "${userHome}"],
280+
command: "my-plugin",
281+
},
282+
workspaceFolder,
283+
"MyPlugin",
284+
"swift"
285+
);
286+
const resolvedTask = taskProvider.resolveTask(
287+
task,
288+
new vscode.CancellationTokenSource().token
289+
);
290+
const swiftExecution = resolvedTask.execution as SwiftExecution;
291+
assert.deepEqual(swiftExecution.args, [
292+
"package",
293+
"my-plugin",
294+
process.cwd(),
295+
os.homedir(),
296+
]);
297+
});
272298
});
273299
});

test/unit-tests/tasks/SwiftTaskProvider.test.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414

1515
import * as vscode from "vscode";
1616
import * as assert from "assert";
17+
import * as os from "os";
1718
import { match } from "sinon";
1819
import { WorkspaceContext } from "../../../src/WorkspaceContext";
1920
import {
@@ -330,6 +331,31 @@ suite("SwiftTaskProvider Unit Test Suite", () => {
330331
assert.equal(swiftExecution.command, "/path/to/bin/swift");
331332
});
332333

334+
test("substitutes variables", () => {
335+
const taskProvider = new SwiftTaskProvider(instance(workspaceContext));
336+
const task = new vscode.Task(
337+
{
338+
type: "swift",
339+
args: ["run", "PackageExe", "--", "${cwd}", "${userHome}"],
340+
},
341+
workspaceFolder,
342+
"run PackageExe",
343+
"swift"
344+
);
345+
const resolvedTask = taskProvider.resolveTask(
346+
task,
347+
new vscode.CancellationTokenSource().token
348+
);
349+
const swiftExecution = resolvedTask.execution as SwiftExecution;
350+
assert.deepEqual(swiftExecution.args, [
351+
"run",
352+
"PackageExe",
353+
"--",
354+
process.cwd(),
355+
os.homedir(),
356+
]);
357+
});
358+
333359
suite("Platform cwd", () => {
334360
test("includes macos cwd", () => {
335361
platformMock.setValue("darwin");

0 commit comments

Comments
 (0)