1
1
//! Flycheck provides the functionality needed to run `cargo check` to provide
2
2
//! LSP diagnostics based on the output of the command.
3
3
4
- use std:: { fmt, io, mem , process:: Command , time:: Duration } ;
4
+ use std:: { fmt, io, process:: Command , time:: Duration } ;
5
5
6
6
use cargo_metadata:: PackageId ;
7
7
use crossbeam_channel:: { select_biased, unbounded, Receiver , Sender } ;
8
+ use ide_db:: FxHashSet ;
8
9
use paths:: { AbsPath , AbsPathBuf , Utf8PathBuf } ;
9
10
use rustc_hash:: FxHashMap ;
10
11
use serde:: Deserialize as _;
@@ -231,13 +232,7 @@ struct FlycheckActor {
231
232
command_handle : Option < CommandHandle < CargoCheckMessage > > ,
232
233
/// The receiver side of the channel mentioned above.
233
234
command_receiver : Option < Receiver < CargoCheckMessage > > ,
234
- package_status : FxHashMap < Arc < PackageId > , DiagnosticReceived > ,
235
- }
236
-
237
- #[ derive( PartialEq , Eq , Copy , Clone , Debug ) ]
238
- enum DiagnosticReceived {
239
- Yes ,
240
- No ,
235
+ diagnostics_cleared_for : FxHashSet < Arc < PackageId > > ,
241
236
}
242
237
243
238
#[ allow( clippy:: large_enum_variant) ]
@@ -267,7 +262,7 @@ impl FlycheckActor {
267
262
manifest_path,
268
263
command_handle : None ,
269
264
command_receiver : None ,
270
- package_status : FxHashMap :: default ( ) ,
265
+ diagnostics_cleared_for : Default :: default ( ) ,
271
266
}
272
267
}
273
268
@@ -344,16 +339,16 @@ impl FlycheckActor {
344
339
error
345
340
) ;
346
341
}
347
- if self . package_status . is_empty ( ) {
342
+ if self . diagnostics_cleared_for . is_empty ( ) {
348
343
tracing:: trace!( flycheck_id = self . id, "clearing diagnostics" ) ;
349
344
// We finished without receiving any diagnostics.
350
- // That means all of them are stale.
345
+ // Clear everything for good measure
351
346
self . send ( FlycheckMessage :: ClearDiagnostics {
352
347
id : self . id ,
353
348
package_id : None ,
354
349
} ) ;
355
350
} else {
356
- self . send_clear_diagnostics ( ) ;
351
+ self . diagnostics_cleared_for . clear ( ) ;
357
352
}
358
353
359
354
self . report_progress ( Progress :: DidFinish ( res) ) ;
@@ -367,9 +362,18 @@ impl FlycheckActor {
367
362
"artifact received"
368
363
) ;
369
364
self . report_progress ( Progress :: DidCheckCrate ( msg. target . name ) ) ;
370
- self . package_status
371
- . entry ( Arc :: new ( msg. package_id ) )
372
- . or_insert ( DiagnosticReceived :: No ) ;
365
+ let package_id = Arc :: new ( msg. package_id ) ;
366
+ if self . diagnostics_cleared_for . insert ( package_id. clone ( ) ) {
367
+ tracing:: trace!(
368
+ flycheck_id = self . id,
369
+ package_id = package_id. repr,
370
+ "clearing diagnostics"
371
+ ) ;
372
+ self . send ( FlycheckMessage :: ClearDiagnostics {
373
+ id : self . id ,
374
+ package_id : Some ( package_id) ,
375
+ } ) ;
376
+ }
373
377
}
374
378
CargoCheckMessage :: Diagnostic { diagnostic, package_id } => {
375
379
tracing:: trace!(
@@ -379,10 +383,7 @@ impl FlycheckActor {
379
383
"diagnostic received"
380
384
) ;
381
385
if let Some ( package_id) = & package_id {
382
- if let None | Some ( DiagnosticReceived :: No ) = self
383
- . package_status
384
- . insert ( package_id. clone ( ) , DiagnosticReceived :: Yes )
385
- {
386
+ if self . diagnostics_cleared_for . insert ( package_id. clone ( ) ) {
386
387
tracing:: trace!(
387
388
flycheck_id = self . id,
388
389
package_id = package_id. repr,
@@ -417,23 +418,7 @@ impl FlycheckActor {
417
418
command_handle. cancel ( ) ;
418
419
self . command_receiver . take ( ) ;
419
420
self . report_progress ( Progress :: DidCancel ) ;
420
- self . send_clear_diagnostics ( ) ;
421
- }
422
- }
423
-
424
- fn send_clear_diagnostics ( & mut self ) {
425
- for ( package_id, status) in mem:: take ( & mut self . package_status ) {
426
- if let DiagnosticReceived :: No = status {
427
- tracing:: trace!(
428
- flycheck_id = self . id,
429
- package_id = package_id. repr,
430
- "clearing diagnostics"
431
- ) ;
432
- self . send ( FlycheckMessage :: ClearDiagnostics {
433
- id : self . id ,
434
- package_id : Some ( package_id) ,
435
- } ) ;
436
- }
421
+ self . diagnostics_cleared_for . clear ( ) ;
437
422
}
438
423
}
439
424
0 commit comments