Skip to content

Commit 761c465

Browse files
authored
refactor(shell): Prepare for Reports being generated in more places (#15920)
### What does this PR try to resolve? This is preparation for changes like #15917 where we start to use `annotate_snippets::Report` for handling more of the rendering of our user messages to be more consistent with rustc and more feature rich in what we are able to render. ### How to test and review this PR?
2 parents 73cedc2 + 642411f commit 761c465

File tree

3 files changed

+27
-15
lines changed

3 files changed

+27
-15
lines changed

src/cargo/core/shell.rs

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -222,10 +222,7 @@ impl Shell {
222222

223223
/// Prints an amber 'warning' message.
224224
pub fn warn<T: fmt::Display>(&mut self, message: T) -> CargoResult<()> {
225-
match self.verbosity {
226-
Verbosity::Quiet => Ok(()),
227-
_ => self.print(&"warning", Some(&message), &WARN, false),
228-
}
225+
self.print(&"warning", Some(&message), &WARN, false)
229226
}
230227

231228
/// Prints a cyan 'note' message.
@@ -407,16 +404,22 @@ impl Shell {
407404
}
408405

409406
/// Prints the passed in [`Report`] to stderr
410-
pub fn print_report(&mut self, report: Report<'_>) -> std::io::Result<()> {
407+
pub fn print_report(&mut self, report: Report<'_>, force: bool) -> CargoResult<()> {
408+
if !force && matches!(self.verbosity, Verbosity::Quiet) {
409+
return Ok(());
410+
}
411+
412+
if self.needs_clear {
413+
self.err_erase_line();
414+
}
411415
let term_width = self
412416
.err_width()
413417
.diagnostic_terminal_width()
414418
.unwrap_or(annotate_snippets::renderer::DEFAULT_TERM_WIDTH);
415-
writeln!(
416-
self.err(),
417-
"{}",
418-
Renderer::styled().term_width(term_width).render(report)
419-
)
419+
let rendered = Renderer::styled().term_width(term_width).render(report);
420+
self.err().write_all(rendered.as_bytes())?;
421+
self.err().write_all("\n".as_bytes())?;
422+
Ok(())
420423
}
421424
}
422425

src/cargo/util/lints.rs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ fn verify_feature_enabled(
171171
}
172172

173173
*error_count += 1;
174-
gctx.shell().print_report(&report)?;
174+
gctx.shell().print_report(&report, true)?;
175175
}
176176
Ok(())
177177
}
@@ -339,6 +339,15 @@ impl LintLevel {
339339
LintLevel::Forbid => Level::ERROR,
340340
}
341341
}
342+
343+
fn force(self) -> bool {
344+
match self {
345+
Self::Allow => false,
346+
Self::Warn => true,
347+
Self::Deny => true,
348+
Self::Forbid => true,
349+
}
350+
}
342351
}
343352

344353
impl From<TomlLintLevel> for LintLevel {
@@ -459,7 +468,7 @@ pub fn check_im_a_teapot(
459468
)
460469
.element(Level::NOTE.message(&emitted_reason))];
461470

462-
gctx.shell().print_report(report)?;
471+
gctx.shell().print_report(report, lint_level.force())?;
463472
}
464473
Ok(())
465474
}
@@ -568,7 +577,7 @@ fn output_unknown_lints(
568577
);
569578
}
570579

571-
gctx.shell().print_report(&report)?;
580+
gctx.shell().print_report(&report, lint_level.force())?;
572581
}
573582

574583
Ok(())

src/cargo/util/toml/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1930,7 +1930,7 @@ fn missing_dep_diagnostic(
19301930
group.element(snippet)
19311931
};
19321932

1933-
if let Err(err) = gctx.shell().print_report(&[group]) {
1933+
if let Err(err) = gctx.shell().print_report(&[group], true) {
19341934
return Err(err.into());
19351935
}
19361936
Err(AlreadyPrintedError::new(anyhow!("").into()).into())
@@ -2798,7 +2798,7 @@ fn emit_diagnostic(
27982798
.annotation(AnnotationKind::Primary.span(span)),
27992799
);
28002800

2801-
if let Err(err) = gctx.shell().print_report(&[group]) {
2801+
if let Err(err) = gctx.shell().print_report(&[group], true) {
28022802
return err.into();
28032803
}
28042804
return AlreadyPrintedError::new(e.into()).into();

0 commit comments

Comments
 (0)