diff --git a/package.json b/package.json index ce5f014..45cf694 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "Bazel support for Java Linting, Intellisense, formatting, refactoring and more...", "author": "Compass", "license": "BSD-3-Clause", - "version": "0.0.2", + "version": "0.0.8", "publisher": "COMP", "bugs": "https://github.com/zhirui1994/bazel-vscode-java/issues", "preview": true, diff --git a/src/extension.api.ts b/src/extension.api.ts index 876b1c3..1f26d3e 100644 --- a/src/extension.api.ts +++ b/src/extension.api.ts @@ -1,5 +1,5 @@ import { BazelProjectView } from './types'; export interface BazelVscodeExtensionAPI { - readonly parseProjectFile: BazelProjectView; + readonly parseProjectFile: BazelProjectView | undefined; } diff --git a/src/extension.ts b/src/extension.ts index 31d8c38..648e16e 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -165,7 +165,9 @@ export async function activate( ); return Promise.resolve({ - parseProjectFile: await getBazelProjectFile(), + parseProjectFile: isBazelWorkspaceRoot() + ? await getBazelProjectFile() + : undefined, }); } diff --git a/src/projectViewManager.ts b/src/projectViewManager.ts index ea50106..9a07e34 100644 --- a/src/projectViewManager.ts +++ b/src/projectViewManager.ts @@ -146,25 +146,33 @@ export namespace ProjectViewManager { .then(() => displayFolders); } + /** + * Updates the project view for a multi-root workspace. + * Adds directories from displayFolders as separate workspace folders in VSCode multi-root workspace. + * + * @param displayFolders List of directories to display + * @returns The original displayFolders list + */ function updateMultiRootProjectView( displayFolders: string[] ): Thenable { + // Build workspace folder entries array + const workspaceFolderEntries = [ + // Add workspace root directory first + { uri: Uri.file(workspaceRoot), name: workspaceRootName }, + // Convert displayFolders to workspace folder entries + ...displayFolders + // Filter out projectRootSymlinks directory (used for storing symlinks to root directory files) + .filter((f) => f !== projectRootSymlinks) + .map((f) => ({ + uri: Uri.file(`${workspaceRoot}/${f}`), + name: f.replaceAll(sep, ' ⇾ '), + })), + ]; workspace.updateWorkspaceFolders( 0, workspace.workspaceFolders?.length, - ...displayFolders.map((f) => { - if (f === projectRootSymlinks) { - return { - uri: Uri.file(projectRootSymlinks), - name: workspaceRootName, - }; - } else { - return { - uri: Uri.file(`${workspaceRoot}/${f}`), - name: f.replaceAll(sep, ' ⇾ '), - }; - } - }) + ...workspaceFolderEntries ); return Promise.resolve(displayFolders); } diff --git a/src/provider/bazelTaskProvider.ts b/src/provider/bazelTaskProvider.ts index f579773..35effcd 100644 --- a/src/provider/bazelTaskProvider.ts +++ b/src/provider/bazelTaskProvider.ts @@ -61,7 +61,13 @@ async function getBazelTasks(): Promise { const taskDefinitions: BazelTaskDefinition[] = []; // add any ij converted run targets to vscode tasks - const bazelProjectFile = await getBazelProjectFile(); + let bazelProjectFile; + try { + bazelProjectFile = await getBazelProjectFile(); + } catch { + // No .bazelproject file exists, return empty tasks + return []; + } if (bazelProjectFile.importRunConfigurations) { const rootPath = getWorkspaceRoot(); bazelProjectFile.importRunConfigurations.forEach((runConfig) => { diff --git a/src/util.ts b/src/util.ts index 20a28e5..7009087 100644 --- a/src/util.ts +++ b/src/util.ts @@ -19,10 +19,15 @@ derive_targets_from_directories: true export function getWorkspaceRoot(): string { if (workspace.workspaceFile) { - return dirname(workspace.workspaceFile.path); + let workspaceFileDir = dirname(workspace.workspaceFile.fsPath); + // If the workspace config file is in .vscode directory, go up one level to get the actual project root + if (workspaceFileDir.endsWith('.vscode')) { + workspaceFileDir = dirname(workspaceFileDir); + } + return workspaceFileDir; } else { if (workspace.workspaceFolders && workspace.workspaceFolders.length > 0) { - return workspace.workspaceFolders[0].uri.path; + return workspace.workspaceFolders[0].uri.fsPath; } } throw new Error('invalid workspace root');