44
55use std:: {
66 fmt,
7- io:: { self , BufReader } ,
7+ io:: { self , BufRead , BufReader } ,
88 path:: PathBuf ,
99 process:: { self , Command , Stdio } ,
1010 time:: Duration ,
1111} ;
1212
1313use crossbeam_channel:: { never, select, unbounded, Receiver , Sender } ;
14+ use serde:: Deserialize ;
1415use stdx:: JodChild ;
1516
1617pub use cargo_metadata:: diagnostic:: {
@@ -128,7 +129,7 @@ struct FlycheckActor {
128129
129130enum Event {
130131 Restart ( Restart ) ,
131- CheckEvent ( Option < cargo_metadata :: Message > ) ,
132+ CheckEvent ( Option < CargoMessage > ) ,
132133}
133134
134135impl FlycheckActor {
@@ -180,21 +181,16 @@ impl FlycheckActor {
180181 self . progress ( Progress :: DidFinish ( res) ) ;
181182 }
182183 Event :: CheckEvent ( Some ( message) ) => match message {
183- cargo_metadata :: Message :: CompilerArtifact ( msg) => {
184+ CargoMessage :: CompilerArtifact ( msg) => {
184185 self . progress ( Progress :: DidCheckCrate ( msg. target . name ) ) ;
185186 }
186187
187- cargo_metadata :: Message :: CompilerMessage ( msg) => {
188+ CargoMessage :: Diagnostic ( msg) => {
188189 self . send ( Message :: AddDiagnostic {
189190 workspace_root : self . workspace_root . clone ( ) ,
190- diagnostic : msg. message ,
191+ diagnostic : msg,
191192 } ) ;
192193 }
193-
194- cargo_metadata:: Message :: BuildScriptExecuted ( _)
195- | cargo_metadata:: Message :: BuildFinished ( _)
196- | cargo_metadata:: Message :: TextLine ( _)
197- | _ => { }
198194 } ,
199195 }
200196 }
@@ -261,7 +257,7 @@ struct CargoHandle {
261257 child : JodChild ,
262258 #[ allow( unused) ]
263259 thread : jod_thread:: JoinHandle < io:: Result < bool > > ,
264- receiver : Receiver < cargo_metadata :: Message > ,
260+ receiver : Receiver < CargoMessage > ,
265261}
266262
267263impl CargoHandle {
@@ -294,14 +290,11 @@ impl CargoHandle {
294290
295291struct CargoActor {
296292 child_stdout : process:: ChildStdout ,
297- sender : Sender < cargo_metadata :: Message > ,
293+ sender : Sender < CargoMessage > ,
298294}
299295
300296impl 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 {
305298 CargoActor { child_stdout, sender }
306299 }
307300 fn run ( self ) -> io:: Result < bool > {
@@ -315,7 +308,7 @@ impl CargoActor {
315308 // erroneus output.
316309 let stdout = BufReader :: new ( self . child_stdout ) ;
317310 let mut read_at_least_one_message = false ;
318- for message in cargo_metadata :: Message :: parse_stream ( stdout) {
311+ for message in stdout. lines ( ) {
319312 let message = match message {
320313 Ok ( message) => message,
321314 Err ( err) => {
@@ -326,13 +319,43 @@ impl CargoActor {
326319
327320 read_at_least_one_message = true ;
328321
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+ }
334352 }
335353 }
336354 Ok ( read_at_least_one_message)
337355 }
338356}
357+
358+ enum CargoMessage {
359+ CompilerArtifact ( cargo_metadata:: Artifact ) ,
360+ Diagnostic ( Diagnostic ) ,
361+ }
0 commit comments