diff options
Diffstat (limited to 'editors/code/src')
-rw-r--r-- | editors/code/src/client.ts | 6 | ||||
-rw-r--r-- | editors/code/src/commands/analyzer_status.ts | 4 | ||||
-rw-r--r-- | editors/code/src/commands/expand_macro.ts | 4 | ||||
-rw-r--r-- | editors/code/src/commands/syntax_tree.ts | 4 | ||||
-rw-r--r-- | editors/code/src/ctx.ts | 39 | ||||
-rw-r--r-- | editors/code/src/inlay_hints.ts | 2 | ||||
-rw-r--r-- | editors/code/src/main.ts | 18 |
7 files changed, 26 insertions, 51 deletions
diff --git a/editors/code/src/client.ts b/editors/code/src/client.ts index 11894973c..aaf2ef40e 100644 --- a/editors/code/src/client.ts +++ b/editors/code/src/client.ts | |||
@@ -2,18 +2,14 @@ import * as lc from 'vscode-languageclient'; | |||
2 | import * as vscode from 'vscode'; | 2 | import * as vscode from 'vscode'; |
3 | 3 | ||
4 | import { Config } from './config'; | 4 | import { Config } from './config'; |
5 | import { ensureServerBinary } from './installation/server'; | ||
6 | import { CallHierarchyFeature } from 'vscode-languageclient/lib/callHierarchy.proposed'; | 5 | import { CallHierarchyFeature } from 'vscode-languageclient/lib/callHierarchy.proposed'; |
7 | 6 | ||
8 | export async function createClient(config: Config): Promise<null | lc.LanguageClient> { | 7 | export async function createClient(config: Config, serverPath: string): Promise<lc.LanguageClient> { |
9 | // '.' Is the fallback if no folder is open | 8 | // '.' Is the fallback if no folder is open |
10 | // TODO?: Workspace folders support Uri's (eg: file://test.txt). | 9 | // TODO?: Workspace folders support Uri's (eg: file://test.txt). |
11 | // It might be a good idea to test if the uri points to a file. | 10 | // It might be a good idea to test if the uri points to a file. |
12 | const workspaceFolderPath = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath ?? '.'; | 11 | const workspaceFolderPath = vscode.workspace.workspaceFolders?.[0]?.uri.fsPath ?? '.'; |
13 | 12 | ||
14 | const serverPath = await ensureServerBinary(config.serverSource); | ||
15 | if (!serverPath) return null; | ||
16 | |||
17 | const run: lc.Executable = { | 13 | const run: lc.Executable = { |
18 | command: serverPath, | 14 | command: serverPath, |
19 | options: { cwd: workspaceFolderPath }, | 15 | options: { cwd: workspaceFolderPath }, |
diff --git a/editors/code/src/commands/analyzer_status.ts b/editors/code/src/commands/analyzer_status.ts index cfe7d1af0..6631e8db7 100644 --- a/editors/code/src/commands/analyzer_status.ts +++ b/editors/code/src/commands/analyzer_status.ts | |||
@@ -37,12 +37,10 @@ export function analyzerStatus(ctx: Ctx): Cmd { | |||
37 | 37 | ||
38 | class TextDocumentContentProvider | 38 | class TextDocumentContentProvider |
39 | implements vscode.TextDocumentContentProvider { | 39 | implements vscode.TextDocumentContentProvider { |
40 | private ctx: Ctx; | ||
41 | uri = vscode.Uri.parse('rust-analyzer-status://status'); | 40 | uri = vscode.Uri.parse('rust-analyzer-status://status'); |
42 | eventEmitter = new vscode.EventEmitter<vscode.Uri>(); | 41 | eventEmitter = new vscode.EventEmitter<vscode.Uri>(); |
43 | 42 | ||
44 | constructor(ctx: Ctx) { | 43 | constructor(private readonly ctx: Ctx) { |
45 | this.ctx = ctx; | ||
46 | } | 44 | } |
47 | 45 | ||
48 | provideTextDocumentContent( | 46 | provideTextDocumentContent( |
diff --git a/editors/code/src/commands/expand_macro.ts b/editors/code/src/commands/expand_macro.ts index dcdde78af..6fee6eb41 100644 --- a/editors/code/src/commands/expand_macro.ts +++ b/editors/code/src/commands/expand_macro.ts | |||
@@ -42,12 +42,10 @@ function code_format(expanded: ExpandedMacro): string { | |||
42 | 42 | ||
43 | class TextDocumentContentProvider | 43 | class TextDocumentContentProvider |
44 | implements vscode.TextDocumentContentProvider { | 44 | implements vscode.TextDocumentContentProvider { |
45 | private ctx: Ctx; | ||
46 | uri = vscode.Uri.parse('rust-analyzer://expandMacro/[EXPANSION].rs'); | 45 | uri = vscode.Uri.parse('rust-analyzer://expandMacro/[EXPANSION].rs'); |
47 | eventEmitter = new vscode.EventEmitter<vscode.Uri>(); | 46 | eventEmitter = new vscode.EventEmitter<vscode.Uri>(); |
48 | 47 | ||
49 | constructor(ctx: Ctx) { | 48 | constructor(private readonly ctx: Ctx) { |
50 | this.ctx = ctx; | ||
51 | } | 49 | } |
52 | 50 | ||
53 | async provideTextDocumentContent(_uri: vscode.Uri): Promise<string> { | 51 | async provideTextDocumentContent(_uri: vscode.Uri): Promise<string> { |
diff --git a/editors/code/src/commands/syntax_tree.ts b/editors/code/src/commands/syntax_tree.ts index 7dde66ad1..2887c96c8 100644 --- a/editors/code/src/commands/syntax_tree.ts +++ b/editors/code/src/commands/syntax_tree.ts | |||
@@ -68,12 +68,10 @@ interface SyntaxTreeParams { | |||
68 | 68 | ||
69 | class TextDocumentContentProvider | 69 | class TextDocumentContentProvider |
70 | implements vscode.TextDocumentContentProvider { | 70 | implements vscode.TextDocumentContentProvider { |
71 | private ctx: Ctx; | ||
72 | uri = vscode.Uri.parse('rust-analyzer://syntaxtree'); | 71 | uri = vscode.Uri.parse('rust-analyzer://syntaxtree'); |
73 | eventEmitter = new vscode.EventEmitter<vscode.Uri>(); | 72 | eventEmitter = new vscode.EventEmitter<vscode.Uri>(); |
74 | 73 | ||
75 | constructor(ctx: Ctx) { | 74 | constructor(private readonly ctx: Ctx) { |
76 | this.ctx = ctx; | ||
77 | } | 75 | } |
78 | 76 | ||
79 | provideTextDocumentContent(uri: vscode.Uri): vscode.ProviderResult<string> { | 77 | provideTextDocumentContent(uri: vscode.Uri): vscode.ProviderResult<string> { |
diff --git a/editors/code/src/ctx.ts b/editors/code/src/ctx.ts index c06d8ac31..dfc8aa7b9 100644 --- a/editors/code/src/ctx.ts +++ b/editors/code/src/ctx.ts | |||
@@ -1,43 +1,24 @@ | |||
1 | import * as vscode from 'vscode'; | 1 | import * as vscode from 'vscode'; |
2 | import * as lc from 'vscode-languageclient'; | 2 | import * as lc from 'vscode-languageclient'; |
3 | import { strict as assert } from "assert"; | ||
4 | 3 | ||
5 | import { Config } from './config'; | 4 | import { Config } from './config'; |
6 | import { createClient } from './client'; | 5 | import { createClient } from './client'; |
7 | 6 | ||
8 | export class Ctx { | 7 | export class Ctx { |
9 | readonly config: Config; | 8 | private constructor( |
10 | // Because we have "reload server" action, various listeners **will** face a | 9 | readonly config: Config, |
11 | // situation where the client is not ready yet, and should be prepared to | 10 | private readonly extCtx: vscode.ExtensionContext, |
12 | // deal with it. | 11 | readonly client: lc.LanguageClient |
13 | // | 12 | ) { |
14 | // Ideally, this should be replaced with async getter though. | ||
15 | // FIXME: this actually needs syncronization of some kind (check how | ||
16 | // vscode deals with `deactivate()` call when extension has some work scheduled | ||
17 | // on the event loop to get a better picture of what we can do here) | ||
18 | client: lc.LanguageClient | null = null; | ||
19 | private extCtx: vscode.ExtensionContext; | ||
20 | 13 | ||
21 | constructor(extCtx: vscode.ExtensionContext) { | ||
22 | this.config = new Config(extCtx); | ||
23 | this.extCtx = extCtx; | ||
24 | } | 14 | } |
25 | 15 | ||
26 | async startServer() { | 16 | static async create(config: Config, extCtx: vscode.ExtensionContext, serverPath: string): Promise<Ctx> { |
27 | assert(this.client == null); | 17 | const client = await createClient(config, serverPath); |
28 | 18 | const res = new Ctx(config, extCtx, client); | |
29 | const client = await createClient(this.config); | 19 | res.pushCleanup(client.start()); |
30 | if (!client) { | ||
31 | throw new Error( | ||
32 | "Rust Analyzer Language Server is not available. " + | ||
33 | "Please, ensure its [proper installation](https://github.com/rust-analyzer/rust-analyzer/tree/master/docs/user#vs-code)." | ||
34 | ); | ||
35 | } | ||
36 | |||
37 | this.pushCleanup(client.start()); | ||
38 | await client.onReady(); | 20 | await client.onReady(); |
39 | 21 | return res; | |
40 | this.client = client; | ||
41 | } | 22 | } |
42 | 23 | ||
43 | get activeRustEditor(): vscode.TextEditor | undefined { | 24 | get activeRustEditor(): vscode.TextEditor | undefined { |
diff --git a/editors/code/src/inlay_hints.ts b/editors/code/src/inlay_hints.ts index 55bbd7f00..f82df66ae 100644 --- a/editors/code/src/inlay_hints.ts +++ b/editors/code/src/inlay_hints.ts | |||
@@ -92,8 +92,6 @@ class HintsUpdater { | |||
92 | 92 | ||
93 | async refresh() { | 93 | async refresh() { |
94 | if (!this.enabled) return; | 94 | if (!this.enabled) return; |
95 | console.log("freshin!"); | ||
96 | |||
97 | await Promise.all(this.allEditors.map(it => this.refreshEditor(it))); | 95 | await Promise.all(this.allEditors.map(it => this.refreshEditor(it))); |
98 | } | 96 | } |
99 | 97 | ||
diff --git a/editors/code/src/main.ts b/editors/code/src/main.ts index 0bf2c4829..0ad7ef1bb 100644 --- a/editors/code/src/main.ts +++ b/editors/code/src/main.ts | |||
@@ -5,21 +5,27 @@ import { activateInlayHints } from './inlay_hints'; | |||
5 | import { activateStatusDisplay } from './status_display'; | 5 | import { activateStatusDisplay } from './status_display'; |
6 | import { Ctx } from './ctx'; | 6 | import { Ctx } from './ctx'; |
7 | import { activateHighlighting } from './highlighting'; | 7 | import { activateHighlighting } from './highlighting'; |
8 | import { ensureServerBinary } from './installation/server'; | ||
9 | import { Config } from './config'; | ||
8 | 10 | ||
9 | let ctx: Ctx | undefined; | 11 | let ctx: Ctx | undefined; |
10 | 12 | ||
11 | export async function activate(context: vscode.ExtensionContext) { | 13 | export async function activate(context: vscode.ExtensionContext) { |
12 | ctx = new Ctx(context); | 14 | const config = new Config(context) |
15 | |||
16 | const serverPath = await ensureServerBinary(config.serverSource); | ||
17 | if (serverPath == null) { | ||
18 | throw new Error( | ||
19 | "Rust Analyzer Language Server is not available. " + | ||
20 | "Please, ensure its [proper installation](https://rust-analyzer.github.io/manual.html#installation)." | ||
21 | ); | ||
22 | } | ||
13 | 23 | ||
14 | // Note: we try to start the server before we activate type hints so that it | 24 | // Note: we try to start the server before we activate type hints so that it |
15 | // registers its `onDidChangeDocument` handler before us. | 25 | // registers its `onDidChangeDocument` handler before us. |
16 | // | 26 | // |
17 | // This a horribly, horribly wrong way to deal with this problem. | 27 | // This a horribly, horribly wrong way to deal with this problem. |
18 | try { | 28 | ctx = await Ctx.create(config, context, serverPath); |
19 | await ctx.startServer(); | ||
20 | } catch (e) { | ||
21 | vscode.window.showErrorMessage(e.message); | ||
22 | } | ||
23 | 29 | ||
24 | // Commands which invokes manually via command palette, shortcut, etc. | 30 | // Commands which invokes manually via command palette, shortcut, etc. |
25 | ctx.registerCommand('reload', (ctx) => { | 31 | ctx.registerCommand('reload', (ctx) => { |