Skip to content

Commit

Permalink
Only underline suggestion if it is not the only code being shown
Browse files Browse the repository at this point in the history
  • Loading branch information
estebank committed Jul 6, 2017
1 parent eb478e2 commit 697c85a
Show file tree
Hide file tree
Showing 16 changed files with 98 additions and 43 deletions.
23 changes: 11 additions & 12 deletions src/librustc_errors/emitter.rs
Expand Up @@ -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
Expand All @@ -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 {
Expand All @@ -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)?;
}
Expand Down
23 changes: 17 additions & 6 deletions src/librustc_errors/lib.rs
Expand Up @@ -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,
Expand All @@ -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
Expand Down Expand Up @@ -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) {
Expand All @@ -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);
Expand Down
2 changes: 1 addition & 1 deletion src/libsyntax/json.rs
Expand Up @@ -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()
}
}

8 changes: 6 additions & 2 deletions src/test/ui/block-result/unexpected-return-on-unit.stderr
Expand Up @@ -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

15 changes: 14 additions & 1 deletion src/test/ui/issue-22644.rs
Expand Up @@ -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);
}
36 changes: 28 additions & 8 deletions src/test/ui/issue-22644.stderr
Expand Up @@ -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

6 changes: 3 additions & 3 deletions src/test/ui/resolve/enums-are-namespaced-xc.stderr
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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

2 changes: 2 additions & 0 deletions src/test/ui/resolve/issue-16058.stderr
Expand Up @@ -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;
|

Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/resolve/issue-17518.stderr
Expand Up @@ -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

8 changes: 7 additions & 1 deletion src/test/ui/resolve/issue-21221-1.stderr
Expand Up @@ -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;
|

Expand All @@ -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
Expand All @@ -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

2 changes: 1 addition & 1 deletion src/test/ui/resolve/issue-21221-2.stderr
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/resolve/issue-21221-3.stderr
Expand Up @@ -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

2 changes: 1 addition & 1 deletion src/test/ui/resolve/issue-21221-4.stderr
Expand Up @@ -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

2 changes: 1 addition & 1 deletion src/test/ui/resolve/issue-3907.stderr
Expand Up @@ -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

6 changes: 3 additions & 3 deletions src/test/ui/resolve/privacy-struct-ctor.stderr
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/test/ui/span/issue-35987.stderr
Expand Up @@ -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

Expand Down

0 comments on commit 697c85a

Please sign in to comment.