Skip to content

Commit 20b4f0f

Browse files
aelamWang Lunaelam
authored
fixed bsp config file location issue (#1792)
* fixed bsp config file location issue * format code --------- Co-authored-by: Wang Lun <[email protected]> Co-authored-by: aelam <[email protected]>
1 parent acf5bff commit 20b4f0f

File tree

4 files changed

+76
-16
lines changed

4 files changed

+76
-16
lines changed

src/WorkspaceContext.ts

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,8 @@ export class WorkspaceContext implements vscode.Disposable {
443443
const folders = await searchForPackages(
444444
workspaceFolder.uri,
445445
configuration.disableSwiftPMIntegration,
446-
configuration.folder(workspaceFolder).searchSubfoldersForPackages
446+
configuration.folder(workspaceFolder).searchSubfoldersForPackages,
447+
this.globalToolchainSwiftVersion
447448
);
448449

449450
for (const folder of folders) {
@@ -627,7 +628,11 @@ export class WorkspaceContext implements vscode.Disposable {
627628
* Package.swift or a CMake compile_commands.json, compile_flags.txt, or a BSP buildServer.json.
628629
*/
629630
async isValidWorkspaceFolder(folder: string): Promise<boolean> {
630-
return await isValidWorkspaceFolder(folder, configuration.disableSwiftPMIntegration);
631+
return await isValidWorkspaceFolder(
632+
folder,
633+
configuration.disableSwiftPMIntegration,
634+
this.globalToolchainSwiftVersion
635+
);
631636
}
632637

633638
/** send unfocus event to current focussed folder and clear current folder */

src/utilities/workspace.ts

Lines changed: 60 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,21 +11,25 @@
1111
// SPDX-License-Identifier: Apache-2.0
1212
//
1313
//===----------------------------------------------------------------------===//
14+
import * as fs from "fs/promises";
15+
import * as path from "path";
1416
import { basename } from "path";
1517
import * as vscode from "vscode";
1618

1719
import { globDirectory, pathExists } from "./filesystem";
20+
import { Version } from "./version";
1821

1922
export async function searchForPackages(
2023
folder: vscode.Uri,
2124
disableSwiftPMIntegration: boolean,
22-
searchSubfoldersForPackages: boolean
25+
searchSubfoldersForPackages: boolean,
26+
swiftVersion: Version
2327
): Promise<Array<vscode.Uri>> {
2428
const folders: Array<vscode.Uri> = [];
2529

2630
async function search(folder: vscode.Uri) {
2731
// add folder if Package.swift/compile_commands.json/compile_flags.txt/buildServer.json exists
28-
if (await isValidWorkspaceFolder(folder.fsPath, disableSwiftPMIntegration)) {
32+
if (await isValidWorkspaceFolder(folder.fsPath, disableSwiftPMIntegration, swiftVersion)) {
2933
folders.push(folder);
3034
}
3135
// should I search sub-folders for more Swift Packages
@@ -47,16 +51,61 @@ export async function searchForPackages(
4751
return folders;
4852
}
4953

54+
export async function hasBSPConfigurationFile(
55+
folder: string,
56+
swiftVersion: Version
57+
): Promise<boolean> {
58+
// buildServer.json
59+
const buildServerPath = path.join(folder, "buildServer.json");
60+
const buildServerStat = await fs.stat(buildServerPath).catch(() => undefined);
61+
if (buildServerStat && buildServerStat.isFile()) {
62+
return true;
63+
}
64+
// .bsp/*.json for Swift >= 6.1.0
65+
if (swiftVersion.isGreaterThanOrEqual(new Version(6, 1, 0))) {
66+
const bspDir = path.join(folder, ".bsp");
67+
const bspStat = await fs.stat(bspDir).catch(() => undefined);
68+
if (bspStat && bspStat.isDirectory()) {
69+
const files = await fs.readdir(bspDir).catch(() => []);
70+
if (files.some((f: string) => f.endsWith(".json"))) {
71+
return true;
72+
}
73+
}
74+
}
75+
return false;
76+
}
77+
5078
export async function isValidWorkspaceFolder(
5179
folder: string,
52-
disableSwiftPMIntegration: boolean
80+
disableSwiftPMIntegration: boolean,
81+
swiftVersion: Version
5382
): Promise<boolean> {
54-
return (
55-
(!disableSwiftPMIntegration && (await pathExists(folder, "Package.swift"))) ||
56-
(await pathExists(folder, "compile_commands.json")) ||
57-
(await pathExists(folder, "compile_flags.txt")) ||
58-
(await pathExists(folder, "buildServer.json")) ||
59-
(await pathExists(folder, "build")) ||
60-
(await pathExists(folder, "out"))
61-
);
83+
// Check Package.swift first (most common case)
84+
if (!disableSwiftPMIntegration && (await pathExists(folder, "Package.swift"))) {
85+
return true;
86+
}
87+
88+
// Check other common build files
89+
if (await pathExists(folder, "compile_commands.json")) {
90+
return true;
91+
}
92+
93+
if (await pathExists(folder, "compile_flags.txt")) {
94+
return true;
95+
}
96+
97+
if (await pathExists(folder, "build")) {
98+
return true;
99+
}
100+
101+
if (await pathExists(folder, "out")) {
102+
return true;
103+
}
104+
105+
// Check BSP configuration last (potentially more expensive)
106+
if (await hasBSPConfigurationFile(folder, swiftVersion)) {
107+
return true;
108+
}
109+
110+
return false;
62111
}

test/integration-tests/utilities/workspace.test.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,19 @@
1414
import { expect } from "chai";
1515
import * as vscode from "vscode";
1616

17+
import { Version } from "@src/utilities/version";
1718
import { searchForPackages } from "@src/utilities/workspace";
1819

1920
suite("Workspace Utilities Test Suite", () => {
2021
suite("searchForPackages", () => {
22+
const testSwiftVersion = new Version(5, 9, 0);
23+
2124
test("ignores excluded file", async () => {
2225
const folders = await searchForPackages(
2326
(vscode.workspace.workspaceFolders ?? [])[0]!.uri,
2427
false,
25-
true
28+
true,
29+
testSwiftVersion
2630
);
2731

2832
expect(folders.find(f => f.fsPath.includes("defaultPackage"))).to.not.be.undefined;

test/unit-tests/utilities/workspace.test.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import { expect } from "chai";
1515
import * as vscode from "vscode";
1616

17+
import { Version } from "@src/utilities/version";
1718
import { searchForPackages } from "@src/utilities/workspace";
1819

1920
import { testAssetUri } from "../../fixtures";
@@ -23,15 +24,16 @@ suite("Workspace Utilities Unit Test Suite", () => {
2324
const packageFolder = testAssetUri("ModularPackage");
2425
const firstModuleFolder = vscode.Uri.joinPath(packageFolder, "Module1");
2526
const secondModuleFolder = vscode.Uri.joinPath(packageFolder, "Module2");
27+
const testSwiftVersion = new Version(5, 9, 0);
2628

2729
test("returns only root package when search for subpackages disabled", async () => {
28-
const folders = await searchForPackages(packageFolder, false, false);
30+
const folders = await searchForPackages(packageFolder, false, false, testSwiftVersion);
2931

3032
expect(folders.map(folder => folder.fsPath)).eql([packageFolder.fsPath]);
3133
});
3234

3335
test("returns subpackages when search for subpackages enabled", async () => {
34-
const folders = await searchForPackages(packageFolder, false, true);
36+
const folders = await searchForPackages(packageFolder, false, true, testSwiftVersion);
3537

3638
expect(folders.map(folder => folder.fsPath).sort()).deep.equal([
3739
packageFolder.fsPath,

0 commit comments

Comments
 (0)