Skip to content

Commit eea62f3

Browse files
authored
Cleanup task fetching for project panel (#1620)
- It was including any non-"swift-plugin" task such as globally configed node.js ones I had setup - Resolve CWD similar to tasks to make sure code-workspace ones are included Issue: #1072
1 parent 7fe1d91 commit eea62f3

File tree

3 files changed

+29
-23
lines changed

3 files changed

+29
-23
lines changed

src/tasks/SwiftTaskProvider.ts

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import { swiftRuntimeEnv } from "../utilities/utilities";
2424
import { Version } from "../utilities/version";
2525
import { SwiftToolchain } from "../toolchain/toolchain";
2626
import { SwiftExecution } from "../tasks/SwiftExecution";
27-
import { packageName, resolveScope, resolveTaskCwd } from "../utilities/tasks";
27+
import { getPlatformConfig, packageName, resolveScope, resolveTaskCwd } from "../utilities/tasks";
2828
import { BuildConfigurationFactory } from "../debugger/buildConfig";
2929

3030
/**
@@ -50,7 +50,7 @@ interface TaskConfig {
5050
showBuildStatus?: ShowBuildStatusOptions;
5151
}
5252

53-
interface TaskPlatformSpecificConfig {
53+
export interface TaskPlatformSpecificConfig {
5454
args?: string[];
5555
cwd?: string;
5656
env?: { [name: string]: unknown };
@@ -447,14 +447,7 @@ export class SwiftTaskProvider implements vscode.TaskProvider {
447447
const toolchain = currentFolder.toolchain;
448448
const swift = toolchain.getToolchainExecutable("swift");
449449
// platform specific
450-
let platform: TaskPlatformSpecificConfig | undefined;
451-
if (process.platform === "win32") {
452-
platform = task.definition.windows;
453-
} else if (process.platform === "linux") {
454-
platform = task.definition.linux;
455-
} else if (process.platform === "darwin") {
456-
platform = task.definition.macos;
457-
}
450+
const platform: TaskPlatformSpecificConfig | undefined = getPlatformConfig(task);
458451
// get args and cwd values from either platform specific block or base
459452
const args = (platform?.args ?? task.definition.args ?? []).map(
460453
substituteVariablesInString

src/ui/ProjectPanelProvider.ts

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ import { FolderOperation } from "../WorkspaceContext";
2121
import contextKeys from "../contextKeys";
2222
import { Dependency, ResolvedDependency, Target } from "../SwiftPackage";
2323
import { FolderContext } from "../FolderContext";
24+
import { getPlatformConfig, resolveTaskCwd } from "../utilities/tasks";
25+
import { SwiftTask, TaskPlatformSpecificConfig } from "../tasks/SwiftTaskProvider";
2426

2527
const LOADING_ICON = "loading~spin";
2628
/**
@@ -573,17 +575,20 @@ export class ProjectPanelProvider implements vscode.TreeDataProvider<TreeNode> {
573575
}
574576

575577
private async tasks(folderContext: FolderContext): Promise<TaskNode[]> {
576-
const tasks = await vscode.tasks.fetchTasks();
578+
const tasks = await vscode.tasks.fetchTasks({ type: "swift" });
577579

578580
return (
579581
tasks
580582
// Plugin tasks are shown under the Commands header
581-
.filter(
582-
task =>
583-
(!task.definition.cwd ||
584-
task.definition.cwd === folderContext.folder.fsPath) &&
585-
task.source !== "swift-plugin"
586-
)
583+
.filter(task => {
584+
const platform: TaskPlatformSpecificConfig | undefined =
585+
getPlatformConfig(task);
586+
return (
587+
!task.definition.cwd ||
588+
resolveTaskCwd(task, platform?.cwd ?? task.definition.cwd) ===
589+
folderContext.folder.fsPath
590+
);
591+
})
587592
.map(
588593
(task, i) =>
589594
new TaskNode(
@@ -631,7 +636,7 @@ export class ProjectPanelProvider implements vscode.TreeDataProvider<TreeNode> {
631636
* This is a workaround for the lack of an event when tasks are added or removed.
632637
*/
633638
class TaskPoller implements vscode.Disposable {
634-
private previousTasks: vscode.Task[] = [];
639+
private previousTasks: SwiftTask[] = [];
635640
private timeout?: NodeJS.Timeout;
636641
private static POLL_INTERVAL = 5000;
637642

@@ -641,15 +646,13 @@ class TaskPoller implements vscode.Disposable {
641646

642647
private async pollTasks() {
643648
try {
644-
const tasks = await vscode.tasks.fetchTasks();
649+
const tasks = (await vscode.tasks.fetchTasks({ type: "swift" })) as SwiftTask[];
645650
const tasksChanged =
646651
tasks.length !== this.previousTasks.length ||
647652
tasks.some((task, i) => {
648653
const prev = this.previousTasks[i];
649-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
650-
const c1 = (task.execution as any).command;
651-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
652-
const c2 = (prev.execution as any).command;
654+
const c1 = task.execution.command;
655+
const c2 = prev.execution.command;
653656
return (
654657
!prev ||
655658
task.name !== prev.name ||

src/utilities/tasks.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,16 @@ function getScopeWorkspaceFolder(task: vscode.Task): string | undefined {
4444
return;
4545
}
4646

47+
export function getPlatformConfig<T>(task: vscode.Task): T | undefined {
48+
if (process.platform === "win32") {
49+
return task.definition.windows;
50+
} else if (process.platform === "linux") {
51+
return task.definition.linux;
52+
} else if (process.platform === "darwin") {
53+
return task.definition.macos;
54+
}
55+
}
56+
4757
export function checkIfBuildComplete(line: string): boolean {
4858
// Output in this format for "build" and "test" commands
4959
const completeRegex = /^Build complete!/gm;

0 commit comments

Comments
 (0)