mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-25 16:24:46 +00:00
Send detached files info to server via init params
This commit is contained in:
parent
d9a5490646
commit
b3383b0661
@ -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: {
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user