diff options
Diffstat (limited to 'src/librustc_errors')
| -rw-r--r-- | src/librustc_errors/Cargo.toml | 1 | ||||
| -rw-r--r-- | src/librustc_errors/emitter.rs | 6 | ||||
| -rw-r--r-- | src/librustc_errors/lib.rs | 1 |
3 files changed, 7 insertions, 1 deletions
diff --git a/src/librustc_errors/Cargo.toml b/src/librustc_errors/Cargo.toml index c72e9dd0ea3..3e15af7558d 100644 --- a/src/librustc_errors/Cargo.toml +++ b/src/librustc_errors/Cargo.toml @@ -12,3 +12,4 @@ crate-type = ["dylib"] serialize = { path = "../libserialize" } syntax_pos = { path = "../libsyntax_pos" } rustc_data_structures = { path = "../librustc_data_structures" } +unicode-width = "0.1.4" diff --git a/src/librustc_errors/emitter.rs b/src/librustc_errors/emitter.rs index 6bba6fbc295..af556c576c0 100644 --- a/src/librustc_errors/emitter.rs +++ b/src/librustc_errors/emitter.rs @@ -23,6 +23,7 @@ use std::rc::Rc; use term; use std::collections::HashMap; use std::cmp::min; +use unicode_width; /// Emitter trait for emitting errors. pub trait Emitter { @@ -1182,7 +1183,10 @@ impl EmitterWriter { if show_underline { draw_col_separator(&mut buffer, row_num, max_line_num_len + 1); let start = parts[0].snippet.len() - parts[0].snippet.trim_left().len(); - let sub_len = parts[0].snippet.trim().len(); + // account for substitutions containing unicode characters + let sub_len = parts[0].snippet.trim().chars().fold(0, |acc, ch| { + acc + unicode_width::UnicodeWidthChar::width(ch).unwrap_or(0) + }); let underline_start = span_start_pos.col.0 + start; let underline_end = span_start_pos.col.0 + start + sub_len; for p in underline_start..underline_end { diff --git a/src/librustc_errors/lib.rs b/src/librustc_errors/lib.rs index 605cfc5ed12..840346c447b 100644 --- a/src/librustc_errors/lib.rs +++ b/src/librustc_errors/lib.rs @@ -26,6 +26,7 @@ extern crate libc; extern crate rustc_data_structures; extern crate serialize as rustc_serialize; extern crate syntax_pos; +extern crate unicode_width; pub use emitter::ColorConfig; |
