diff --git a/packages/metals-vscode/src/debugger/scalaDebugger.ts b/packages/metals-vscode/src/debugger/scalaDebugger.ts index cf7212909..3dff88bb3 100644 --- a/packages/metals-vscode/src/debugger/scalaDebugger.ts +++ b/packages/metals-vscode/src/debugger/scalaDebugger.ts @@ -6,7 +6,6 @@ import { WorkspaceFolder, DebugAdapterDescriptor, DebugConfigurationProviderTriggerKind, - workspace, tasks, Task, ShellExecution, @@ -18,6 +17,7 @@ import { } from "metals-languageclient"; import { ExtendedScalaRunMain, ScalaCodeLensesParams } from "./types"; import { platform } from "os"; +import { currentWorkspace } from "../util"; const configurationType = "scala"; @@ -67,7 +67,8 @@ function platformSpecificOptions(): vscode.ShellExecutionOptions { async function runMain(main: ExtendedScalaRunMain): Promise { const { environmentVariables, shellCommand } = main.data; - if (workspace.workspaceFolders) { + const workspaceFolder = currentWorkspace(); + if (workspaceFolder) { const env = environmentVariables.reduce>( (acc, envKeyValue) => { const [key, value] = envKeyValue.split("="); @@ -79,7 +80,7 @@ async function runMain(main: ExtendedScalaRunMain): Promise { const shellOptions = { ...platformSpecificOptions(), env }; const task = new Task( { type: "scala", task: "run" }, - workspace.workspaceFolders[0], + workspaceFolder, "Scala run", "Metals", new ShellExecution(shellCommand, shellOptions) diff --git a/packages/metals-vscode/src/extension.ts b/packages/metals-vscode/src/extension.ts index 1755c0174..aad9c576e 100644 --- a/packages/metals-vscode/src/extension.ts +++ b/packages/metals-vscode/src/extension.ts @@ -80,6 +80,7 @@ import { import * as ext from "./hoverExtension"; import { decodeAndShowFile, MetalsFileProvider } from "./metalsContentProvider"; import { + currentWorkspace, getJavaHomeFromConfig, getTextDocumentPositionParams, getValueFromConfig, @@ -959,7 +960,7 @@ function launchMetals( }); }); - const workspaceUri = workspace.workspaceFolders?.[0]?.uri; + const workspaceUri = currentWorkspace()?.uri; // NOTE: we offer a custom symbol search command to work around the limitations of the built-in one, see https://github.com/microsoft/vscode/issues/98125 for more details. registerCommand(`metals.symbol-search`, () => openSymbolSearch(client, metalsFileProvider, workspaceUri) diff --git a/packages/metals-vscode/src/util.ts b/packages/metals-vscode/src/util.ts index 5bc3c6e58..75f398742 100644 --- a/packages/metals-vscode/src/util.ts +++ b/packages/metals-vscode/src/util.ts @@ -1,10 +1,12 @@ import * as path from "path"; import os from "os"; import { - workspace, TextEditor, WorkspaceConfiguration, ConfigurationTarget, + window, + workspace, + WorkspaceFolder, } from "vscode"; import { ExecuteCommandRequest, @@ -48,14 +50,29 @@ export function getConfigValue( } export function metalsDir(target: ConfigurationTarget): string { - if (target == ConfigurationTarget.Workspace && workspace.workspaceFolders) { - const wsDir = workspace.workspaceFolders[0]?.uri.fsPath; + const workspaceFolder = currentWorkspace(); + if (target == ConfigurationTarget.Workspace && workspaceFolder) { + const wsDir = workspaceFolder.uri.fsPath; return path.join(wsDir, ".metals"); } else { return path.join(os.homedir(), ".metals"); } } +export function currentWorkspace(): WorkspaceFolder | undefined { + const activeEditor = window.activeTextEditor; + let workspaceIndex = 0; + if (activeEditor) { + const workspaceFolder = workspace.getWorkspaceFolder( + activeEditor.document.uri + ); + if (workspaceFolder) { + workspaceIndex = workspaceFolder.index; + } + } + return workspace.workspaceFolders?.[workspaceIndex]; +} + export function getTextDocumentPositionParams( editor: TextEditor ): TextDocumentPositionParams {