Skip to content

Commit 603bbb1

Browse files
committed
update customTask, fixed watcher
1 parent 1060f17 commit 603bbb1

10 files changed

+284
-51
lines changed

package-lock.json

Lines changed: 62 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,7 @@
416416
"dev-package": "vsce package -o swift-lang-development.vsix"
417417
},
418418
"devDependencies": {
419+
"@types/checksum": "^0.1.33",
419420
"@types/glob": "^7.1.4",
420421
"@types/mocha": "^9.0.0",
421422
"@types/node": "14.x",
@@ -434,6 +435,7 @@
434435
},
435436
"dependencies": {
436437
"@types/plist": "^3.0.2",
438+
"checksum": "^1.0.0",
437439
"plist": "^3.0.5",
438440
"vscode-languageclient": "^8.0.0"
439441
}

src/FolderContext.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,10 @@ export class FolderContext implements vscode.Disposable {
123123
await this.swiftPackage.reloadPackageResolved();
124124
}
125125

126+
get resolvedContent(): string | undefined {
127+
return this.resolvedContent;
128+
}
129+
126130
/**
127131
* Fire an event to all folder observers
128132
* @param event event type

src/PackageWatcher.ts

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

1515
import * as vscode from "vscode";
1616
import { FolderContext } from "./FolderContext";
17-
import { buildDirectoryFromWorkspacePath } from "./utilities/utilities";
1817
import { FolderEvent, WorkspaceContext } from "./WorkspaceContext";
1918

2019
/**
@@ -26,7 +25,6 @@ import { FolderEvent, WorkspaceContext } from "./WorkspaceContext";
2625
export class PackageWatcher {
2726
private packageFileWatcher?: vscode.FileSystemWatcher;
2827
private resolvedFileWatcher?: vscode.FileSystemWatcher;
29-
private workspaceStateFileWatcher?: vscode.FileSystemWatcher;
3028

3129
constructor(private folderContext: FolderContext, private workspaceContext: WorkspaceContext) {}
3230

@@ -37,7 +35,6 @@ export class PackageWatcher {
3735
install() {
3836
this.packageFileWatcher = this.createPackageFileWatcher();
3937
this.resolvedFileWatcher = this.createResolvedFileWatcher();
40-
this.workspaceStateFileWatcher = this.createWorkspaceStateFileWatcher();
4138
}
4239

4340
/**
@@ -47,7 +44,6 @@ export class PackageWatcher {
4744
dispose() {
4845
this.packageFileWatcher?.dispose();
4946
this.resolvedFileWatcher?.dispose();
50-
this.workspaceStateFileWatcher?.dispose();
5147
}
5248

5349
private createPackageFileWatcher(): vscode.FileSystemWatcher {
@@ -64,23 +60,9 @@ export class PackageWatcher {
6460
const watcher = vscode.workspace.createFileSystemWatcher(
6561
new vscode.RelativePattern(this.folderContext.folder, "Package.resolved")
6662
);
67-
watcher.onDidCreate(async () => await this.handlePackageResolvedChange());
68-
watcher.onDidChange(async () => await this.handlePackageResolvedChange());
69-
watcher.onDidDelete(async () => await this.handlePackageResolvedChange());
70-
return watcher;
71-
}
72-
73-
private createWorkspaceStateFileWatcher(): vscode.FileSystemWatcher {
74-
const uri = vscode.Uri.file(
75-
buildDirectoryFromWorkspacePath(this.folderContext.folder.fsPath, true)
76-
);
77-
78-
const watcher = vscode.workspace.createFileSystemWatcher(
79-
new vscode.RelativePattern(uri, "workspace-state.json")
80-
);
81-
watcher.onDidCreate(async () => await this.handleWorkspaceStateChange());
82-
watcher.onDidChange(async () => await this.handleWorkspaceStateChange());
83-
watcher.onDidDelete(async () => await this.handleWorkspaceStateChange());
63+
// watcher.onDidCreate(async () => await this.handlePackageResolvedChange());
64+
watcher.onDidChange(async () => await this.handlePackageResolvedChange("change"));
65+
watcher.onDidDelete(async () => await this.handlePackageResolvedChange("delete"));
8466
return watcher;
8567
}
8668

@@ -102,17 +84,17 @@ export class PackageWatcher {
10284
*
10385
* This will resolve any changes in the Package.resolved.
10486
*/
105-
private async handlePackageResolvedChange() {
106-
await this.folderContext.reloadPackageResolved();
107-
this.workspaceContext.fireEvent(this.folderContext, FolderEvent.resolvedUpdated);
108-
}
87+
private async handlePackageResolvedChange(action: "change" | "delete") {
88+
// if Package.resolved is modified, we need to resolve the dependencies
89+
// after resolving is done, it will MODIFY the Package.resolved again
90+
// BUT, the file content is not actually changed
91+
// we don't want to resolve the dependencies again
92+
const hasChanges = await this.folderContext.swiftPackage.packageResovledHasChanged(action);
93+
if (!hasChanges) {
94+
return;
95+
}
10996

110-
/**
111-
* Handles a create or change event for **workspace-state.json**.
112-
*
113-
* This will resolve any changes in the workspace-state.json
114-
*/
115-
private async handleWorkspaceStateChange() {
116-
this.workspaceContext.fireEvent(this.folderContext, FolderEvent.workspaceStateUpdated);
97+
await this.folderContext.swiftPackage.reloadPackageResolved();
98+
this.workspaceContext.fireEvent(this.folderContext, FolderEvent.resolvedUpdated);
11799
}
118100
}

