Skip to content

Commit 09ddc5a

Browse files
authored
Use workspace-state.json for local dependencies (#377)
* Use workspace-state.json for local dependencies * Only load workspaceState once
1 parent d17f85d commit 09ddc5a

File tree

2 files changed

+39
-37
lines changed

2 files changed

+39
-37
lines changed

src/FolderContext.ts

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -141,20 +141,6 @@ export class FolderContext implements vscode.Disposable {
141141
this.testExplorer = new TestExplorer(this);
142142
}
143143

144-
/** Get list of edited packages */
145-
async getEditedPackages(): Promise<EditedPackage[]> {
146-
const workspaceState = await this.swiftPackage.loadWorkspaceState();
147-
return (
148-
workspaceState?.object.dependencies
149-
.filter(item => {
150-
return item.state.name === "edited" && item.state.path;
151-
})
152-
.map(item => {
153-
return { name: item.packageRef.identity, folder: item.state.path! };
154-
}) ?? []
155-
);
156-
}
157-
158144
static uriName(uri: vscode.Uri): string {
159145
return path.basename(uri.fsPath);
160146
}

src/ui/PackageDependencyProvider.ts

Lines changed: 39 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import { WorkspaceContext } from "../WorkspaceContext";
2121
import { FolderEvent } from "../WorkspaceContext";
2222
import { FolderContext } from "../FolderContext";
2323
import contextKeys from "../contextKeys";
24-
import { Version } from "../utilities/version";
24+
import { WorkspaceState } from "../SwiftPackage";
2525

2626
/**
2727
* References:
@@ -147,14 +147,15 @@ export class PackageDependenciesProvider implements vscode.TreeDataProvider<Tree
147147
return [];
148148
}
149149
if (!element) {
150+
const workspaceState = await folderContext.swiftPackage.loadWorkspaceState();
150151
// Build PackageNodes for all dependencies. Because Package.resolved might not
151152
// be up to date with edited dependency list, we need to remove the edited
152153
// dependencies from the list before adding in the edit version
153154
const children = [
154-
...this.getLocalDependencies(folderContext),
155+
...this.getLocalDependencies(workspaceState),
155156
...this.getRemoteDependencies(folderContext),
156157
];
157-
const editedChildren = await this.getEditedDependencies(folderContext);
158+
const editedChildren = await this.getEditedDependencies(workspaceState);
158159
const uneditedChildren: PackageNode[] = [];
159160
for (const child of children) {
160161
const editedVersion = editedChildren.find(item => item.name === child.name);
@@ -186,25 +187,28 @@ export class PackageDependenciesProvider implements vscode.TreeDataProvider<Tree
186187
* Returns a {@link PackageNode} for every local dependency
187188
* declared in **Package.swift**.
188189
*/
189-
private getLocalDependencies(folderContext: FolderContext): PackageNode[] {
190-
const swiftVersion = folderContext.workspaceContext.toolchain.swiftVersion;
191-
// prior to Swift 5.6 local dependencies had no requirements
192-
if (swiftVersion.isLessThan(new Version(5, 6, 0))) {
193-
return folderContext.swiftPackage.dependencies
194-
.filter(dependency => !dependency.requirement && dependency.url)
195-
.map(
196-
dependency =>
197-
new PackageNode(dependency.identity, dependency.url!, "local", "local")
198-
);
199-
} else {
200-
// since Swift 5.6 local dependencies have `type` `fileSystem`
201-
return folderContext.swiftPackage.dependencies
202-
.filter(dependency => dependency.type === "fileSystem" && dependency.path)
190+
private getLocalDependencies(workspaceState: WorkspaceState | undefined): PackageNode[] {
191+
return (
192+
workspaceState?.object.dependencies
193+
.filter(item => {
194+
// need to check for both "local" and "fileSystem" as swift 5.5 and earlier
195+
// use "local" while 5.6 and later use "fileSystem"
196+
return (
197+
(item.packageRef.kind === "local" ||
198+
item.packageRef.kind === "fileSystem") &&
199+
item.packageRef.location
200+
);
201+
})
203202
.map(
204203
dependency =>
205-
new PackageNode(dependency.identity, dependency.path!, "local", "local")
206-
);
207-
}
204+
new PackageNode(
205+
dependency.packageRef.identity,
206+
dependency.packageRef.location,
207+
"local",
208+
"local"
209+
)
210+
) ?? []
211+
);
208212
}
209213

210214
/**
@@ -229,9 +233,21 @@ export class PackageDependenciesProvider implements vscode.TreeDataProvider<Tree
229233
* @param folderContext Folder to get edited dependencies for
230234
* @returns Array of packages
231235
*/
232-
private async getEditedDependencies(folderContext: FolderContext): Promise<PackageNode[]> {
233-
return (await folderContext.getEditedPackages()).map(
234-
item => new PackageNode(item.name, item.folder, "local", "editing")
236+
private getEditedDependencies(workspaceState: WorkspaceState | undefined): PackageNode[] {
237+
return (
238+
workspaceState?.object.dependencies
239+
.filter(item => {
240+
return item.state.name === "edited" && item.state.path;
241+
})
242+
.map(
243+
item =>
244+
new PackageNode(
245+
item.packageRef.identity,
246+
item.state.path!,
247+
"local",
248+
"editing"
249+
)
250+
) ?? []
235251
);
236252
}
237253

0 commit comments

Comments
 (0)