about summary refs log tree commit diff
path: root/src/libsyntax
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-02-09 14:13:59 -0800
committerbors <bors@rust-lang.org>2013-02-09 14:13:59 -0800
commit7fe6b1b6cfcdf52fd99f02b1d999c480e134e30f (patch)
tree3ba42db1623a0a7b8035992ab8a5539e3052370d /src/libsyntax
parent19dfec2aaf746535de1521f68421f9980dbf25de (diff)
parent8d0c1cb406156379570b6a3c9911db758995fa4e (diff)
auto merge of #4853 : Thiez/rust/incoming, r=catamorphism
A simple fix for issue 2174.
Diffstat (limited to 'src/libsyntax')
-rw-r--r--src/libsyntax/diagnostic.rs22
1 files changed, 17 insertions, 5 deletions
diff --git a/src/libsyntax/diagnostic.rs b/src/libsyntax/diagnostic.rs
index cd42fc7a953..51ef085839d 100644
--- a/src/libsyntax/diagnostic.rs
+++ b/src/libsyntax/diagnostic.rs
@@ -250,7 +250,7 @@ fn highlight_lines(cm: @codemap::CodeMap,
         io::stderr().write_str(out);
     }
 
-
+    // FIXME (#3260)
     // If there's one line at fault we can easily point to the problem
     if vec::len(lines.lines) == 1u {
         let lo = cm.lookup_char_pos(sp.lo);
@@ -263,14 +263,26 @@ fn highlight_lines(cm: @codemap::CodeMap,
         // indent past |name:## | and the 0-offset column location
         let mut left = str::len(fm.name) + digits + lo.col.to_uint() + 3u;
         let mut s = ~"";
-        while left > 0u { str::push_char(&mut s, ' '); left -= 1u; }
-
+        // Skip is the number of characters we need to skip because they are
+        // part of the 'filename:line ' part of the previous line.
+        let skip = str::len(fm.name) + digits + 3u;
+        for skip.times() {
+            s += ~" ";
+        }
+        let orig = fm.get_line(lines.lines[0] as int);
+        for uint::range(0u,left-skip) |pos| {
+            let curChar = (orig[pos] as char);
+            s += match curChar { // Whenever a tab occurs on the previous
+                '\t' => "\t",    // line, we insert one on the error-point-
+                _ => " "         // -squigly-line as well (instead of a
+            };                   // space). This way the squigly-line will
+        }                        // usually appear in the correct position.
         s += ~"^";
         let hi = cm.lookup_char_pos(sp.hi);
         if hi.col != lo.col {
             // the ^ already takes up one space
-            let mut width = hi.col.to_uint() - lo.col.to_uint() - 1u;
-            while width > 0u { str::push_char(&mut s, '~'); width -= 1u; }
+            let num_squiglies = hi.col.to_uint()-lo.col.to_uint()-1u;
+            for num_squiglies.times() { s += ~"~"; }
         }
         io::stderr().write_str(s + ~"\n");
     }