diff options
| author | bors <bors@rust-lang.org> | 2024-11-11 00:00:58 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-11-11 00:00:58 +0000 |
| commit | 42b24963202f31d417a972e56e48a17e916b279b (patch) | |
| tree | a4a484ea3a381466b93c01ca6cd7da18b045e6e0 /src | |
| parent | 143ce0920a2307b19831160a01f06f107610f1b2 (diff) | |
| parent | acf6344b42b86bf63c73632620438fc4836b0d8e (diff) | |
| download | rust-42b24963202f31d417a972e56e48a17e916b279b.tar.gz rust-42b24963202f31d417a972e56e48a17e916b279b.zip | |
Auto merge of #126597 - estebank:unicode-output, r=fmease
Add Unicode block-drawing compiler output support Add nightly-only theming support to rustc output using Unicode box drawing characters instead of ASCII-art to draw the terminal UI. In order to enable, the flags `-Zunstable-options=yes --error-format=human-unicode` must be passed in. After: ``` error: foo ╭▸ test.rs:3:3 │ 3 │ X0 Y0 Z0 │ ┌───╿──│──┘ │ ┌│───│──┘ │ ┏││━━━┙ │ ┃││ 4 │ ┃││ X1 Y1 Z1 5 │ ┃││ X2 Y2 Z2 │ ┃│└────╿──│──┘ `Z` label │ ┃└─────│──┤ │ ┗━━━━━━┥ `Y` is a good letter too │ `X` is a good letter ╰╴ note: bar ╭▸ test.rs:4:3 │ 4 │ ┏ X1 Y1 Z1 5 │ ┃ X2 Y2 Z2 6 │ ┃ X3 Y3 Z3 │ ┗━━━━━━━━━━┛ ├ note: bar ╰ note: baz note: qux ╭▸ test.rs:4:3 │ 4 │ X1 Y1 Z1 ╰╴ ━━━━━━━━ ``` Before: ``` error: foo --> test.rs:3:3 | 3 | X0 Y0 Z0 | ___^__-__- | |___|__| | ||___| | ||| 4 | ||| X1 Y1 Z1 5 | ||| X2 Y2 Z2 | |||____^__-__- `Z` label | ||_____|__| | |______| `Y` is a good letter too | `X` is a good letter | note: bar --> test.rs:4:3 | 4 | / X1 Y1 Z1 5 | | X2 Y2 Z2 6 | | X3 Y3 Z3 | |__________^ = note: bar = note: baz note: qux --> test.rs:4:3 | 4 | X1 Y1 Z1 | ^^^^^^^^ ``` After:  Before: 
Diffstat (limited to 'src')
8 files changed, 41 insertions, 29 deletions
diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs index 7ba3cfb66bd..d5f6bfe415d 100644 --- a/src/librustdoc/core.rs +++ b/src/librustdoc/core.rs @@ -6,7 +6,9 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexMap}; use rustc_data_structures::sync::Lrc; use rustc_data_structures::unord::UnordSet; use rustc_errors::codes::*; -use rustc_errors::emitter::{DynEmitter, HumanEmitter, stderr_destination}; +use rustc_errors::emitter::{ + DynEmitter, HumanEmitter, HumanReadableErrorType, OutputTheme, stderr_destination, +}; use rustc_errors::json::JsonEmitter; use rustc_errors::{ErrorGuaranteed, TerminalUrl}; use rustc_feature::UnstableFeatures; @@ -154,6 +156,11 @@ pub(crate) fn new_dcx( .teach(unstable_opts.teach) .diagnostic_width(diagnostic_width) .track_diagnostics(unstable_opts.track_diagnostics) + .theme(if let HumanReadableErrorType::Unicode = kind { + OutputTheme::Unicode + } else { + OutputTheme::Ascii + }) .ui_testing(unstable_opts.ui_testing), ) } diff --git a/src/librustdoc/doctest.rs b/src/librustdoc/doctest.rs index 11d8f1947d6..25e576e9e63 100644 --- a/src/librustdoc/doctest.rs +++ b/src/librustdoc/doctest.rs @@ -15,6 +15,7 @@ pub(crate) use make::DocTestBuilder; pub(crate) use markdown::test as test_markdown; use rustc_ast as ast; use rustc_data_structures::fx::{FxHashMap, FxIndexMap, FxIndexSet}; +use rustc_errors::emitter::HumanReadableErrorType; use rustc_errors::{ColorConfig, DiagCtxtHandle, ErrorGuaranteed, FatalError}; use rustc_hir::CRATE_HIR_ID; use rustc_hir::def_id::LOCAL_CRATE; @@ -520,10 +521,14 @@ fn run_test( }); if let ErrorOutputType::HumanReadable(kind, color_config) = rustdoc_options.error_format { let short = kind.short(); + let unicode = kind == HumanReadableErrorType::Unicode; if short { compiler.arg("--error-format").arg("short"); } + if unicode { + compiler.arg("--error-format").arg("human-unicode"); + } match color_config { ColorConfig::Never => { diff --git a/src/tools/clippy/tests/ui/empty_line_after/doc_comments.stderr b/src/tools/clippy/tests/ui/empty_line_after/doc_comments.stderr index c238b4c9a17..2852e26680f 100644 --- a/src/tools/clippy/tests/ui/empty_line_after/doc_comments.stderr +++ b/src/tools/clippy/tests/ui/empty_line_after/doc_comments.stderr @@ -3,7 +3,7 @@ error: empty line after doc comment | LL | / /// for the crate LL | | - | |_ + | |_^ LL | fn first_in_crate() {} | ------------------- the comment documents this function | @@ -22,7 +22,7 @@ error: empty line after doc comment | LL | / /// for the module LL | | - | |_ + | |_^ LL | fn first_in_module() {} | -------------------- the comment documents this function | @@ -39,7 +39,7 @@ error: empty line after doc comment | LL | / /// # Indented LL | | - | |_ + | |_^ LL | /// Blank line LL | fn indented() {} | ------------- the comment documents this function @@ -55,7 +55,7 @@ error: empty line after doc comment | LL | / /// This should produce a warning LL | | - | |_ + | |_^ LL | fn with_doc_and_newline() {} | ------------------------- the comment documents this function | @@ -69,7 +69,7 @@ LL | | LL | | /** This is also a doc comment and is part of the warning LL | | */ LL | | - | |_ + | |_^ ... LL | fn three_attributes() {} | --------------------- the comment documents this function @@ -82,7 +82,7 @@ error: empty line after doc comment LL | / /// docs for `old_code` LL | | // fn old_code() {} LL | | - | |_ + | |_^ LL | fn new_code() {} | ------------- the comment documents this function | @@ -102,7 +102,7 @@ LL | | /// Docs LL | | /// for OldB LL | | // struct OldB; LL | | - | |_ + | |_^ ... LL | struct Multiple; | --------------- the comment documents this struct @@ -125,7 +125,7 @@ LL | / /** LL | | * Meant to be inner doc comment LL | | */ LL | | - | |_ + | |_^ LL | fn first_in_module() {} | -------------------- the comment documents this function | @@ -143,7 +143,7 @@ LL | | * Docs for `old_code` LL | | */ LL | | /* fn old_code() {} */ LL | | - | |_ + | |_^ ... LL | fn new_code() {} | ------------- the comment documents this function @@ -161,7 +161,7 @@ error: empty line after doc comment LL | / /// Docs for `old_code2` LL | | /* fn old_code2() {} */ LL | | - | |_ + | |_^ LL | /// Docs for `new_code2` LL | fn new_code2() {} | -------------- the comment documents this function diff --git a/src/tools/clippy/tests/ui/empty_line_after/outer_attribute.stderr b/src/tools/clippy/tests/ui/empty_line_after/outer_attribute.stderr index 958b40424a9..75fc23e9e7e 100644 --- a/src/tools/clippy/tests/ui/empty_line_after/outer_attribute.stderr +++ b/src/tools/clippy/tests/ui/empty_line_after/outer_attribute.stderr @@ -3,7 +3,7 @@ error: empty line after outer attribute | LL | / #[crate_type = "lib"] LL | | - | |_ + | |_^ LL | fn first_in_crate() {} | ------------------- the attribute applies to this function | @@ -20,7 +20,7 @@ error: empty line after outer attribute | LL | / #[inline] LL | | - | |_ + | |_^ LL | /// some comment LL | fn with_one_newline_and_comment() {} | --------------------------------- the attribute applies to this function @@ -32,7 +32,7 @@ error: empty line after outer attribute | LL | / #[inline] LL | | - | |_ + | |_^ LL | fn with_one_newline() {} | --------------------- the attribute applies to this function | @@ -44,7 +44,7 @@ error: empty lines after outer attribute LL | / #[crate_type = "lib"] LL | | LL | | - | |_ + | |_^ LL | fn with_two_newlines() {} | ---------------------- the attribute applies to this function | @@ -59,7 +59,7 @@ error: empty line after outer attribute | LL | / #[doc = "doc attributes should be considered attributes"] LL | | - | |_ + | |_^ LL | enum Baz { | -------- the attribute applies to this enum | @@ -70,7 +70,7 @@ error: empty line after outer attribute | LL | / #[repr(C)] LL | | - | |_ + | |_^ LL | struct Foo { | ---------- the attribute applies to this struct | @@ -81,7 +81,7 @@ error: empty line after outer attribute | LL | / #[allow(dead_code)] LL | | - | |_ + | |_^ LL | mod foo {} | ------- the attribute applies to this module | @@ -93,7 +93,7 @@ error: empty line after outer attribute LL | / #[inline] LL | | // Still lint cases where the empty line does not immediately follow the attribute LL | | - | |_ + | |_^ LL | fn comment_before_empty_line() {} | ------------------------------ the attribute applies to this function | @@ -106,7 +106,7 @@ LL | / #[allow(unused)] LL | | LL | | // This comment is isolated LL | | - | |_ + | |_^ LL | pub fn isolated_comment() {} | ------------------------- the attribute applies to this function | diff --git a/src/tools/clippy/tests/ui/four_forward_slashes.stderr b/src/tools/clippy/tests/ui/four_forward_slashes.stderr index a2218ea4d10..3606a2227a0 100644 --- a/src/tools/clippy/tests/ui/four_forward_slashes.stderr +++ b/src/tools/clippy/tests/ui/four_forward_slashes.stderr @@ -3,7 +3,7 @@ error: this item has comments with 4 forward slashes (`////`). These look like d | LL | / //// whoops LL | | fn a() {} - | |_ + | |_^ | = note: `-D clippy::four-forward-slashes` implied by `-D warnings` = help: to override `-D warnings` add `#[allow(clippy::four_forward_slashes)]` @@ -18,7 +18,7 @@ error: this item has comments with 4 forward slashes (`////`). These look like d LL | / //// whoops LL | | #[allow(dead_code)] LL | | fn b() {} - | |_ + | |_^ | help: make this a doc comment by removing one `/` | @@ -32,7 +32,7 @@ LL | / //// whoops LL | | //// two borked comments! LL | | #[track_caller] LL | | fn c() {} - | |_ + | |_^ | help: turn these into doc comments by removing one `/` | @@ -46,7 +46,7 @@ error: this item has comments with 4 forward slashes (`////`). These look like d LL | / //// between attributes LL | | #[allow(dead_code)] LL | | fn g() {} - | |_ + | |_^ | help: make this a doc comment by removing one `/` | @@ -58,7 +58,7 @@ error: this item has comments with 4 forward slashes (`////`). These look like d | LL | / //// not very start of contents LL | | fn h() {} - | |_ + | |_^ | help: make this a doc comment by removing one `/` | diff --git a/src/tools/clippy/tests/ui/four_forward_slashes_first_line.stderr b/src/tools/clippy/tests/ui/four_forward_slashes_first_line.stderr index 23937034b7e..81732346412 100644 --- a/src/tools/clippy/tests/ui/four_forward_slashes_first_line.stderr +++ b/src/tools/clippy/tests/ui/four_forward_slashes_first_line.stderr @@ -3,7 +3,7 @@ error: this item has comments with 4 forward slashes (`////`). These look like d | LL | / //// borked doc comment on the first line. doesn't combust! LL | | fn a() {} - | |_ + | |_^ | = note: `-D clippy::four-forward-slashes` implied by `-D warnings` = help: to override `-D warnings` add `#[allow(clippy::four_forward_slashes)]` diff --git a/src/tools/clippy/tests/ui/too_long_first_doc_paragraph-fix.stderr b/src/tools/clippy/tests/ui/too_long_first_doc_paragraph-fix.stderr index 6403265a39c..6ef333f0cfd 100644 --- a/src/tools/clippy/tests/ui/too_long_first_doc_paragraph-fix.stderr +++ b/src/tools/clippy/tests/ui/too_long_first_doc_paragraph-fix.stderr @@ -6,7 +6,7 @@ LL | | /// A much longer explanation that goes into a lot more detail about LL | | /// how the thing works, possibly with doclinks and so one, LL | | /// and probably spanning a many rows. Blablabla, it needs to be over LL | | /// 200 characters so I needed to write something longeeeeeeer. - | |_ + | |_^ | = note: `-D clippy::too-long-first-doc-paragraph` implied by `-D warnings` = help: to override `-D warnings` add `#[allow(clippy::too_long_first_doc_paragraph)]` diff --git a/src/tools/clippy/tests/ui/too_long_first_doc_paragraph.stderr b/src/tools/clippy/tests/ui/too_long_first_doc_paragraph.stderr index 39926647f54..95f42349b9b 100644 --- a/src/tools/clippy/tests/ui/too_long_first_doc_paragraph.stderr +++ b/src/tools/clippy/tests/ui/too_long_first_doc_paragraph.stderr @@ -23,7 +23,7 @@ error: first doc comment paragraph is too long LL | / /// Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc turpis nunc, lacinia LL | | /// a dolor in, pellentesque aliquet enim. Cras nec maximus sem. Mauris arcu libero, LL | | /// gravida non lacinia at, rhoncus eu lacus. - | |_ + | |_^ error: first doc comment paragraph is too long --> tests/ui/too_long_first_doc_paragraph.rs:36:1 @@ -32,7 +32,7 @@ LL | / /// Lorem LL | | /// ipsum dolor sit amet, consectetur adipiscing elit. Nunc turpis nunc, lacinia LL | | /// a dolor in, pellentesque aliquet enim. Cras nec maximus sem. Mauris arcu libero, LL | | /// gravida non lacinia at, rhoncus eu lacus. - | |_ + | |_^ error: aborting due to 3 previous errors |
