4
4
5
5
use std:: {
6
6
fmt,
7
- io:: { self , BufReader } ,
7
+ io:: { self , BufRead , BufReader } ,
8
8
path:: PathBuf ,
9
9
process:: { self , Command , Stdio } ,
10
10
time:: Duration ,
11
11
} ;
12
12
13
13
use crossbeam_channel:: { never, select, unbounded, Receiver , Sender } ;
14
+ use serde:: Deserialize ;
14
15
use stdx:: JodChild ;
15
16
16
17
pub use cargo_metadata:: diagnostic:: {
@@ -128,7 +129,7 @@ struct FlycheckActor {
128
129
129
130
enum Event {
130
131
Restart ( Restart ) ,
131
- CheckEvent ( Option < cargo_metadata :: Message > ) ,
132
+ CheckEvent ( Option < CargoMessage > ) ,
132
133
}
133
134
134
135
impl FlycheckActor {
@@ -180,21 +181,16 @@ impl FlycheckActor {
180
181
self . progress ( Progress :: DidFinish ( res) ) ;
181
182
}
182
183
Event :: CheckEvent ( Some ( message) ) => match message {
183
- cargo_metadata :: Message :: CompilerArtifact ( msg) => {
184
+ CargoMessage :: CompilerArtifact ( msg) => {
184
185
self . progress ( Progress :: DidCheckCrate ( msg. target . name ) ) ;
185
186
}
186
187
187
- cargo_metadata :: Message :: CompilerMessage ( msg) => {
188
+ CargoMessage :: Diagnostic ( msg) => {
188
189
self . send ( Message :: AddDiagnostic {
189
190
workspace_root : self . workspace_root . clone ( ) ,
190
- diagnostic : msg. message ,
191
+ diagnostic : msg,
191
192
} ) ;
192
193
}
193
-
194
- cargo_metadata:: Message :: BuildScriptExecuted ( _)
195
- | cargo_metadata:: Message :: BuildFinished ( _)
196
- | cargo_metadata:: Message :: TextLine ( _)
197
- | _ => { }
198
194
} ,
199
195
}
200
196
}
@@ -261,7 +257,7 @@ struct CargoHandle {
261
257
child : JodChild ,
262
258
#[ allow( unused) ]
263
259
thread : jod_thread:: JoinHandle < io:: Result < bool > > ,
264
- receiver : Receiver < cargo_metadata :: Message > ,
260
+ receiver : Receiver < CargoMessage > ,
265
261
}
266
262
267
263
impl CargoHandle {
@@ -294,14 +290,11 @@ impl CargoHandle {
294
290
295
291
struct CargoActor {
296
292
child_stdout : process:: ChildStdout ,
297
- sender : Sender < cargo_metadata :: Message > ,
293
+ sender : Sender < CargoMessage > ,
298
294
}
299
295
300
296
impl CargoActor {
301
- fn new (
302
- child_stdout : process:: ChildStdout ,
303
- sender : Sender < cargo_metadata:: Message > ,
304
- ) -> CargoActor {
297
+ fn new ( child_stdout : process:: ChildStdout , sender : Sender < CargoMessage > ) -> CargoActor {
305
298
CargoActor { child_stdout, sender }
306
299
}
307
300
fn run ( self ) -> io:: Result < bool > {
@@ -315,7 +308,7 @@ impl CargoActor {
315
308
// erroneus output.
316
309
let stdout = BufReader :: new ( self . child_stdout ) ;
317
310
let mut read_at_least_one_message = false ;
318
- for message in cargo_metadata :: Message :: parse_stream ( stdout) {
311
+ for message in stdout. lines ( ) {
319
312
let message = match message {
320
313
Ok ( message) => message,
321
314
Err ( err) => {
@@ -326,13 +319,43 @@ impl CargoActor {
326
319
327
320
read_at_least_one_message = true ;
328
321
329
- // Skip certain kinds of messages to only spend time on what's useful
330
- match & message {
331
- cargo_metadata:: Message :: CompilerArtifact ( artifact) if artifact. fresh => ( ) ,
332
- cargo_metadata:: Message :: BuildScriptExecuted ( _) => ( ) ,
333
- _ => self . sender . send ( message) . unwrap ( ) ,
322
+ // Try to deserialize a message from Cargo.
323
+ {
324
+ let mut deserializer = serde_json:: Deserializer :: from_str ( & message) ;
325
+ deserializer. disable_recursion_limit ( ) ;
326
+ if let Ok ( message) = cargo_metadata:: Message :: deserialize ( & mut deserializer) {
327
+ // Skip certain kinds of messages to only spend time on what's useful
328
+ match message {
329
+ cargo_metadata:: Message :: CompilerArtifact ( artifact) if !artifact. fresh => {
330
+ self . sender . send ( CargoMessage :: CompilerArtifact ( artifact) ) . unwrap ( )
331
+ }
332
+ cargo_metadata:: Message :: CompilerMessage ( msg) => {
333
+ self . sender . send ( CargoMessage :: Diagnostic ( msg. message ) ) . unwrap ( )
334
+ }
335
+
336
+ cargo_metadata:: Message :: CompilerArtifact ( _)
337
+ | cargo_metadata:: Message :: BuildScriptExecuted ( _)
338
+ | cargo_metadata:: Message :: BuildFinished ( _)
339
+ | cargo_metadata:: Message :: TextLine ( _)
340
+ | _ => ( ) ,
341
+ }
342
+ }
343
+ }
344
+
345
+ // Try to deserialize a Diagnostic directly from Rustc.
346
+ {
347
+ let mut deserializer = serde_json:: Deserializer :: from_str ( & message) ;
348
+ deserializer. disable_recursion_limit ( ) ;
349
+ if let Ok ( message) = Diagnostic :: deserialize ( & mut deserializer) {
350
+ self . sender . send ( CargoMessage :: Diagnostic ( message) ) . unwrap ( )
351
+ }
334
352
}
335
353
}
336
354
Ok ( read_at_least_one_message)
337
355
}
338
356
}
357
+
358
+ enum CargoMessage {
359
+ CompilerArtifact ( cargo_metadata:: Artifact ) ,
360
+ Diagnostic ( Diagnostic ) ,
361
+ }
0 commit comments