diff --git a/src/cm/lsp/clientManager.ts b/src/cm/lsp/clientManager.ts index fce8e1950..94ecd40cf 100644 --- a/src/cm/lsp/clientManager.ts +++ b/src/cm/lsp/clientManager.ts @@ -178,8 +178,11 @@ function connectClient( client: ExtendedLSPClient, transport: Transport, initializationOptions?: Record, + rootUri?: string | null, ): void { - if (!initializationOptions || !Object.keys(initializationOptions).length) { + const hasInitializationOptions = + !!initializationOptions && Object.keys(initializationOptions).length > 0; + if (!hasInitializationOptions && !rootUri) { client.connect(transport); return; } @@ -199,7 +202,14 @@ function connectClient( if (method === "initialize" && isPlainObject(params)) { params = { ...params, - initializationOptions, + ...(hasInitializationOptions ? { initializationOptions } : {}), + ...(rootUri + ? { + workspaceFolders: [ + { uri: rootUri, name: workspaceName(rootUri) }, + ], + } + : {}), } as Params; } return originalRequestInner(method, params, mapped); @@ -212,6 +222,16 @@ function connectClient( } } +function workspaceName(rootUri: string): string { + const trimmed = rootUri.replace(/\/+$/, ""); + const encodedName = trimmed.slice(trimmed.lastIndexOf("/") + 1); + try { + return decodeURIComponent(encodedName) || "workspace"; + } catch { + return encodedName || "workspace"; + } +} + interface BuiltinExtensionsResult { extensions: Extension[]; diagnosticsExtension: Extension | LSPClientExtension | null; @@ -764,6 +784,7 @@ export class LspClientManager { }, workspace: { configuration: true, + workspaceFolders: true, }, }, }; @@ -1010,7 +1031,14 @@ export class LspClientManager { await waitForInitialization(transportHandle.ready, signal, server.id); client = new LSPClient(clientConfig) as ExtendedLSPClient; client.__acodeServerId = server.id; - connectClient(client, transportHandle.transport, initializationOptions); + connectClient( + client, + transportHandle.transport, + initializationOptions, + scope === "workspace" && server.useWorkspaceFolders + ? null + : normalizedRootUri, + ); await waitForInitialization(client.initializing, signal, server.id); if (!client.__acodeLoggedInfo) { // Log root URI info to console @@ -1032,7 +1060,13 @@ export class LspClientManager { ); } logLspInfo(`[LSP:${server.id}] initialized`); - addLspLog(server.id, "info", "Initialized"); + addLspLog( + server.id, + "info", + normalizedRootUri + ? `Initialized workspace ${normalizedRootUri}` + : "Initialized without a workspace root", + ); client.__acodeLoggedInfo = true; } } catch (error) {