Skip to content

Commit 209cf7d

Browse files
committed
Watch both stdout and stderr in flycheck
1 parent 3ba876a commit 209cf7d

File tree

1 file changed

+41
-27
lines changed

1 file changed

+41
-27
lines changed

crates/flycheck/src/lib.rs

+41-27
Original file line numberDiff line numberDiff line change
@@ -456,42 +456,56 @@ impl CargoActor {
456456
// simply skip a line if it doesn't parse, which just ignores any
457457
// erroneous output.
458458

459-
let mut error = String::new();
460-
let mut read_at_least_one_message = false;
459+
let mut stdout_errors = String::new();
460+
let mut stderr_errors = String::new();
461+
let mut read_at_least_one_stdout_message = false;
462+
let mut read_at_least_one_stderr_message = false;
463+
let process_line = |line: &str, error: &mut String| {
464+
// Try to deserialize a message from Cargo or Rustc.
465+
let mut deserializer = serde_json::Deserializer::from_str(line);
466+
deserializer.disable_recursion_limit();
467+
if let Ok(message) = JsonMessage::deserialize(&mut deserializer) {
468+
match message {
469+
// Skip certain kinds of messages to only spend time on what's useful
470+
JsonMessage::Cargo(message) => match message {
471+
cargo_metadata::Message::CompilerArtifact(artifact) if !artifact.fresh => {
472+
self.sender.send(CargoMessage::CompilerArtifact(artifact)).unwrap();
473+
}
474+
cargo_metadata::Message::CompilerMessage(msg) => {
475+
self.sender.send(CargoMessage::Diagnostic(msg.message)).unwrap();
476+
}
477+
_ => (),
478+
},
479+
JsonMessage::Rustc(message) => {
480+
self.sender.send(CargoMessage::Diagnostic(message)).unwrap();
481+
}
482+
}
483+
return true;
484+
}
485+
486+
error.push_str(line);
487+
error.push('\n');
488+
return false;
489+
};
461490
let output = streaming_output(
462491
self.stdout,
463492
self.stderr,
464493
&mut |line| {
465-
read_at_least_one_message = true;
466-
467-
// Try to deserialize a message from Cargo or Rustc.
468-
let mut deserializer = serde_json::Deserializer::from_str(line);
469-
deserializer.disable_recursion_limit();
470-
if let Ok(message) = JsonMessage::deserialize(&mut deserializer) {
471-
match message {
472-
// Skip certain kinds of messages to only spend time on what's useful
473-
JsonMessage::Cargo(message) => match message {
474-
cargo_metadata::Message::CompilerArtifact(artifact)
475-
if !artifact.fresh =>
476-
{
477-
self.sender.send(CargoMessage::CompilerArtifact(artifact)).unwrap();
478-
}
479-
cargo_metadata::Message::CompilerMessage(msg) => {
480-
self.sender.send(CargoMessage::Diagnostic(msg.message)).unwrap();
481-
}
482-
_ => (),
483-
},
484-
JsonMessage::Rustc(message) => {
485-
self.sender.send(CargoMessage::Diagnostic(message)).unwrap();
486-
}
487-
}
494+
if process_line(line, &mut stdout_errors) {
495+
read_at_least_one_stdout_message = true;
488496
}
489497
},
490498
&mut |line| {
491-
error.push_str(line);
492-
error.push('\n');
499+
if process_line(line, &mut stderr_errors) {
500+
read_at_least_one_stderr_message = true;
501+
}
493502
},
494503
);
504+
505+
let read_at_least_one_message =
506+
read_at_least_one_stdout_message || read_at_least_one_stderr_message;
507+
let mut error = stdout_errors;
508+
error.push_str(&stderr_errors);
495509
match output {
496510
Ok(_) => Ok((read_at_least_one_message, error)),
497511
Err(e) => Err(io::Error::new(e.kind(), format!("{e:?}: {error}"))),

0 commit comments

Comments
 (0)