Skip to content

Commit 62291c8

Browse files
authored
Remove WorkspaceContext from PackageWatcher/TestExplorer (#1784)
* Remove WorkspaceContext from PackageWatcher/TestExplorer Pass the required dependencies to PackageWatcher and TestExplorer instead of having them pull from `folderContext.workspaceContext`. This is more refactoring to move towards removing the reference to `WorkspaceContext` in `FolderContext`. * Resolve race when creating test explorer in tests
1 parent 871c51f commit 62291c8

File tree

7 files changed

+134
-114
lines changed

7 files changed

+134
-114
lines changed

src/FolderContext.ts

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,10 @@ import { TestRunProxy } from "./TestExplorer/TestRunner";
3030
export class FolderContext implements vscode.Disposable {
3131
public backgroundCompilation: BackgroundCompilation;
3232
public hasResolveErrors = false;
33-
public testExplorer?: TestExplorer;
3433
public taskQueue: TaskQueue;
34+
public testExplorer?: TestExplorer;
35+
public resolvedTestExplorer: Promise<TestExplorer>;
36+
private testExplorerResolver?: (testExplorer: TestExplorer) => void;
3537
private packageWatcher: PackageWatcher;
3638
private testRunManager: TestRunManager;
3739

@@ -49,10 +51,16 @@ export class FolderContext implements vscode.Disposable {
4951
public workspaceFolder: vscode.WorkspaceFolder,
5052
public workspaceContext: WorkspaceContext
5153
) {
52-
this.packageWatcher = new PackageWatcher(this, workspaceContext);
54+
this.packageWatcher = new PackageWatcher(this, workspaceContext.logger);
5355
this.backgroundCompilation = new BackgroundCompilation(this);
5456
this.taskQueue = new TaskQueue(this);
5557
this.testRunManager = new TestRunManager();
58+
59+
// Tests often need to wait for the test explorer to be created before they can run.
60+
// This promise resolves when the test explorer is created, allowing them to wait for it before starting.
61+
this.resolvedTestExplorer = new Promise<TestExplorer>(resolve => {
62+
this.testExplorerResolver = resolve;
63+
});
5664
}
5765

5866
/** dispose of any thing FolderContext holds */
@@ -112,6 +120,10 @@ export class FolderContext implements vscode.Disposable {
112120
return folderContext;
113121
}
114122

123+
get languageClientManager() {
124+
return this.workspaceContext.languageClientManager.get(this);
125+
}
126+
115127
get name(): string {
116128
const relativePath = this.relativePath;
117129
if (relativePath.length === 0) {
@@ -169,7 +181,13 @@ export class FolderContext implements vscode.Disposable {
169181
/** Create Test explorer for this folder */
170182
addTestExplorer() {
171183
if (this.testExplorer === undefined) {
172-
this.testExplorer = new TestExplorer(this);
184+
this.testExplorer = new TestExplorer(
185+
this,
186+
this.workspaceContext.tasks,
187+
this.workspaceContext.logger,
188+
this.workspaceContext.onDidChangeSwiftFiles.bind(this.workspaceContext)
189+
);
190+
this.testExplorerResolver?.(this.testExplorer);
173191
}
174192
return this.testExplorer;
175193
}

src/PackageWatcher.ts

Lines changed: 9 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,12 @@ import * as path from "path";
1616
import * as fs from "fs/promises";
1717
import * as vscode from "vscode";
1818
import { FolderContext } from "./FolderContext";
19-
import { FolderOperation, WorkspaceContext } from "./WorkspaceContext";
19+
import { FolderOperation } from "./WorkspaceContext";
2020
import { BuildFlags } from "./toolchain/BuildFlags";
2121
import { Version } from "./utilities/version";
2222
import { fileExists } from "./utilities/filesystem";
2323
import { showReloadExtensionNotification } from "./ui/ReloadExtension";
24+
import { SwiftLogger } from "./logging/SwiftLogger";
2425

2526
/**
2627
* Watches for changes to **Package.swift** and **Package.resolved**.
@@ -39,7 +40,7 @@ export class PackageWatcher {
3940

4041
constructor(
4142
private folderContext: FolderContext,
42-
private workspaceContext: WorkspaceContext
43+
private logger: SwiftLogger
4344
) {}
4445

4546
/**
@@ -136,11 +137,8 @@ export class PackageWatcher {
136137

137138
async handleSwiftVersionFileChange() {
138139
const version = await this.readSwiftVersionFile();
139-
if (version && version.toString() !== this.currentVersion?.toString()) {
140-
await this.workspaceContext.fireEvent(
141-
this.folderContext,
142-
FolderOperation.swiftVersionUpdated
143-
);
140+
if (version?.toString() !== this.currentVersion?.toString()) {
141+
await this.folderContext.fireEvent(FolderOperation.swiftVersionUpdated);
144142
await showReloadExtensionNotification(
145143
"Changing the swift toolchain version requires the extension to be reloaded"
146144
);
@@ -155,9 +153,7 @@ export class PackageWatcher {
155153
return Version.fromString(contents.toString().trim());
156154
} catch (error) {
157155
if ((error as NodeJS.ErrnoException).code !== "ENOENT") {
158-
this.workspaceContext.logger.error(
159-
`Failed to read .swift-version file at ${versionFile}: ${error}`
160-
);
156+
this.logger.error(`Failed to read .swift-version file at ${versionFile}: ${error}`);
161157
}
162158
}
163159
return undefined;
@@ -173,7 +169,7 @@ export class PackageWatcher {
173169
async handlePackageSwiftChange() {
174170
// Load SwiftPM Package.swift description
175171
await this.folderContext.reload();
176-
await this.workspaceContext.fireEvent(this.folderContext, FolderOperation.packageUpdated);
172+
await this.folderContext.fireEvent(FolderOperation.packageUpdated);
177173
}
178174

179175
/**
@@ -186,10 +182,7 @@ export class PackageWatcher {
186182
await this.folderContext.reloadPackageResolved();
187183
// if file contents has changed then send resolve updated message
188184
if (this.folderContext.swiftPackage.resolved?.fileHash !== packageResolvedHash) {
189-
await this.workspaceContext.fireEvent(
190-
this.folderContext,
191-
FolderOperation.resolvedUpdated
192-
);
185+
await this.folderContext.fireEvent(FolderOperation.resolvedUpdated);
193186
}
194187
}
195188

@@ -200,9 +193,6 @@ export class PackageWatcher {
200193
*/
201194
private async handleWorkspaceStateChange() {
202195
await this.folderContext.reloadWorkspaceState();
203-
await this.workspaceContext.fireEvent(
204-
this.folderContext,
205-
FolderOperation.workspaceStateUpdated
206-
);
196+
await this.folderContext.fireEvent(FolderOperation.workspaceStateUpdated);
207197
}
208198
}

0 commit comments

Comments
 (0)