Skip to content

Remove WorkspaceContext from PackageWatcher/TestExplorer #1784

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

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
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
24 changes: 21 additions & 3 deletions src/FolderContext.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,10 @@ import { TestRunProxy } from "./TestExplorer/TestRunner";
export class FolderContext implements vscode.Disposable {
public backgroundCompilation: BackgroundCompilation;
public hasResolveErrors = false;
public testExplorer?: TestExplorer;
public taskQueue: TaskQueue;
public testExplorer?: TestExplorer;
public resolvedTestExplorer: Promise<TestExplorer>;
private testExplorerResolver?: (testExplorer: TestExplorer) => void;
private packageWatcher: PackageWatcher;
private testRunManager: TestRunManager;

Expand All @@ -49,10 +51,16 @@ export class FolderContext implements vscode.Disposable {
public workspaceFolder: vscode.WorkspaceFolder,
public workspaceContext: WorkspaceContext
) {
this.packageWatcher = new PackageWatcher(this, workspaceContext);
this.packageWatcher = new PackageWatcher(this, workspaceContext.logger);
this.backgroundCompilation = new BackgroundCompilation(this);
this.taskQueue = new TaskQueue(this);
this.testRunManager = new TestRunManager();

// Tests often need to wait for the test explorer to be created before they can run.
// This promise resolves when the test explorer is created, allowing them to wait for it before starting.
this.resolvedTestExplorer = new Promise<TestExplorer>(resolve => {
this.testExplorerResolver = resolve;
});
}

/** dispose of any thing FolderContext holds */
Expand Down Expand Up @@ -112,6 +120,10 @@ export class FolderContext implements vscode.Disposable {
return folderContext;
}

get languageClientManager() {
return this.workspaceContext.languageClientManager.get(this);
}

get name(): string {
const relativePath = this.relativePath;
if (relativePath.length === 0) {
Expand Down Expand Up @@ -169,7 +181,13 @@ export class FolderContext implements vscode.Disposable {
/** Create Test explorer for this folder */
addTestExplorer() {
if (this.testExplorer === undefined) {
this.testExplorer = new TestExplorer(this);
this.testExplorer = new TestExplorer(
this,
this.workspaceContext.tasks,
this.workspaceContext.logger,
this.workspaceContext.onDidChangeSwiftFiles.bind(this.workspaceContext)
);
this.testExplorerResolver?.(this.testExplorer);
}
return this.testExplorer;
}
Expand Down
28 changes: 9 additions & 19 deletions src/PackageWatcher.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,12 @@ import * as path from "path";
import * as fs from "fs/promises";
import * as vscode from "vscode";
import { FolderContext } from "./FolderContext";
import { FolderOperation, WorkspaceContext } from "./WorkspaceContext";
import { FolderOperation } from "./WorkspaceContext";
import { BuildFlags } from "./toolchain/BuildFlags";
import { Version } from "./utilities/version";
import { fileExists } from "./utilities/filesystem";
import { showReloadExtensionNotification } from "./ui/ReloadExtension";
import { SwiftLogger } from "./logging/SwiftLogger";

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

constructor(
private folderContext: FolderContext,
private workspaceContext: WorkspaceContext
private logger: SwiftLogger
) {}

/**
Expand Down Expand Up @@ -136,11 +137,8 @@ export class PackageWatcher {

async handleSwiftVersionFileChange() {
const version = await this.readSwiftVersionFile();
if (version && version.toString() !== this.currentVersion?.toString()) {
await this.workspaceContext.fireEvent(
this.folderContext,
FolderOperation.swiftVersionUpdated
);
if (version?.toString() !== this.currentVersion?.toString()) {
await this.folderContext.fireEvent(FolderOperation.swiftVersionUpdated);
await showReloadExtensionNotification(
"Changing the swift toolchain version requires the extension to be reloaded"
);
Expand All @@ -155,9 +153,7 @@ export class PackageWatcher {
return Version.fromString(contents.toString().trim());
} catch (error) {
if ((error as NodeJS.ErrnoException).code !== "ENOENT") {
this.workspaceContext.logger.error(
`Failed to read .swift-version file at ${versionFile}: ${error}`
);
this.logger.error(`Failed to read .swift-version file at ${versionFile}: ${error}`);
}
}
return undefined;
Expand All @@ -173,7 +169,7 @@ export class PackageWatcher {
async handlePackageSwiftChange() {
// Load SwiftPM Package.swift description
await this.folderContext.reload();
await this.workspaceContext.fireEvent(this.folderContext, FolderOperation.packageUpdated);
await this.folderContext.fireEvent(FolderOperation.packageUpdated);
}

/**
Expand All @@ -186,10 +182,7 @@ export class PackageWatcher {
await this.folderContext.reloadPackageResolved();
// if file contents has changed then send resolve updated message
if (this.folderContext.swiftPackage.resolved?.fileHash !== packageResolvedHash) {
await this.workspaceContext.fireEvent(
this.folderContext,
FolderOperation.resolvedUpdated
);
await this.folderContext.fireEvent(FolderOperation.resolvedUpdated);
}
}

Expand All @@ -200,9 +193,6 @@ export class PackageWatcher {
*/
private async handleWorkspaceStateChange() {
await this.folderContext.reloadWorkspaceState();
await this.workspaceContext.fireEvent(
this.folderContext,
FolderOperation.workspaceStateUpdated
);
await this.folderContext.fireEvent(FolderOperation.workspaceStateUpdated);
}
}
Loading