]> git.lizzy.rs Git - rust.git/commitdiff
Revert "Simplify Unicode-aware trimming"
authorAnthonyMikh <anthony.mikh@yandex.ru>
Thu, 26 Sep 2019 21:58:18 +0000 (00:58 +0300)
committerGitHub <noreply@github.com>
Thu, 26 Sep 2019 21:58:18 +0000 (00:58 +0300)
`taken` is actually used afterwards

src/librustc_errors/emitter.rs

index b8b7488d8ae459b77549600345a5ae0d4de83067..1aa6b405c8fad17f136026d7a039052feddf554c 100644 (file)
@@ -530,21 +530,18 @@ fn draw_line(
         let left = margin.left(line_len);
         let right = margin.right(line_len);
         // On long lines, we strip the source line, accounting for unicode.
-        // Make sure that the trimming on the right will fall within the terminal width.
-        // FIXME: `unicode_width` sometimes disagrees with terminals on how wide a `char` is.
-        // For now, just accept that sometimes the code line will be longer than desired.
-        let code: String = source_string.chars().skip(left)
-            .map(|ch| {
-                let width = unicode_width::UnicodeWidthChar::width(*ch).unwrap_or(1);
-                (width, ch)
-            })
-            .scan(0, |len, (width, ch)| {
-                *len += width;
-                Some(*len, ch)
-            })
-            .take_while(|&(prefix_len, _ch)| prefix_len <= right - left)
-            .map(|(_prefix_len, ch)| ch)
-            .collect();
+        let mut taken = 0;
+        let code: String = source_string.chars().skip(left).take_while(|ch| {
+            // Make sure that the trimming on the right will fall within the terminal width.
+            // FIXME: `unicode_width` sometimes disagrees with terminals on how wide a `char` is.
+            // For now, just accept that sometimes the code line will be longer than desired.
+            let next = unicode_width::UnicodeWidthChar::width(*ch).unwrap_or(1);
+            if taken + next > right - left {
+                return false;
+            }
+            taken += next;
+            true
+        }).collect();
         buffer.puts(line_offset, code_offset, &code, Style::Quotation);
         if margin.was_cut_left() {
             // We have stripped some code/whitespace from the beginning, make it clear.