src/SwiftPackage.ts

Lines changed: 69 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
execSwift,
2020
getErrorDescription,
2121
} from "./utilities/utilities";
22+
import checksum = require("checksum");
2223

2324
/** Swift Package Manager contents */
2425
export interface PackageContents {
@@ -165,7 +166,9 @@ export class SwiftPackage implements PackageContents {
165166
readonly folder: vscode.Uri,
166167
private contents: SwiftPackageState,
167168
public resolved: PackageResolved | undefined,
168-
public plugins: PackagePlugin[]
169+
public plugins: PackagePlugin[],
170+
public resolvedContent: string | undefined,
171+
public dependencySet: Set<string>
169172
) {}
170173

171174
/**
@@ -177,7 +180,8 @@ export class SwiftPackage implements PackageContents {
177180
const contents = await SwiftPackage.loadPackage(folder);
178181
const resolved = await SwiftPackage.loadPackageResolved(folder);
179182
const plugins = await SwiftPackage.loadPlugins(folder);
180-
return new SwiftPackage(folder, contents, resolved, plugins);
183+
const resolvedContent = await SwiftPackage.loadPackageResolvedFile(folder);
184+
return new SwiftPackage(folder, contents, resolved, plugins, resolvedContent, new Set());
181185
}
182186

183187
/**
@@ -213,10 +217,22 @@ export class SwiftPackage implements PackageContents {
213217
}
214218
}
215219

216-
static async loadPackageResolved(folder: vscode.Uri): Promise<PackageResolved | undefined> {
220+
static async loadPackageResolvedFile(folder: vscode.Uri): Promise<string | undefined> {
217221
try {
218222
const uri = vscode.Uri.joinPath(folder, "Package.resolved");
219223
const contents = await fs.readFile(uri.fsPath, "utf8");
224+
return contents;
225+
} catch {
226+
return undefined;
227+
}
228+
}
229+
230+
static async loadPackageResolved(folder: vscode.Uri): Promise<PackageResolved | undefined> {
231+
try {
232+
const contents = await SwiftPackage.loadPackageResolvedFile(folder);
233+
if (contents === undefined) {
234+
return undefined;
235+
}
220236
const json = JSON.parse(contents);
221237
const version = <{ version: number }>json;
222238
if (version.version === 1) {
@@ -257,6 +273,34 @@ export class SwiftPackage implements PackageContents {
257273
}
258274
}
259275

276+
async packageResovledHasChanged(action: any): Promise<boolean> {
277+
console.log(action);
278+
const resolvedContent = await SwiftPackage.loadPackageResolvedFile(this.folder);
279+
280+
console.log(resolvedContent);
281+
console.log(this.resolvedContent);
282+
283+
if (resolvedContent === undefined) {
284+
return false;
285+
}
286+
// deletion --> creation --> modification
287+
// r undefined exists exists
288+
// pr exists undefined exists
289+
290+
if (this.resolvedContent === undefined) {
291+
return true;
292+
}
293+
294+
const oldChecksum = checksum(resolvedContent);
295+
const newChecksum = checksum(this.resolvedContent);
296+
297+
if (oldChecksum !== newChecksum) {
298+
return true;
299+
}
300+
301+
return false;
302+
}
303+
260304
/**
261305
* Load workspace-state.json file for swift package
262306
* @returns Workspace state
@@ -275,13 +319,35 @@ export class SwiftPackage implements PackageContents {
275319
}
276320
}
277321

322+
/**
323+
* Run `swift package describe` and return results
324+
* @param folder folder package is in
325+
* @returns results of `swift package describe`
326+
*/
327+
async resolveDependencyGraph(): Promise<Set<string>> {
328+
return this.dependencySet;
329+
}
330+
331+
updateDependencySetWithStdout(stdout: string): void {
332+
const lines = stdout
333+
.split("\n")
334+
.filter(item => item !== "")
335+
.map(item => item.trim());
336+
this.updateDependencySet(new Set(lines ?? []));
337+
}
338+
339+
updateDependencySet(dependencySet: Set<string>): void {
340+
this.dependencySet = dependencySet;
341+
}
342+
278343
/** Reload swift package */
279344
public async reload() {
280345
this.contents = await SwiftPackage.loadPackage(this.folder);
281346
}
282347

283348
/** Reload Package.resolved file */
284349
public async reloadPackageResolved() {
350+
this.resolvedContent = await SwiftPackage.loadPackageResolvedFile(this.folder);
285351
this.resolved = await SwiftPackage.loadPackageResolved(this.folder);
286352
}
287353

0 commit comments

Comments
 (0)