1
1
import * as vscode from 'vscode' ;
2
2
import * as lc from 'vscode-languageclient' ;
3
+ import * as ra from './lsp_ext' ;
3
4
4
5
import { Config } from './config' ;
5
6
import { createClient } from './client' ;
6
7
import { isRustEditor , RustEditor } from './util' ;
8
+ import { Status } from './lsp_ext' ;
7
9
8
10
export class Ctx {
9
11
private constructor (
10
12
readonly config : Config ,
11
13
private readonly extCtx : vscode . ExtensionContext ,
12
14
readonly client : lc . LanguageClient ,
13
15
readonly serverPath : string ,
16
+ readonly statusBar : vscode . StatusBarItem ,
14
17
) {
15
18
16
19
}
@@ -22,9 +25,18 @@ export class Ctx {
22
25
cwd : string ,
23
26
) : Promise < Ctx > {
24
27
const client = createClient ( serverPath , cwd ) ;
25
- const res = new Ctx ( config , extCtx , client , serverPath ) ;
28
+
29
+ const statusBar = vscode . window . createStatusBarItem ( vscode . StatusBarAlignment . Left ) ;
30
+ extCtx . subscriptions . push ( statusBar ) ;
31
+ statusBar . text = "rust-analyzer" ;
32
+ statusBar . tooltip = "ready" ;
33
+ statusBar . show ( ) ;
34
+
35
+ const res = new Ctx ( config , extCtx , client , serverPath , statusBar ) ;
36
+
26
37
res . pushCleanup ( client . start ( ) ) ;
27
38
await client . onReady ( ) ;
39
+ client . onNotification ( ra . status , ( status ) => res . setStatus ( status ) ) ;
28
40
return res ;
29
41
}
30
42
@@ -54,6 +66,35 @@ export class Ctx {
54
66
return this . extCtx . subscriptions ;
55
67
}
56
68
69
+ setStatus ( status : Status ) {
70
+ switch ( status ) {
71
+ case "loading" :
72
+ this . statusBar . text = "$(sync~spin) rust-analyzer" ;
73
+ this . statusBar . tooltip = "Loading the project" ;
74
+ this . statusBar . command = undefined ;
75
+ this . statusBar . color = undefined ;
76
+ break ;
77
+ case "ready" :
78
+ this . statusBar . text = "rust-analyzer" ;
79
+ this . statusBar . tooltip = "Ready" ;
80
+ this . statusBar . command = undefined ;
81
+ this . statusBar . color = undefined ;
82
+ break ;
83
+ case "invalid" :
84
+ this . statusBar . text = "$(error) rust-analyzer" ;
85
+ this . statusBar . tooltip = "Failed to load the project" ;
86
+ this . statusBar . command = undefined ;
87
+ this . statusBar . color = new vscode . ThemeColor ( "notificationsErrorIcon.foreground" ) ;
88
+ break ;
89
+ case "needsReload" :
90
+ this . statusBar . text = "$(warning) rust-analyzer" ;
91
+ this . statusBar . tooltip = "Click to reload" ;
92
+ this . statusBar . command = "rust-analyzer.reloadWorkspace" ;
93
+ this . statusBar . color = new vscode . ThemeColor ( "notificationsWarningIcon.foreground" ) ;
94
+ break ;
95
+ }
96
+ }
97
+
57
98
pushCleanup ( d : Disposable ) {
58
99
this . extCtx . subscriptions . push ( d ) ;
59
100
}
0 commit comments