diff --git a/src/commands.ts b/src/commands.ts index 71f1eb694..f6b607886 100644 --- a/src/commands.ts +++ b/src/commands.ts @@ -148,7 +148,7 @@ export function register(ctx: WorkspaceContext): vscode.Disposable[] { ), vscode.commands.registerCommand( Commands.RESET_PACKAGE, - async () => await resetPackage(ctx) + async folder => await resetPackage(ctx, folder) ), vscode.commands.registerCommand("swift.runScript", async () => await runSwiftScript(ctx)), vscode.commands.registerCommand("swift.openPackage", async () => { @@ -182,27 +182,27 @@ export function register(ctx: WorkspaceContext): vscode.Disposable[] { async () => await insertFunctionComment(ctx) ), vscode.commands.registerCommand(Commands.USE_LOCAL_DEPENDENCY, async (item, dep) => { - if (item instanceof PackageNode) { + if (PackageNode.isPackageNode(item)) { return await useLocalDependency(item.name, ctx, dep); } }), - vscode.commands.registerCommand("swift.editDependency", async item => { - if (item instanceof PackageNode) { - return await editDependency(item.name, ctx); + vscode.commands.registerCommand("swift.editDependency", async (item, folder) => { + if (PackageNode.isPackageNode(item)) { + return await editDependency(item.name, ctx, folder); } }), - vscode.commands.registerCommand(Commands.UNEDIT_DEPENDENCY, async item => { - if (item instanceof PackageNode) { - return await uneditDependency(item.name, ctx); + vscode.commands.registerCommand(Commands.UNEDIT_DEPENDENCY, async (item, folder) => { + if (PackageNode.isPackageNode(item)) { + return await uneditDependency(item.name, ctx, folder); } }), vscode.commands.registerCommand("swift.openInWorkspace", async item => { - if (item instanceof PackageNode) { + if (PackageNode.isPackageNode(item)) { return await openInWorkspace(item); } }), vscode.commands.registerCommand("swift.openExternal", item => { - if (item instanceof PackageNode) { + if (PackageNode.isPackageNode(item)) { return openInExternalEditor(item); } }), diff --git a/src/commands/dependencies/edit.ts b/src/commands/dependencies/edit.ts index 40a79777b..376ec3dc3 100644 --- a/src/commands/dependencies/edit.ts +++ b/src/commands/dependencies/edit.ts @@ -17,14 +17,19 @@ import { createSwiftTask } from "../../tasks/SwiftTaskProvider"; import { FolderOperation, WorkspaceContext } from "../../WorkspaceContext"; import { executeTaskWithUI } from "../utilities"; import { packageName } from "../../utilities/tasks"; +import { FolderContext } from "../../FolderContext"; /** * Setup package dependency to be edited * @param identifier Identifier of dependency we want to edit * @param ctx workspace context */ -export async function editDependency(identifier: string, ctx: WorkspaceContext) { - const currentFolder = ctx.currentFolder; +export async function editDependency( + identifier: string, + ctx: WorkspaceContext, + folder: FolderContext | undefined +) { + const currentFolder = folder ?? ctx.currentFolder; if (!currentFolder) { return; } diff --git a/src/commands/dependencies/unedit.ts b/src/commands/dependencies/unedit.ts index 68e38974c..4299f1b87 100644 --- a/src/commands/dependencies/unedit.ts +++ b/src/commands/dependencies/unedit.ts @@ -23,8 +23,12 @@ import { FolderContext } from "../../FolderContext"; * @param identifier Identifier of dependency * @param ctx workspace context */ -export async function uneditDependency(identifier: string, ctx: WorkspaceContext) { - const currentFolder = ctx.currentFolder; +export async function uneditDependency( + identifier: string, + ctx: WorkspaceContext, + folder: FolderContext | undefined +) { + const currentFolder = folder ?? ctx.currentFolder; if (!currentFolder) { ctx.outputChannel.log("currentFolder is not set."); return false; diff --git a/src/commands/resetPackage.ts b/src/commands/resetPackage.ts index d9158c133..8be64ee74 100644 --- a/src/commands/resetPackage.ts +++ b/src/commands/resetPackage.ts @@ -22,8 +22,8 @@ import { packageName } from "../utilities/tasks"; /** * Executes a {@link vscode.Task task} to reset the complete cache/build directory. */ -export async function resetPackage(ctx: WorkspaceContext) { - const current = ctx.currentFolder; +export async function resetPackage(ctx: WorkspaceContext, folder: FolderContext | undefined) { + const current = folder ?? ctx.currentFolder; if (!current) { return; } diff --git a/src/ui/ProjectPanelProvider.ts b/src/ui/ProjectPanelProvider.ts index 005c75a81..a0b8e8aa5 100644 --- a/src/ui/ProjectPanelProvider.ts +++ b/src/ui/ProjectPanelProvider.ts @@ -69,6 +69,24 @@ async function getChildren(directoryPath: string, parentId?: string): Promise { + * if (item instanceof PackageNode) { + * return await uneditDependency(item.name, ctx, folder); + * } + * }), + * ``` + * + * So instead we'll check for this set boolean property. Even if the implementation of the + * {@link PackageNode} class changes, this property should not need to change + */ + static isPackageNode = (item: { __isPackageNode?: boolean }) => item.__isPackageNode ?? false; + __isPackageNode = true; + constructor( private dependency: ResolvedDependency, private childDependencies: (dependency: Dependency) => ResolvedDependency[], diff --git a/test/integration-tests/commands/dependency.test.ts b/test/integration-tests/commands/dependency.test.ts index 6a843d9cd..99326ddd8 100644 --- a/test/integration-tests/commands/dependency.test.ts +++ b/test/integration-tests/commands/dependency.test.ts @@ -20,8 +20,7 @@ import { FolderContext } from "../../../src/FolderContext"; import { WorkspaceContext } from "../../../src/WorkspaceContext"; import { Commands } from "../../../src/commands"; import { activateExtensionForSuite, findWorkspaceFolder } from "../utilities/testutilities"; -import { executeTaskAndWaitForResult, waitForNoRunningTasks } from "../../utilities/tasks"; -import { createBuildAllTask } from "../../../src/tasks/SwiftTaskProvider"; +import { waitForNoRunningTasks } from "../../utilities/tasks"; suite("Dependency Commmands Test Suite @slow", function () { // full workflow's interaction with spm is longer than the default timeout @@ -59,7 +58,6 @@ suite("Dependency Commmands Test Suite @slow", function () { setup(async () => { await waitForNoRunningTasks(); treeProvider = new ProjectPanelProvider(workspaceContext); - await executeTaskAndWaitForResult(await createBuildAllTask(depsContext)); }); teardown(() => { @@ -69,7 +67,9 @@ suite("Dependency Commmands Test Suite @slow", function () { async function getDependency() { const headers = await treeProvider.getChildren(); const header = headers.find(n => n.name === "Dependencies") as PackageNode; - expect(header).to.not.be.undefined; + if (!header) { + return; + } const children = await header.getChildren(); return children.find( n => n.name.toLocaleLowerCase() === "swift-markdown" @@ -83,7 +83,7 @@ suite("Dependency Commmands Test Suite @slow", function () { async function getDependencyInState(state: "remote" | "editing") { for (let i = 0; i < 10; i++) { const dep = await getDependency(); - if (dep.type === state) { + if (dep?.type === state) { return dep; } await new Promise(resolve => setTimeout(resolve, 1000)); @@ -98,7 +98,8 @@ suite("Dependency Commmands Test Suite @slow", function () { const result = await vscode.commands.executeCommand( Commands.USE_LOCAL_DEPENDENCY, item, - localDep + localDep, + depsContext ); expect(result).to.be.true; @@ -112,7 +113,10 @@ suite("Dependency Commmands Test Suite @slow", function () { await useLocalDependencyTest(); // spm reset - const result = await vscode.commands.executeCommand(Commands.RESET_PACKAGE); + const result = await vscode.commands.executeCommand( + Commands.RESET_PACKAGE, + depsContext + ); expect(result).to.be.true; const dep = await getDependencyInState("remote"); @@ -125,7 +129,8 @@ suite("Dependency Commmands Test Suite @slow", function () { const result = await vscode.commands.executeCommand( Commands.UNEDIT_DEPENDENCY, - await getDependency() + await getDependencyInState("editing"), + depsContext ); expect(result).to.be.true;