Skip to content

Commit 9cec5c7

Browse files
authored
Merge pull request #205 from Muscraft/fix-double-chars
Fix double chars
2 parents 789d9e2 + 42c12f3 commit 9cec5c7

File tree

3 files changed

+120
-30
lines changed

3 files changed

+120
-30
lines changed

src/renderer/mod.rs

-1
Original file line numberDiff line numberDiff line change
@@ -2048,7 +2048,6 @@ impl Renderer {
20482048
})
20492049
.collect();
20502050

2051-
buffer.puts(line_offset, code_offset, &code, ElementStyle::Quotation);
20522051
let placeholder = self.margin();
20532052
let padding = str_width(placeholder);
20542053
let (width_taken, bytes_taken) = if margin.was_cut_left() {

src/snippet.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ pub(crate) const NOTE_TXT: &str = "note";
1111
pub(crate) const WARNING_TXT: &str = "warning";
1212

1313
/// Top-level user message
14-
#[derive(Debug)]
14+
#[derive(Clone, Debug)]
1515
pub struct Message<'a> {
1616
pub(crate) id: Option<&'a str>, // for "correctness", could be sloppy and be on Title
1717
pub(crate) groups: Vec<Group<'a>>,
@@ -76,7 +76,7 @@ impl<'a> Message<'a> {
7676
}
7777

7878
/// An [`Element`] container
79-
#[derive(Debug)]
79+
#[derive(Clone, Debug)]
8080
pub struct Group<'a> {
8181
pub(crate) elements: Vec<Element<'a>>,
8282
}
@@ -108,7 +108,7 @@ impl<'a> Group<'a> {
108108
}
109109

110110
/// A section of content within a [`Group`]
111-
#[derive(Debug)]
111+
#[derive(Clone, Debug)]
112112
#[non_exhaustive]
113113
pub enum Element<'a> {
114114
Title(Title<'a>),
@@ -149,13 +149,13 @@ impl From<Padding> for Element<'_> {
149149
}
150150

151151
/// A whitespace [`Element`] in a [`Group`]
152-
#[derive(Debug)]
152+
#[derive(Clone, Debug)]
153153
pub struct Padding;
154154

155155
/// A text [`Element`] in a [`Group`]
156156
///
157157
/// See [`Level::title`] to create this.
158-
#[derive(Debug)]
158+
#[derive(Clone, Debug)]
159159
pub struct Title<'a> {
160160
pub(crate) level: Level<'a>,
161161
pub(crate) title: &'a str,
@@ -170,7 +170,7 @@ impl Title<'_> {
170170
}
171171

172172
/// A source view [`Element`] in a [`Group`]
173-
#[derive(Debug)]
173+
#[derive(Clone, Debug)]
174174
pub struct Snippet<'a, T> {
175175
pub(crate) origin: Option<&'a str>,
176176
pub(crate) line_start: usize,

tests/formatter.rs

