@@ -3,17 +3,19 @@ use lsp_server::{
3
3
} ;
4
4
use lsp_types:: {
5
5
notification:: {
6
- DidChangeTextDocument , DidOpenTextDocument , DidSaveTextDocument ,
7
- Notification as NotificationTrait , PublishDiagnostics ,
6
+ DidOpenTextDocument , DidSaveTextDocument , Notification as NotificationTrait ,
7
+ PublishDiagnostics ,
8
8
} ,
9
- request:: GotoDefinition ,
10
- CodeActionProviderCapability , Diagnostic , DiagnosticOptions , GotoDefinitionResponse ,
11
- InitializedParams , Location , Position , PublishDiagnosticsParams , Range , ServerCapabilities ,
12
- Url ,
9
+ request:: { CodeActionRequest , GotoDefinition } ,
10
+ CodeAction , CodeActionKind , CodeActionOrCommand , CodeActionProviderCapability ,
11
+ CodeActionResponse , Diagnostic , DiagnosticOptions , GotoDefinitionResponse , InitializedParams ,
12
+ Location , OneOf , Position , PublishDiagnosticsParams , Range , ServerCapabilities , Url ,
13
+ WorkDoneProgressOptions ,
13
14
} ;
15
+ use serde:: Serialize ;
14
16
use tracing:: { error, info} ;
15
17
16
- use crate :: generate_diagnostics :: generate_diagnostics;
18
+ use crate :: diagnostics :: { generate_code_actions , generate_diagnostics} ;
17
19
18
20
pub struct Server {
19
21
connection : Connection ,
@@ -30,7 +32,14 @@ impl Server {
30
32
diagnostic_provider : Some ( lsp_types:: DiagnosticServerCapabilities :: Options (
31
33
DiagnosticOptions :: default ( ) ,
32
34
) ) ,
33
- code_action_provider : Some ( CodeActionProviderCapability :: Simple ( true ) ) ,
35
+ definition_provider : Some ( OneOf :: Left ( true ) ) ,
36
+ code_action_provider : Some ( CodeActionProviderCapability :: Options (
37
+ lsp_types:: CodeActionOptions {
38
+ code_action_kinds : Some ( vec ! [ CodeActionKind :: QUICKFIX ] ) ,
39
+ work_done_progress_options : WorkDoneProgressOptions :: default ( ) ,
40
+ resolve_provider : None ,
41
+ } ,
42
+ ) ) ,
34
43
..Default :: default ( )
35
44
} )
36
45
. unwrap ( ) ;
@@ -53,9 +62,11 @@ impl Server {
53
62
if self . connection . handle_shutdown ( & req) ? {
54
63
return Ok ( ( ) ) ;
55
64
}
65
+
56
66
info ! ( "Got request: {req:?}" ) ;
57
67
58
- let handlers: [ RequestHandler ; 1 ] = [ Self :: handle_goto] ;
68
+ let handlers: [ RequestHandler ; 2 ] =
69
+ [ Self :: handle_goto, Self :: handle_code_action] ;
59
70
60
71
for handler in handlers {
61
72
let res = handler ( self , & req) ;
@@ -144,12 +155,38 @@ impl Server {
144
155
} ,
145
156
} ,
146
157
} ] ) ) ;
158
+
159
+ self . send_response ( result, id) ?;
160
+
161
+ Ok ( ( ) )
162
+ }
163
+
164
+ fn handle_code_action ( & self , req : & Request ) -> anyhow:: Result < ( ) > {
165
+ let ( id, params) = cast_request :: < CodeActionRequest > ( req. clone ( ) ) ?;
166
+
167
+ info ! ( "Got code action request request #{id}: {params:?}" ) ;
168
+
169
+ let actions = generate_code_actions ( & params. text_document . uri , params. range ) ?;
170
+ let response: CodeActionResponse = actions
171
+ . into_iter ( )
172
+ . map ( CodeActionOrCommand :: CodeAction )
173
+ . collect ( ) ;
174
+
175
+ let result = Some ( response) ;
176
+
177
+ self . send_response ( result, id) ?;
178
+
179
+ Ok ( ( ) )
180
+ }
181
+
182
+ fn send_response < V : Serialize > ( & self , result : V , id : RequestId ) -> anyhow:: Result < ( ) > {
147
183
let result = serde_json:: to_value ( result) . unwrap ( ) ;
148
184
let resp = Response {
149
185
id,
150
186
result : Some ( result) ,
151
187
error : None ,
152
188
} ;
189
+
153
190
self . connection . sender . send ( Message :: Response ( resp) ) ?;
154
191
155
192
Ok ( ( ) )
0 commit comments