diff options
author | Kirill Bulatov <[email protected]> | 2021-05-23 14:22:13 +0100 |
---|---|---|
committer | Kirill Bulatov <[email protected]> | 2021-05-23 20:46:20 +0100 |
commit | b3383b06614e5f302a3afa2fc2c177303b5b6ca8 (patch) | |
tree | ecd109a689bdfd2885e1bd8ebcd181b2e98b4783 /editors/code | |
parent | d9a5490646f68efdb70f84713d3a418a2b2a0b00 (diff) |
Send detached files info to server via init params
Diffstat (limited to 'editors/code')
-rw-r--r-- | editors/code/src/client.ts | 15 | ||||
-rw-r--r-- | editors/code/src/ctx.ts | 14 | ||||
-rw-r--r-- | editors/code/src/main.ts | 4 |
3 files changed, 27 insertions, 6 deletions
diff --git a/editors/code/src/client.ts b/editors/code/src/client.ts index 131a2f19a..cb8beb343 100644 --- a/editors/code/src/client.ts +++ b/editors/code/src/client.ts | |||
@@ -4,6 +4,7 @@ import * as ra from '../src/lsp_ext'; | |||
4 | import * as Is from 'vscode-languageclient/lib/common/utils/is'; | 4 | import * as Is from 'vscode-languageclient/lib/common/utils/is'; |
5 | import { assert } from './util'; | 5 | import { assert } from './util'; |
6 | import { WorkspaceEdit } from 'vscode'; | 6 | import { WorkspaceEdit } from 'vscode'; |
7 | import { Workspace } from './ctx'; | ||
7 | 8 | ||
8 | export interface Env { | 9 | export interface Env { |
9 | [name: string]: string; | 10 | [name: string]: string; |
@@ -23,7 +24,7 @@ function renderHoverActions(actions: ra.CommandLinkGroup[]): vscode.MarkdownStri | |||
23 | return result; | 24 | return result; |
24 | } | 25 | } |
25 | 26 | ||
26 | export function createClient(serverPath: string, cwd: string | undefined, extraEnv: Env): lc.LanguageClient { | 27 | export function createClient(serverPath: string, workspace: Workspace, extraEnv: Env): lc.LanguageClient { |
27 | // '.' Is the fallback if no folder is open | 28 | // '.' Is the fallback if no folder is open |
28 | // TODO?: Workspace folders support Uri's (eg: file://test.txt). | 29 | // TODO?: Workspace folders support Uri's (eg: file://test.txt). |
29 | // It might be a good idea to test if the uri points to a file. | 30 | // 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 | |||
31 | const newEnv = Object.assign({}, process.env); | 32 | const newEnv = Object.assign({}, process.env); |
32 | Object.assign(newEnv, extraEnv); | 33 | Object.assign(newEnv, extraEnv); |
33 | 34 | ||
35 | let cwd = undefined; | ||
36 | if (workspace.kind == "Workspace Folder") { | ||
37 | cwd = workspace.folder.fsPath; | ||
38 | }; | ||
39 | |||
34 | const run: lc.Executable = { | 40 | const run: lc.Executable = { |
35 | command: serverPath, | 41 | command: serverPath, |
36 | options: { cwd, env: newEnv }, | 42 | options: { cwd, env: newEnv }, |
@@ -43,9 +49,14 @@ export function createClient(serverPath: string, cwd: string | undefined, extraE | |||
43 | 'Rust Analyzer Language Server Trace', | 49 | 'Rust Analyzer Language Server Trace', |
44 | ); | 50 | ); |
45 | 51 | ||
52 | let initializationOptions = vscode.workspace.getConfiguration("rust-analyzer"); | ||
53 | if (workspace.kind == "Detached files") { | ||
54 | initializationOptions = { "detachedFiles": workspace.files.map(file => file.uri.fsPath), ...initializationOptions }; | ||
55 | } | ||
56 | |||
46 | const clientOptions: lc.LanguageClientOptions = { | 57 | const clientOptions: lc.LanguageClientOptions = { |
47 | documentSelector: [{ scheme: 'file', language: 'rust' }], | 58 | documentSelector: [{ scheme: 'file', language: 'rust' }], |
48 | initializationOptions: vscode.workspace.getConfiguration("rust-analyzer"), | 59 | initializationOptions, |
49 | diagnosticCollectionName: "rustc", | 60 | diagnosticCollectionName: "rustc", |
50 | traceOutputChannel, | 61 | traceOutputChannel, |
51 | middleware: { | 62 | middleware: { |
diff --git a/editors/code/src/ctx.ts b/editors/code/src/ctx.ts index 9d8620823..dbfb9c6a1 100644 --- a/editors/code/src/ctx.ts +++ b/editors/code/src/ctx.ts | |||
@@ -7,6 +7,16 @@ import { createClient } from './client'; | |||
7 | import { isRustEditor, RustEditor } from './util'; | 7 | import { isRustEditor, RustEditor } from './util'; |
8 | import { ServerStatusParams } from './lsp_ext'; | 8 | import { ServerStatusParams } from './lsp_ext'; |
9 | 9 | ||
10 | export type Workspace = | ||
11 | { | ||
12 | kind: 'Workspace Folder', | ||
13 | folder: vscode.Uri, | ||
14 | } | ||
15 | | { | ||
16 | kind: 'Detached files', | ||
17 | files: vscode.TextDocument[], | ||
18 | }; | ||
19 | |||
10 | export class Ctx { | 20 | export class Ctx { |
11 | private constructor( | 21 | private constructor( |
12 | readonly config: Config, | 22 | readonly config: Config, |
@@ -22,9 +32,9 @@ export class Ctx { | |||
22 | config: Config, | 32 | config: Config, |
23 | extCtx: vscode.ExtensionContext, | 33 | extCtx: vscode.ExtensionContext, |
24 | serverPath: string, | 34 | serverPath: string, |
25 | cwd?: string, | 35 | workspace: Workspace, |
26 | ): Promise<Ctx> { | 36 | ): Promise<Ctx> { |
27 | const client = createClient(serverPath, cwd, config.serverExtraEnv); | 37 | const client = createClient(serverPath, workspace, config.serverExtraEnv); |
28 | 38 | ||
29 | const statusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left); | 39 | const statusBar = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left); |
30 | extCtx.subscriptions.push(statusBar); | 40 | extCtx.subscriptions.push(statusBar); |
diff --git a/editors/code/src/main.ts b/editors/code/src/main.ts index f0f47a75b..1a4af548d 100644 --- a/editors/code/src/main.ts +++ b/editors/code/src/main.ts | |||
@@ -49,7 +49,7 @@ async function tryActivate(context: vscode.ExtensionContext) { | |||
49 | if (workspaceFolder === undefined) { | 49 | if (workspaceFolder === undefined) { |
50 | let rustDocuments = vscode.workspace.textDocuments.filter(document => isRustDocument(document)); | 50 | let rustDocuments = vscode.workspace.textDocuments.filter(document => isRustDocument(document)); |
51 | if (rustDocuments.length > 0) { | 51 | if (rustDocuments.length > 0) { |
52 | ctx = await Ctx.create(config, context, serverPath); | 52 | ctx = await Ctx.create(config, context, serverPath, { kind: 'Detached files', files: rustDocuments }); |
53 | } else { | 53 | } else { |
54 | throw new Error("no rust files are opened"); | 54 | throw new Error("no rust files are opened"); |
55 | } | 55 | } |
@@ -58,7 +58,7 @@ async function tryActivate(context: vscode.ExtensionContext) { | |||
58 | // registers its `onDidChangeDocument` handler before us. | 58 | // registers its `onDidChangeDocument` handler before us. |
59 | // | 59 | // |
60 | // This a horribly, horribly wrong way to deal with this problem. | 60 | // This a horribly, horribly wrong way to deal with this problem. |
61 | ctx = await Ctx.create(config, context, serverPath, workspaceFolder.uri.fsPath); | 61 | ctx = await Ctx.create(config, context, serverPath, { kind: "Workspace Folder", folder: workspaceFolder.uri }); |
62 | ctx.pushCleanup(activateTaskProvider(workspaceFolder, ctx.config)); | 62 | ctx.pushCleanup(activateTaskProvider(workspaceFolder, ctx.config)); |
63 | } | 63 | } |
64 | await initCommonContext(context, ctx); | 64 | await initCommonContext(context, ctx); |