Skip to content

Use workspace-state.json for local dependencies #377

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 0 additions & 14 deletions src/FolderContext.ts
Original file line number Diff line number Diff line change
Expand Up @@ -141,20 +141,6 @@ export class FolderContext implements vscode.Disposable {
this.testExplorer = new TestExplorer(this);
}

/** Get list of edited packages */
async getEditedPackages(): Promise<EditedPackage[]> {
const workspaceState = await this.swiftPackage.loadWorkspaceState();
return (
workspaceState?.object.dependencies
.filter(item => {
return item.state.name === "edited" && item.state.path;
})
.map(item => {
return { name: item.packageRef.identity, folder: item.state.path! };
}) ?? []
);
}

static uriName(uri: vscode.Uri): string {
return path.basename(uri.fsPath);
}
Expand Down
62 changes: 39 additions & 23 deletions src/ui/PackageDependencyProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ import { WorkspaceContext } from "../WorkspaceContext";
import { FolderEvent } from "../WorkspaceContext";
import { FolderContext } from "../FolderContext";
import contextKeys from "../contextKeys";
import { Version } from "../utilities/version";
import { WorkspaceState } from "../SwiftPackage";

/**
* References:
Expand Down Expand Up @@ -147,14 +147,15 @@ export class PackageDependenciesProvider implements vscode.TreeDataProvider<Tree
return [];
}
if (!element) {
const workspaceState = await folderContext.swiftPackage.loadWorkspaceState();
// Build PackageNodes for all dependencies. Because Package.resolved might not
// be up to date with edited dependency list, we need to remove the edited
// dependencies from the list before adding in the edit version
const children = [
...this.getLocalDependencies(folderContext),
...this.getLocalDependencies(workspaceState),
...this.getRemoteDependencies(folderContext),
];
const editedChildren = await this.getEditedDependencies(folderContext);
const editedChildren = await this.getEditedDependencies(workspaceState);
const uneditedChildren: PackageNode[] = [];
for (const child of children) {
const editedVersion = editedChildren.find(item => item.name === child.name);
Expand Down Expand Up @@ -186,25 +187,28 @@ export class PackageDependenciesProvider implements vscode.TreeDataProvider<Tree
* Returns a {@link PackageNode} for every local dependency
* declared in **Package.swift**.
*/
private getLocalDependencies(folderContext: FolderContext): PackageNode[] {
const swiftVersion = folderContext.workspaceContext.toolchain.swiftVersion;
// prior to Swift 5.6 local dependencies had no requirements
if (swiftVersion.isLessThan(new Version(5, 6, 0))) {
return folderContext.swiftPackage.dependencies
.filter(dependency => !dependency.requirement && dependency.url)
.map(
dependency =>
new PackageNode(dependency.identity, dependency.url!, "local", "local")
);
} else {
// since Swift 5.6 local dependencies have `type` `fileSystem`
return folderContext.swiftPackage.dependencies
.filter(dependency => dependency.type === "fileSystem" && dependency.path)
private getLocalDependencies(workspaceState: WorkspaceState | undefined): PackageNode[] {
return (
workspaceState?.object.dependencies
.filter(item => {
// need to check for both "local" and "fileSystem" as swift 5.5 and earlier
// use "local" while 5.6 and later use "fileSystem"
return (
(item.packageRef.kind === "local" ||
item.packageRef.kind === "fileSystem") &&
item.packageRef.location
);
})
.map(
dependency =>
new PackageNode(dependency.identity, dependency.path!, "local", "local")
);
}
new PackageNode(
dependency.packageRef.identity,
dependency.packageRef.location,
"local",
"local"
)
) ?? []
);
}

/**
Expand All @@ -229,9 +233,21 @@ export class PackageDependenciesProvider implements vscode.TreeDataProvider<Tree
* @param folderContext Folder to get edited dependencies for
* @returns Array of packages
*/
private async getEditedDependencies(folderContext: FolderContext): Promise<PackageNode[]> {
return (await folderContext.getEditedPackages()).map(
item => new PackageNode(item.name, item.folder, "local", "editing")
private getEditedDependencies(workspaceState: WorkspaceState | undefined): PackageNode[] {
return (
workspaceState?.object.dependencies
.filter(item => {
return item.state.name === "edited" && item.state.path;
})
.map(
item =>
new PackageNode(
item.packageRef.identity,
item.state.path!,
"local",
"editing"
)
) ?? []
);
}

Expand Down