@@ -179,7 +179,10 @@ impl GlobalState {
179
179
}
180
180
}
181
181
182
- while let Some ( event) = self . next_event ( & inbox) {
182
+ while let Ok ( event) = self . next_event ( & inbox) {
183
+ let Some ( event) = event else {
184
+ anyhow:: bail!( "client exited without proper shutdown sequence" ) ;
185
+ } ;
183
186
if matches ! (
184
187
& event,
185
188
Event :: Lsp ( lsp_server:: Message :: Notification ( Notification { method, .. } ) )
@@ -190,7 +193,7 @@ impl GlobalState {
190
193
self . handle_event ( event) ?;
191
194
}
192
195
193
- anyhow:: bail !( "client exited without proper shutdown sequence" )
196
+ Err ( anyhow:: anyhow !( "A receiver has been dropped, something panicked!" ) )
194
197
}
195
198
196
199
fn register_did_save_capability ( & mut self , additional_patterns : impl Iterator < Item = String > ) {
@@ -237,37 +240,40 @@ impl GlobalState {
237
240
) ;
238
241
}
239
242
240
- fn next_event ( & self , inbox : & Receiver < lsp_server:: Message > ) -> Option < Event > {
243
+ fn next_event (
244
+ & self ,
245
+ inbox : & Receiver < lsp_server:: Message > ,
246
+ ) -> Result < Option < Event > , crossbeam_channel:: RecvError > {
241
247
select ! {
242
248
recv( inbox) -> msg =>
243
- msg. ok( ) . map( Event :: Lsp ) ,
249
+ return Ok ( msg. ok( ) . map( Event :: Lsp ) ) ,
244
250
245
251
recv( self . task_pool. receiver) -> task =>
246
- Some ( Event :: Task ( task . unwrap ( ) ) ) ,
252
+ task . map ( Event :: Task ) ,
247
253
248
254
recv( self . deferred_task_queue. receiver) -> task =>
249
- Some ( Event :: QueuedTask ( task . unwrap ( ) ) ) ,
255
+ task . map ( Event :: QueuedTask ) ,
250
256
251
257
recv( self . fmt_pool. receiver) -> task =>
252
- Some ( Event :: Task ( task . unwrap ( ) ) ) ,
258
+ task . map ( Event :: Task ) ,
253
259
254
260
recv( self . loader. receiver) -> task =>
255
- Some ( Event :: Vfs ( task . unwrap ( ) ) ) ,
261
+ task . map ( Event :: Vfs ) ,
256
262
257
263
recv( self . flycheck_receiver) -> task =>
258
- Some ( Event :: Flycheck ( task . unwrap ( ) ) ) ,
264
+ task . map ( Event :: Flycheck ) ,
259
265
260
266
recv( self . test_run_receiver) -> task =>
261
- Some ( Event :: TestResult ( task . unwrap ( ) ) ) ,
267
+ task . map ( Event :: TestResult ) ,
262
268
263
269
recv( self . discover_receiver) -> task =>
264
- Some ( Event :: DiscoverProject ( task . unwrap ( ) ) ) ,
270
+ task . map ( Event :: DiscoverProject ) ,
265
271
}
272
+ . map ( Some )
266
273
}
267
274
268
275
fn handle_event ( & mut self , event : Event ) -> anyhow:: Result < ( ) > {
269
276
let loop_start = Instant :: now ( ) ;
270
- // NOTE: don't count blocking select! call as a loop-turn time
271
277
let _p = tracing:: info_span!( "GlobalState::handle_event" , event = %event) . entered ( ) ;
272
278
273
279
let event_dbg_msg = format ! ( "{event:?}" ) ;
@@ -434,40 +440,13 @@ impl GlobalState {
434
440
if let Some ( diagnostic_changes) = self . diagnostics . take_changes ( ) {
435
441
for file_id in diagnostic_changes {
436
442
let uri = file_id_to_url ( & self . vfs . read ( ) . 0 , file_id) ;
437
- let mut diagnostics =
438
- self . diagnostics . diagnostics_for ( file_id) . cloned ( ) . collect :: < Vec < _ > > ( ) ;
439
-
440
- // VSCode assumes diagnostic messages to be non-empty strings, so we need to patch
441
- // empty diagnostics. Neither the docs of VSCode nor the LSP spec say whether
442
- // diagnostic messages are actually allowed to be empty or not and patching this
443
- // in the VSCode client does not work as the assertion happens in the protocol
444
- // conversion. So this hack is here to stay, and will be considered a hack
445
- // until the LSP decides to state that empty messages are allowed.
446
-
447
- // See https://github.com/rust-lang/rust-analyzer/issues/11404
448
- // See https://github.com/rust-lang/rust-analyzer/issues/13130
449
- let patch_empty = |message : & mut String | {
450
- if message. is_empty ( ) {
451
- " " . clone_into ( message) ;
452
- }
453
- } ;
454
-
455
- for d in & mut diagnostics {
456
- patch_empty ( & mut d. message ) ;
457
- if let Some ( dri) = & mut d. related_information {
458
- for dri in dri {
459
- patch_empty ( & mut dri. message ) ;
460
- }
461
- }
462
- }
463
-
464
443
let version = from_proto:: vfs_path ( & uri)
465
- . map ( |path| self . mem_docs . get ( & path ) . map ( |it| it . version ) )
466
- . unwrap_or_default ( ) ;
444
+ . ok ( )
445
+ . and_then ( |path| self . mem_docs . get ( & path ) . map ( |it| it . version ) ) ;
467
446
468
- self . send_notification :: < lsp_types :: notification :: PublishDiagnostics > (
469
- lsp_types :: PublishDiagnosticsParams { uri , diagnostics , version } ,
470
- ) ;
447
+ let diagnostics =
448
+ self . diagnostics . diagnostics_for ( file_id ) . cloned ( ) . collect :: < Vec < _ > > ( ) ;
449
+ self . publish_diagnostics ( uri , version , diagnostics ) ;
471
450
}
472
451
}
473
452
0 commit comments