+114-23
Original file line numberDiff line numberDiff line change
@@ -2129,7 +2129,7 @@ fn unicode_cut_handling() {
21292129
.annotation(AnnotationKind::Primary.span(85..228).label("annotation")),
21302130
),
21312131
);
2132-
let expected = str![[r#"
2132+
let expected_ascii = str![[r#"
21332133
error: title
21342134
|
21352135
1 | version = "0.1.0"
@@ -2140,8 +2140,22 @@ error: title
21402140
5 | | ]
21412141
| |_^ annotation
21422142
"#]];
2143-
let renderer = Renderer::plain();
2144-
assert_data_eq!(renderer.render(input), expected);
2143+
let renderer_ascii = Renderer::plain();
2144+
assert_data_eq!(renderer_ascii.render(input.clone()), expected_ascii);
2145+
2146+
let expected_unicode = str![[r#"
2147+
error: title
2148+
2149+
1 │ version = "0.1.0"
2150+
2 │ # Ensure that the spans from toml handle utf-8 correctly
2151+
3 │ authors = [
2152+
│ ┏━━━━━━━━━━━┛
2153+
4 │ ┃ { name = "Z͑ͫ̓ͪ̂ͫ̽͏̴̙̤̞͉͚̯̞̠͍A̴̵̜̰͔ͫ͗͢L̠ͨͧͩ͘G̴̻͈͍͔̹̑͗̎̅͛́Ǫ̵̹̻̝̳͂̌̌͘", email = 1 }
2154+
5 │ ┃ ]
2155+
╰╴┗━┛ annotation
2156+
"#]];
2157+
let renderer_unicode = renderer_ascii.theme(OutputTheme::Unicode);
2158+
assert_data_eq!(renderer_unicode.render(input), expected_unicode);
21452159
}
21462160

21472161
#[test]
@@ -2159,16 +2173,26 @@ fn unicode_cut_handling2() {
21592173
)
21602174
);
21612175

2162-
let expected = str![[r#"
2176+
let expected_ascii = str![[r#"
21632177
error: expected item, found `?`
21642178
|
21652179
1 | ...的。这是宽的。这是宽的。这是宽的。这是宽的。这是宽的。*/?
21662180
| ^ expected item
21672181
= note: for a full list of items that can appear in modules, see <https://doc.rust-lang.org/reference/items.html>
21682182
"#]];
21692183

2170-
let renderer = Renderer::plain();
2171-
assert_data_eq!(renderer.render(input), expected);
2184+
let renderer_ascii = Renderer::plain();
2185+
assert_data_eq!(renderer_ascii.render(input.clone()), expected_ascii);
2186+
2187+
let expected_unicode = str![[r#"
2188+
error: expected item, found `?`
2189+
2190+
1 │ …宽的。这是宽的。这是宽的。这是宽的。这是宽的。这是宽的。*/?
2191+
│ ━ expected item
2192+
╰ note: for a full list of items that can appear in modules, see <https://doc.rust-lang.org/reference/items.html>
2193+
"#]];
2194+
let renderer_unicode = renderer_ascii.theme(OutputTheme::Unicode);
2195+
assert_data_eq!(renderer_unicode.render(input), expected_unicode);
21722196
}
21732197

21742198
#[test]
@@ -2186,16 +2210,26 @@ fn unicode_cut_handling3() {
21862210
)
21872211
);
21882212

2189-
let expected = str![[r#"
2213+
let expected_ascii = str![[r#"
21902214
error: expected item, found `?`
21912215
|
21922216
1 | ...。这是宽的。这是宽的。这是宽的...
21932217
| ^^ expected item
21942218
= note: for a full list of items that can appear in modules, see <https://doc.rust-lang.org/reference/items.html>
21952219
"#]];
21962220

2197-
let renderer = Renderer::plain().term_width(43);
2198-
assert_data_eq!(renderer.render(input), expected);
2221+
let renderer_ascii = Renderer::plain().term_width(43);
2222+
assert_data_eq!(renderer_ascii.render(input.clone()), expected_ascii);
2223+
2224+
let expected_unicode = str![[r#"
2225+
error: expected item, found `?`
2226+
2227+
1 │ …的。这是宽的。这是宽的。这是宽的。…
2228+
│ ━━ expected item
2229+
╰ note: for a full list of items that can appear in modules, see <https://doc.rust-lang.org/reference/items.html>
2230+
"#]];
2231+
let renderer_unicode = renderer_ascii.theme(OutputTheme::Unicode);
2232+
assert_data_eq!(renderer_unicode.render(input), expected_unicode);
21992233
}
22002234

22012235
#[test]
@@ -2213,16 +2247,26 @@ fn unicode_cut_handling4() {
22132247
)
22142248
);
22152249

2216-
let expected = str![[r#"
2250+
let expected_ascii = str![[r#"
22172251
error: expected item, found `?`
22182252
|
22192253
1 | ...aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/?
22202254
| ^ expected item
22212255
= note: for a full list of items that can appear in modules, see <https://doc.rust-lang.org/reference/items.html>
22222256
"#]];
22232257

2224-
let renderer = Renderer::plain();
2225-
assert_data_eq!(renderer.render(input), expected);
2258+
let renderer_ascii = Renderer::plain();
2259+
assert_data_eq!(renderer_ascii.render(input.clone()), expected_ascii);
2260+
2261+
let expected_unicode = str![[r#"
2262+
error: expected item, found `?`
2263+
2264+
1 │ …aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa*/?
2265+
│ ━ expected item
2266+
╰ note: for a full list of items that can appear in modules, see <https://doc.rust-lang.org/reference/items.html>
2267+
"#]];
2268+
let renderer_unicode = renderer_ascii.theme(OutputTheme::Unicode);
2269+
assert_data_eq!(renderer_unicode.render(input), expected_unicode);
22262270
}
22272271

22282272
#[test]
@@ -2252,7 +2296,7 @@ fn main() {
22522296
),
22532297
);
22542298

2255-
let expected = str![[r#"
2299+
let expected_ascii = str![[r#"
22562300
error[E0308]: mismatched types
22572301
--> $DIR/non-whitespace-trimming-unicode.rs:4:415
22582302
|
@@ -2262,8 +2306,20 @@ LL | ...♧♨♩♪♫♬♭♮♯♰♱♲♳♴♵♶♷♸♹♺♻♼♽♾
22622306
| expected due to this
22632307
"#]];
22642308

2265-
let renderer = Renderer::plain().anonymized_line_numbers(true);
2266-
assert_data_eq!(renderer.render(input), expected);
2309+
let renderer_ascii = Renderer::plain().anonymized_line_numbers(true);
2310+
assert_data_eq!(renderer_ascii.render(input.clone()), expected_ascii);
2311+
2312+
let expected_unicode = str![[r#"
2313+
error[E0308]: mismatched types
2314+
╭▸ $DIR/non-whitespace-trimming-unicode.rs:4:415
2315+
2316+
LL │ …♥♦♧♨♩♪♫♬♭♮♯♰♱♲♳♴♵♶♷♸♹♺♻♼♽♾♿⚀⚁⚂⚃⚄⚅⚆⚈⚉4"; let _: () = 42; let _: &str = "🦀☀☁☂☃☄★☆☇☈☉☊☋☌☍☎☏☐☑☒☓ ☖☗☘☙☚☛☜☝☞☟☠☡☢☣☤☥☦☧☨☩☪☫☬☭☮☯☰☱☲☳☴☵☶☷☸☹…
2317+
│ ┬─ ━━ expected `()`, found integer
2318+
│ │
2319+
╰╴ expected due to this
2320+
"#]];
2321+
let renderer_unicode = renderer_ascii.theme(OutputTheme::Unicode);
2322+
assert_data_eq!(renderer_unicode.render(input), expected_unicode);
22672323
}
22682324

22692325
#[test]
@@ -2311,7 +2367,27 @@ fn main() {
23112367
),
23122368
);
23132369

2314-
let expected = str![[r#"
2370+
let expected_ascii = str![[r#"
2371+
error[E0369]: cannot add `&str` to `&str`
2372+
--> $DIR/non-1-width-unicode-multiline-label.rs:7:260
2373+
|
2374+
LL | ...࿉࿊࿋࿌࿍࿎࿏࿐࿑࿒࿓࿔࿕࿖࿗࿘࿙࿚"; let _a = unicode_is_fun + " really fun!";
2375+
| -------------- ^ -------------- &str
2376+
| | |
2377+
| | `+` cannot be used to concatenate two `&str` strings
2378+
| &str
2379+
|
2380+
= note: string concatenation requires an owned `String` on the left
2381+
help: create an owned `String` from a string reference
2382+
|
2383+
LL | let _ = "ༀ༁༂༃༄༅༆༇༈༉༊་༌།༎༏༐༑༒༓༔༕༖༗༘༙༚༛༜༝༞༟༠༡༢༣༤༥༦༧༨༩༪༫༬༭༮༯༰༱༲༳༴༵༶༷༸༹༺༻༼༽༾༿ཀཁགགྷངཅཆཇ཈ཉཊཋཌཌྷཎཏཐདདྷནཔཕབབྷམཙཚཛཛྷཝཞཟའཡརལཤཥསཧཨཀྵཪཫཬ཭཮཯཰ཱཱཱིིུུྲྀཷླྀཹེཻོཽཾཿ྄ཱྀྀྂྃ྅྆྇ྈྉྊྋྌྍྎྏྐྑྒྒྷྔྕྖྗ྘ྙྚྛྜྜྷྞྟྠྡྡྷྣྤྥྦྦྷྨྩྪྫྫྷྭྮྯྰྱྲླྴྵྶྷྸྐྵྺྻྼ྽྾྿࿀࿁࿂࿃࿄࿅࿆࿇࿈࿉࿊࿋࿌࿍࿎࿏࿐࿑࿒࿓࿔࿕࿖࿗࿘࿙࿚"; let _a = unicode_is_fun.to_owned() + " really fun!";
2384+
| +++++++++++
2385+
"#]];
2386+
2387+
let renderer_ascii = Renderer::plain().anonymized_line_numbers(true);
2388+
assert_data_eq!(renderer_ascii.render(input.clone()), expected_ascii);
2389+
2390+
let expected_unicode = str![[r#"
23152391
error[E0369]: cannot add `&str` to `&str`
23162392
╭▸ $DIR/non-1-width-unicode-multiline-label.rs:7:260
23172393
@@ -2328,10 +2404,8 @@ LL │ let _ = "ༀ༁༂༃༄༅༆༇༈༉༊་༌།༎༏༐༑༒༓
23282404
╰╴ +++++++++++
23292405
"#]];
23302406

2331-
let renderer = Renderer::plain()
2332-
.anonymized_line_numbers(true)
2333-
.theme(OutputTheme::Unicode);
2334-
assert_data_eq!(renderer.render(input), expected);
2407+
let renderer_unicode = renderer_ascii.theme(OutputTheme::Unicode);
2408+
assert_data_eq!(renderer_unicode.render(input), expected_unicode);
23352409
}
23362410

23372411
#[test]
@@ -2367,7 +2441,7 @@ fn foo() {
23672441
.element(Level::NOTE.title("this error originates in the macro `include` (in Nightly builds, run with -Z macro-backtrace for more info)")),
23682442
);
23692443

2370-
let expected = str![[r#"
2444+
let expected_ascii = str![[r#"
23712445
error: couldn't read `$DIR/not-utf8.bin`: stream did not contain valid UTF-8
23722446
--> $DIR/not-utf8.rs:6:5
23732447
|
@@ -2382,6 +2456,23 @@ LL | �|�␂!5�cc␕␂�Ӻi��WWj�ȥ�'�}�␒�J�ȉ��W
23822456
= note: this error originates in the macro `include` (in Nightly builds, run with -Z macro-backtrace for more info)
23832457
"#]];
23842458

2385-
let renderer = Renderer::plain().anonymized_line_numbers(true);
2386-
assert_data_eq!(renderer.render(input), expected);
2459+
let renderer_ascii = Renderer::plain().anonymized_line_numbers(true);
2460+
assert_data_eq!(renderer_ascii.render(input.clone()), expected_ascii);
2461+
2462+
let expected_unicode = str![[r#"
2463+
error: couldn't read `$DIR/not-utf8.bin`: stream did not contain valid UTF-8
2464+
╭▸ $DIR/not-utf8.rs:6:5
2465+
2466+
LL │ include!("not-utf8.bin");
2467+
│ ━━━━━━━━━━━━━━━━━━━━━━━━
2468+
╰╴
2469+
note: byte `193` is not valid utf-8
2470+
╭▸ $DIR/not-utf8.bin:1:1
2471+
2472+
LL │ �|�␂!5�cc␕␂�Ӻi��WWj�ȥ�'�}�␒�J�ȉ��W�␞O�@����␜w�V���LO����␔[ ␃_�'���SQ�~ذ��ų&��- ��lN~��!@␌ _#���kQ��h�␝�:�␜␇�
2473+
│ ━
2474+
╰ note: this error originates in the macro `include` (in Nightly builds, run with -Z macro-backtrace for more info)
2475+
"#]];
2476+
let renderer_unicode = renderer_ascii.theme(OutputTheme::Unicode);
2477+
assert_data_eq!(renderer_unicode.render(input), expected_unicode);
23872478
}

0 commit comments

Comments
 (0)