Skip to content
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
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
### Fixed

- Fix the wrong toolchain being shown as selected when using swiftly v1.0.1 ([#2014](https://github.com/swiftlang/vscode-swift/pull/2014))
- Fix extension displaying SwiftPM's project view and automatic build tasks even when `disableSwiftPMIntegration` was true ([#2011](https://github.com/swiftlang/vscode-swift/pull/2011))

## 2.14.3 - 2025-12-15

Expand Down
15 changes: 8 additions & 7 deletions src/SwiftPackage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -180,10 +180,16 @@ export interface PackagePlugin {
type SwiftPackageState = PackageContents | Error | undefined;

function isPackage(state: SwiftPackageState): state is PackageContents {
if (state === undefined) {
return false;
}
return (state as PackageContents).products !== undefined;
}

function isError(state: SwiftPackageState): state is Error {
if (state === undefined) {
return false;
}
return state instanceof Error;
}

Expand Down Expand Up @@ -262,14 +268,9 @@ export class SwiftPackage {
toolchain: SwiftToolchain,
disableSwiftPMIntegration: boolean = false
): Promise<SwiftPackageState> {
// When SwiftPM integration is disabled, return empty package structure
// When SwiftPM integration is disabled, return undefined to disable all features
if (disableSwiftPMIntegration) {
return {
name: path.basename(folder.fsPath),
products: [],
dependencies: [],
targets: [],
};
return undefined;
}

try {
Expand Down
11 changes: 6 additions & 5 deletions test/integration-tests/SwiftPackage.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -81,29 +81,30 @@ tag("medium").suite("SwiftPackage Test Suite", function () {
assert.strictEqual(spmPackage.resolved.pins[0].identity, "swift-log");
});

test("Disabled SwiftPM integration returns empty package", async () => {
test("Disabled SwiftPM integration returns undefined package", async () => {
const spmPackage = await SwiftPackage.create(
testAssetUri("package2"),
toolchain,
true // disableSwiftPMIntegration
);
assert.strictEqual(await spmPackage.isValid, true);
assert.strictEqual(await spmPackage.name, "package2"); // derived from folder name
assert.strictEqual(await spmPackage.isValid, false);
assert.strictEqual(await spmPackage.foundPackage, false);
assert.strictEqual((await spmPackage.executableProducts).length, 0);
assert.strictEqual((await spmPackage.libraryProducts).length, 0);
assert.strictEqual((await spmPackage.dependencies).length, 0);
assert.strictEqual((await spmPackage.targets).length, 0);
});

test("Reload with disabled SwiftPM integration returns empty package", async () => {
test("Reload with disabled SwiftPM integration returns undefined package", async () => {
const spmPackage = await SwiftPackage.create(testAssetUri("package2"), toolchain, false);
// First verify it loaded normally
assert.strictEqual(await spmPackage.isValid, true);
assert.strictEqual((await spmPackage.libraryProducts).length, 1);

// Now reload with disabled integration
await spmPackage.reload(toolchain, true);
assert.strictEqual(await spmPackage.isValid, true);
assert.strictEqual(await spmPackage.isValid, false);
assert.strictEqual(await spmPackage.foundPackage, false);
assert.strictEqual((await spmPackage.libraryProducts).length, 0);
assert.strictEqual((await spmPackage.dependencies).length, 0);
assert.strictEqual((await spmPackage.targets).length, 0);
Expand Down