Send detached files info to server via init params

This commit is contained in:
Kirill Bulatov 2021-05-23 16:22:13 +03:00
parent d9a5490646
commit b3383b0661
3 changed files with 27 additions and 6 deletions

View File

@ -4,6 +4,7 @@ import * as ra from '../src/lsp_ext';
import * as Is from 'vscode-languageclient/lib/common/utils/is';
import { assert } from './util';
import { WorkspaceEdit } from 'vscode';
import { Workspace } from './ctx';
export interface Env {
[name: string]: string;
@ -23,7 +24,7 @@ function renderHoverActions(actions: ra.CommandLinkGroup[]): vscode.MarkdownStri
return result;
}
export function createClient(serverPath: string, cwd: string | undefined, extraEnv: Env): lc.LanguageClient {
export function createClient(serverPath: string, workspace: Workspace, extraEnv: Env): lc.LanguageClient {
// '.' Is the fallback if no folder is open
// TODO?: Workspace folders support Uri's (eg: file://test.txt).
// It might be a good idea to test if the uri points to a file.
@ -31,6 +32,11 @@ export function createClient(serverPath: string, cwd: string | undefined, extraE
const newEnv = Object.assign({}, process.env);
Object.assign(newEnv, extraEnv);
let cwd = undefined;
if (workspace.kind == "Workspace Folder") {
cwd = workspace.folder.fsPath;
};
const run: lc.Executable = {
command: serverPath,
options: { cwd, env: newEnv },
@ -43,9 +49,14 @@ export function createClient(serverPath: string, cwd: string | undefined, extraE
'Rust Analyzer Language Server Trace',
);
let initializationOptions = vscode.workspace.getConfiguration("rust-analyzer");
if (workspace.kind == "Detached files") {
initializationOptions = { "detachedFiles": workspace.files.map(file => file.uri.fsPath), ...initializationOptions };
}
const clientOptions: lc.LanguageClientOptions = {
documentSelector: [{ scheme: 'file', language: 'rust' }],
initializationOptions: vscode.workspace.getConfiguration("rust-analyzer"),
initializationOptions,
diagnosticCollectionName: "rustc",
traceOutputChannel,
middleware: {

View File

@ -7,6 +7,16 @@ import { createClient } from './client';
import { isRustEditor, RustEditor } from './util';
import { ServerStatusParams } from './lsp_ext';
export type Workspace =
{
kind: 'Workspace Folder',
folder: vscode.Uri,
}
| {
kind: 'Detached files',
files: vscode.TextDocument[],
};
export class Ctx {
private constructor(
readonly config: Config,
@ -22,9 +32,9 @@ export class Ctx {
config: Config,
extCtx: vscode.ExtensionContext,
serverPath: string,
cwd?: string,
workspace: Workspace,
): Promise<Ctx> {
const client = createClient(serverPath, cwd, config.serverExtraEnv);
const client = createClient(serverPath, workspace, config.serverExtraEnv);
const statusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left);
extCtx.subscriptions.push(statusBar);

View File

@ -49,7 +49,7 @@ async function tryActivate(context: vscode.ExtensionContext) {
if (workspaceFolder === undefined) {
let rustDocuments = vscode.workspace.textDocuments.filter(document => isRustDocument(document));
if (rustDocuments.length > 0) {
ctx = await Ctx.create(config, context, serverPath);
ctx = await Ctx.create(config, context, serverPath, { kind: 'Detached files', files: rustDocuments });
} else {
throw new Error("no rust files are opened");
}
@ -58,7 +58,7 @@ async function tryActivate(context: vscode.ExtensionContext) {
// registers its `onDidChangeDocument` handler before us.
//
// This a horribly, horribly wrong way to deal with this problem.
ctx = await Ctx.create(config, context, serverPath, workspaceFolder.uri.fsPath);
ctx = await Ctx.create(config, context, serverPath, { kind: "Workspace Folder", folder: workspaceFolder.uri });
ctx.pushCleanup(activateTaskProvider(workspaceFolder, ctx.config));
}
await initCommonContext(context, ctx);