about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2017-07-05 16:39:06 -0700
committerEsteban Küber <esteban@kuber.com.ar>2017-07-06 14:36:49 -0700
commit697c85a4f15b8dd560fb1f78129f5bfdd4baf1f4 (patch)
treef96e6e3662433fed1b78afd8641f065ffb6e3e48
parenteb478e23813b89944edfa602b6927e17c4c62f86 (diff)
downloadrust-697c85a4f15b8dd560fb1f78129f5bfdd4baf1f4.tar.gz
rust-697c85a4f15b8dd560fb1f78129f5bfdd4baf1f4.zip
Only underline suggestion if it is not the only code being shown
-rw-r--r--src/librustc_errors/emitter.rs23
-rw-r--r--src/librustc_errors/lib.rs23
-rw-r--r--src/libsyntax/json.rs2
-rw-r--r--src/test/ui/block-result/unexpected-return-on-unit.stderr8
-rw-r--r--src/test/ui/issue-22644.rs15
-rw-r--r--src/test/ui/issue-22644.stderr36
-rw-r--r--src/test/ui/resolve/enums-are-namespaced-xc.stderr6
-rw-r--r--src/test/ui/resolve/issue-16058.stderr2
-rw-r--r--src/test/ui/resolve/issue-17518.stderr2
-rw-r--r--src/test/ui/resolve/issue-21221-1.stderr8
-rw-r--r--src/test/ui/resolve/issue-21221-2.stderr2
-rw-r--r--src/test/ui/resolve/issue-21221-3.stderr2
-rw-r--r--src/test/ui/resolve/issue-21221-4.stderr2
-rw-r--r--src/test/ui/resolve/issue-3907.stderr2
-rw-r--r--src/test/ui/resolve/privacy-struct-ctor.stderr6
-rw-r--r--src/test/ui/span/issue-35987.stderr2
16 files changed, 98 insertions, 43 deletions
diff --git a/src/librustc_errors/emitter.rs b/src/librustc_errors/emitter.rs
index 99342351d92..a6a45c8b502 100644
--- a/src/librustc_errors/emitter.rs
+++ b/src/librustc_errors/emitter.rs
@@ -1078,17 +1078,14 @@ impl EmitterWriter {
 
             let suggestions = suggestion.splice_lines(cm.borrow());
             let span_start_pos = cm.lookup_char_pos(primary_sub.span.lo);
-            let span_end_pos = cm.lookup_char_pos(primary_sub.span.hi);
             let line_start = span_start_pos.line;
             draw_col_separator_no_space(&mut buffer, 1, max_line_num_len + 1);
             let mut row_num = 2;
-            for complete in suggestions.iter().take(MAX_SUGGESTIONS) {
+            for (&(ref complete, show_underline), ref sub) in suggestions
+                    .iter().zip(primary_sub.substitutions.iter()).take(MAX_SUGGESTIONS)
+            {
                 let mut line_pos = 0;
                 // Only show underline if there's a single suggestion and it is a single line
-                let show_underline = complete.lines().count() == 1
-                    && span_start_pos.line == span_end_pos.line
-                    && primary_sub.substitutions.len() == 1;
-
                 let mut lines = complete.lines();
                 for line in lines.by_ref().take(MAX_HIGHLIGHT_LINES) {
                     // Print the span column to avoid confusion
@@ -1099,11 +1096,13 @@ impl EmitterWriter {
                     // print the suggestion
                     draw_col_separator(&mut buffer, row_num, max_line_num_len + 1);
                     buffer.append(row_num, line, Style::NoStyle);
+                    line_pos += 1;
                     row_num += 1;
+                    // Only show an underline in the suggestions if the suggestion is not the
+                    // entirety of the code being shown and the displayed code is not multiline.
                     if show_underline {
                         draw_col_separator(&mut buffer, row_num, max_line_num_len + 1);
-
-                        let sub_len = primary_sub.substitutions[0].trim_right().len();
+                        let sub_len = sub.trim_right().len();
                         let underline_start = span_start_pos.col.0;
                         let underline_end = span_start_pos.col.0 + sub_len;
                         for p in underline_start..underline_end {
@@ -1114,19 +1113,19 @@ impl EmitterWriter {
                         }
                         row_num += 1;
                     }
-                    line_pos += 1;
                 }
 
                 // if we elided some lines, add an ellipsis
                 if let Some(_) = lines.next() {
-                    buffer.append(row_num, "...", Style::NoStyle);
-                } else if !show_underline && suggestions.len() <= MAX_SUGGESTIONS {
+                    buffer.puts(row_num, max_line_num_len - 1, "...", Style::LineNumber);
+                } else if !show_underline {
                     draw_col_separator_no_space(&mut buffer, row_num, max_line_num_len + 1);
+                    row_num += 1;
                 }
             }
             if suggestions.len() > MAX_SUGGESTIONS {
                 let msg = format!("and {} other candidates", suggestions.len() - MAX_SUGGESTIONS);
-                buffer.append(row_num, &msg, Style::NoStyle);
+                buffer.puts(row_num, 0, &msg, Style::NoStyle);
             }
             emit_to_destination(&buffer.render(), level, &mut self.dst)?;
         }
diff --git a/src/librustc_errors/lib.rs b/src/librustc_errors/lib.rs
index dd25f969414..7fb75a263f9 100644
--- a/src/librustc_errors/lib.rs
+++ b/src/librustc_errors/lib.rs
@@ -114,8 +114,8 @@ impl CodeSuggestion {
         self.substitution_parts.iter().map(|sub| sub.span)
     }
 
-    /// Returns the assembled code suggestions.
-    pub fn splice_lines(&self, cm: &CodeMapper) -> Vec<String> {
+    /// Returns the assembled code suggestions and wether they should be shown with an underline.
+    pub fn splice_lines(&self, cm: &CodeMapper) -> Vec<(String, bool)> {
         use syntax_pos::{CharPos, Loc, Pos};
 
         fn push_trailing(buf: &mut String,
@@ -138,7 +138,7 @@ impl CodeSuggestion {
         }
 
         if self.substitution_parts.is_empty() {
-            return vec![String::new()];
+            return vec![(String::new(), false)];
         }
 
         let mut primary_spans: Vec<_> = self.substitution_parts
@@ -175,14 +175,25 @@ impl CodeSuggestion {
         prev_hi.col = CharPos::from_usize(0);
 
         let mut prev_line = fm.get_line(lines.lines[0].line_index);
-        let mut bufs = vec![String::new(); self.substitutions()];
+        let mut bufs = vec![(String::new(), false); self.substitutions()];
 
         for (sp, substitutes) in primary_spans {
             let cur_lo = cm.lookup_char_pos(sp.lo);
-            for (buf, substitute) in bufs.iter_mut().zip(substitutes) {
+            for (&mut (ref mut buf, ref mut underline), substitute) in bufs.iter_mut()
+                                                                           .zip(substitutes) {
                 if prev_hi.line == cur_lo.line {
                     push_trailing(buf, prev_line.as_ref(), &prev_hi, Some(&cur_lo));
+
+                    // Only show an underline in the suggestions if the suggestion is not the
+                    // entirety of the code being shown and the displayed code is not multiline.
+                    if prev_line.as_ref().unwrap().trim().len() > 0
+                        && !substitute.ends_with('\n')
+                        && substitute.lines().count() == 1
+                    {
+                        *underline = true;
+                    }
                 } else {
+                    *underline = false;
                     push_trailing(buf, prev_line.as_ref(), &prev_hi, None);
                     // push lines between the previous and current span (if any)
                     for idx in prev_hi.line..(cur_lo.line - 1) {
@@ -200,7 +211,7 @@ impl CodeSuggestion {
             prev_hi = cm.lookup_char_pos(sp.hi);
             prev_line = fm.get_line(prev_hi.line - 1);
         }
-        for buf in &mut bufs {
+        for &mut (ref mut buf, _) in &mut bufs {
             // if the replacement already ends with a newline, don't print the next line
             if !buf.ends_with('\n') {
                 push_trailing(buf, prev_line.as_ref(), &prev_hi, None);
diff --git a/src/libsyntax/json.rs b/src/libsyntax/json.rs
index e60edafe4ee..909b0031d61 100644
--- a/src/libsyntax/json.rs
+++ b/src/libsyntax/json.rs
@@ -359,7 +359,7 @@ impl DiagnosticCode {
 
 impl JsonEmitter {
     fn render(&self, suggestion: &CodeSuggestion) -> Vec<String> {
-        suggestion.splice_lines(&*self.cm)
+        suggestion.splice_lines(&*self.cm).iter().map(|line| line.0.to_owned()).collect()
     }
 }
 
diff --git a/src/test/ui/block-result/unexpected-return-on-unit.stderr b/src/test/ui/block-result/unexpected-return-on-unit.stderr
index 68afd2084f1..c8743c72e31 100644
--- a/src/test/ui/block-result/unexpected-return-on-unit.stderr
+++ b/src/test/ui/block-result/unexpected-return-on-unit.stderr
@@ -7,9 +7,13 @@ error[E0308]: mismatched types
    = note: expected type `()`
               found type `usize`
 help: did you mean to add a semicolon here?
-   |     foo();
+   |
+19 |     foo();
+   |          ^
 help: possibly return type missing here?
-   | fn bar() -> usize {
+   |
+18 | fn bar() -> usize {
+   |          ^^^^^^^^
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/issue-22644.rs b/src/test/ui/issue-22644.rs
index 9269180396c..e8a2db4048c 100644
--- a/src/test/ui/issue-22644.rs
+++ b/src/test/ui/issue-22644.rs
@@ -14,5 +14,18 @@ fn main() {
 
     println!("{}", a as usize > b);
     println!("{}", a as usize < b);
-    println!("{}", a as usize < 4);
+    println!("{}", a
+                   as
+                   usize
+                   <
+                   4);
+    println!("{}", a
+
+
+                   as
+
+
+                   usize
+                   <
+                   5);
 }
diff --git a/src/test/ui/issue-22644.stderr b/src/test/ui/issue-22644.stderr
index f9702d43ad5..af61571625b 100644
--- a/src/test/ui/issue-22644.stderr
+++ b/src/test/ui/issue-22644.stderr
@@ -12,17 +12,37 @@ help: if you want to compare the casted value then write:
    |                    ^^^^^^^^^^^^
 
 error: `<` is interpreted as a start of generic arguments for `usize`, not a comparison
-  --> $DIR/issue-22644.rs:17:33
+  --> $DIR/issue-22644.rs:21:20
    |
-17 |     println!("{}", a as usize < 4);
-   |                               - ^ interpreted as generic argument
-   |                               |
-   |                               not interpreted as comparison
+20 |                    <
+   |                    - not interpreted as comparison
+21 |                    4);
+   |                    ^ interpreted as generic argument
    |
 help: if you want to compare the casted value then write:
    |
-17 |     println!("{}", (a as usize) < 4);
-   |                    ^^^^^^^^^^^^
+17 |     println!("{}", (a
+18 |                    as
+19 |                    usize)
+   |
+
+error: `<` is interpreted as a start of generic arguments for `usize`, not a comparison
+  --> $DIR/issue-22644.rs:30:20
+   |
+29 |                    <
+   |                    - not interpreted as comparison
+30 |                    5);
+   |                    ^ interpreted as generic argument
+   |
+help: if you want to compare the casted value then write:
+   |
+22 |     println!("{}", (a
+23 | 
+24 | 
+25 |                    as
+26 | 
+27 | 
+ ...
 
-error: aborting due to 2 previous errors
+error: aborting due to 3 previous errors
 
diff --git a/src/test/ui/resolve/enums-are-namespaced-xc.stderr b/src/test/ui/resolve/enums-are-namespaced-xc.stderr
index 525dd4fe8f1..4b32ecff2fb 100644
--- a/src/test/ui/resolve/enums-are-namespaced-xc.stderr
+++ b/src/test/ui/resolve/enums-are-namespaced-xc.stderr
@@ -7,7 +7,7 @@ error[E0425]: cannot find value `A` in module `namespaced_enums`
 help: possible candidate is found in another module, you can import it into scope
    |
 12 | use namespaced_enums::Foo::A;
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
 
 error[E0425]: cannot find function `B` in module `namespaced_enums`
   --> $DIR/enums-are-namespaced-xc.rs:18:31
@@ -18,7 +18,7 @@ error[E0425]: cannot find function `B` in module `namespaced_enums`
 help: possible candidate is found in another module, you can import it into scope
    |
 12 | use namespaced_enums::Foo::B;
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
 
 error[E0422]: cannot find struct, variant or union type `C` in module `namespaced_enums`
   --> $DIR/enums-are-namespaced-xc.rs:21:31
@@ -29,7 +29,7 @@ error[E0422]: cannot find struct, variant or union type `C` in module `namespace
 help: possible candidate is found in another module, you can import it into scope
    |
 12 | use namespaced_enums::Foo::C;
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
 
 error: aborting due to 3 previous errors
 
diff --git a/src/test/ui/resolve/issue-16058.stderr b/src/test/ui/resolve/issue-16058.stderr
index 7abf6e3d5fd..6d7406f891c 100644
--- a/src/test/ui/resolve/issue-16058.stderr
+++ b/src/test/ui/resolve/issue-16058.stderr
@@ -7,7 +7,9 @@ error[E0574]: expected struct, variant or union type, found enum `Result`
 help: possible better candidates are found in other modules, you can import them into scope
    |
 12 | use std::fmt::Result;
+   |
 12 | use std::io::Result;
+   |
 12 | use std::thread::Result;
    |
 
diff --git a/src/test/ui/resolve/issue-17518.stderr b/src/test/ui/resolve/issue-17518.stderr
index d7017f30145..2f94dbdc2c5 100644
--- a/src/test/ui/resolve/issue-17518.stderr
+++ b/src/test/ui/resolve/issue-17518.stderr
@@ -7,7 +7,7 @@ error[E0422]: cannot find struct, variant or union type `E` in this scope
 help: possible candidate is found in another module, you can import it into scope
    |
 11 | use SomeEnum::E;
-   | ^^^^^^^^^^^^^^^^
+   |
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/resolve/issue-21221-1.stderr b/src/test/ui/resolve/issue-21221-1.stderr
index ce5ed7b5e5d..ddaee451e90 100644
--- a/src/test/ui/resolve/issue-21221-1.stderr
+++ b/src/test/ui/resolve/issue-21221-1.stderr
@@ -7,7 +7,9 @@ error[E0405]: cannot find trait `Mul` in this scope
 help: possible candidates are found in other modules, you can import them into scope
    |
 11 | use mul1::Mul;
+   |
 11 | use mul2::Mul;
+   |
 11 | use std::ops::Mul;
    |
 
@@ -20,9 +22,13 @@ error[E0412]: cannot find type `Mul` in this scope
 help: possible candidates are found in other modules, you can import them into scope
    |
 11 | use mul1::Mul;
+   |
 11 | use mul2::Mul;
+   |
 11 | use mul3::Mul;
+   |
 11 | use mul4::Mul;
+   |
 and 2 other candidates
 
 error[E0405]: cannot find trait `ThisTraitReallyDoesntExistInAnyModuleReally` in this scope
@@ -40,7 +46,7 @@ error[E0405]: cannot find trait `Div` in this scope
 help: possible candidate is found in another module, you can import it into scope
    |
 11 | use std::ops::Div;
-   | ^^^^^^^^^^^^^^^^^^
+   |
 
 error: cannot continue compilation due to previous error
 
diff --git a/src/test/ui/resolve/issue-21221-2.stderr b/src/test/ui/resolve/issue-21221-2.stderr
index bca3667d60b..a759116c6ac 100644
--- a/src/test/ui/resolve/issue-21221-2.stderr
+++ b/src/test/ui/resolve/issue-21221-2.stderr
@@ -7,7 +7,7 @@ error[E0405]: cannot find trait `T` in this scope
 help: possible candidate is found in another module, you can import it into scope
    |
 11 | use foo::bar::T;
-   | ^^^^^^^^^^^^^^^^
+   |
 
 error[E0601]: main function not found
 
diff --git a/src/test/ui/resolve/issue-21221-3.stderr b/src/test/ui/resolve/issue-21221-3.stderr
index f364fb590ab..f4d183192b6 100644
--- a/src/test/ui/resolve/issue-21221-3.stderr
+++ b/src/test/ui/resolve/issue-21221-3.stderr
@@ -7,7 +7,7 @@ error[E0405]: cannot find trait `OuterTrait` in this scope
 help: possible candidate is found in another module, you can import it into scope
    |
 16 | use issue_21221_3::outer::OuterTrait;
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
 
 error: cannot continue compilation due to previous error
 
diff --git a/src/test/ui/resolve/issue-21221-4.stderr b/src/test/ui/resolve/issue-21221-4.stderr
index a022ca0749d..eb71ee893ce 100644
--- a/src/test/ui/resolve/issue-21221-4.stderr
+++ b/src/test/ui/resolve/issue-21221-4.stderr
@@ -7,7 +7,7 @@ error[E0405]: cannot find trait `T` in this scope
 help: possible candidate is found in another module, you can import it into scope
    |
 16 | use issue_21221_4::T;
-   | ^^^^^^^^^^^^^^^^^^^^^
+   |
 
 error: cannot continue compilation due to previous error
 
diff --git a/src/test/ui/resolve/issue-3907.stderr b/src/test/ui/resolve/issue-3907.stderr
index 56d3afd77e6..70b4599dbf8 100644
--- a/src/test/ui/resolve/issue-3907.stderr
+++ b/src/test/ui/resolve/issue-3907.stderr
@@ -7,7 +7,7 @@ error[E0404]: expected trait, found type alias `Foo`
 help: possible better candidate is found in another module, you can import it into scope
    |
 12 | use issue_3907::Foo;
-   | ^^^^^^^^^^^^^^^^^^^^
+   |
 
 error: cannot continue compilation due to previous error
 
diff --git a/src/test/ui/resolve/privacy-struct-ctor.stderr b/src/test/ui/resolve/privacy-struct-ctor.stderr
index c0b0fc63f22..57b143d34db 100644
--- a/src/test/ui/resolve/privacy-struct-ctor.stderr
+++ b/src/test/ui/resolve/privacy-struct-ctor.stderr
@@ -11,7 +11,7 @@ error[E0423]: expected value, found struct `Z`
 help: possible better candidate is found in another module, you can import it into scope
    |
 15 | use m::n::Z;
-   | ^^^^^^^^^^^^
+   |
 
 error[E0423]: expected value, found struct `S`
   --> $DIR/privacy-struct-ctor.rs:36:5
@@ -25,7 +25,7 @@ error[E0423]: expected value, found struct `S`
 help: possible better candidate is found in another module, you can import it into scope
    |
 13 | use m::S;
-   | ^^^^^^^^^
+   |
 
 error[E0423]: expected value, found struct `xcrate::S`
   --> $DIR/privacy-struct-ctor.rs:42:5
@@ -39,7 +39,7 @@ error[E0423]: expected value, found struct `xcrate::S`
 help: possible better candidate is found in another module, you can import it into scope
    |
 13 | use m::S;
-   | ^^^^^^^^^
+   |
 
 error[E0603]: tuple struct `Z` is private
   --> $DIR/privacy-struct-ctor.rs:25:9
diff --git a/src/test/ui/span/issue-35987.stderr b/src/test/ui/span/issue-35987.stderr
index b344f00cd88..0cd7e1046f6 100644
--- a/src/test/ui/span/issue-35987.stderr
+++ b/src/test/ui/span/issue-35987.stderr
@@ -7,7 +7,7 @@ error[E0404]: expected trait, found type parameter `Add`
 help: possible better candidate is found in another module, you can import it into scope
    |
 11 | use std::ops::Add;
-   | ^^^^^^^^^^^^^^^^^^
+   |
 
 error[E0601]: main function not found