From 697c85a4f15b8dd560fb1f78129f5bfdd4baf1f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Esteban=20K=C3=BCber?= Date: Wed, 5 Jul 2017 16:39:06 -0700 Subject: [PATCH] Only underline suggestion if it is not the only code being shown --- src/librustc_errors/emitter.rs | 23 ++++++------ src/librustc_errors/lib.rs | 23 ++++++++---- src/libsyntax/json.rs | 2 +- .../unexpected-return-on-unit.stderr | 8 +++-- src/test/ui/issue-22644.rs | 15 +++++++- src/test/ui/issue-22644.stderr | 36 ++++++++++++++----- .../ui/resolve/enums-are-namespaced-xc.stderr | 6 ++-- src/test/ui/resolve/issue-16058.stderr | 2 ++ src/test/ui/resolve/issue-17518.stderr | 2 +- src/test/ui/resolve/issue-21221-1.stderr | 8 ++++- src/test/ui/resolve/issue-21221-2.stderr | 2 +- src/test/ui/resolve/issue-21221-3.stderr | 2 +- src/test/ui/resolve/issue-21221-4.stderr | 2 +- src/test/ui/resolve/issue-3907.stderr | 2 +- .../ui/resolve/privacy-struct-ctor.stderr | 6 ++-- src/test/ui/span/issue-35987.stderr | 2 +- 16 files changed, 98 insertions(+), 43 deletions(-) diff --git a/src/librustc_errors/emitter.rs b/src/librustc_errors/emitter.rs index 99342351d92c..a6a45c8b5023 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 dd25f9694140..7fb75a263f93 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 { + /// 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 e60edafe4ee4..909b0031d615 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 { - 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 68afd2084f10..c8743c72e310 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 9269180396c5..e8a2db4048c4 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 f9702d43ad51..af61571625b7 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: aborting due to 2 previous errors +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 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 525dd4fe8f1c..4b32ecff2fbd 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 7abf6e3d5fde..6d7406f891c5 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 d7017f301452..2f94dbdc2c59 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 ce5ed7b5e5db..ddaee451e90e 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 bca3667d60ba..a759116c6acf 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 f364fb590abc..f4d183192b6c 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 a022ca0749d3..eb71ee893ce7 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 56d3afd77e63..70b4599dbf8c 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 c0b0fc63f22b..57b143d34dbd 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 b344f00cd88f..0cd7e1046f6c 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