Skip to content

Commit

Permalink
Improve E0178 suggestion placement
Browse files Browse the repository at this point in the history
  • Loading branch information
oli-obk committed Apr 25, 2017
1 parent 3a5567b commit f4b1e2a
Show file tree
Hide file tree
Showing 7 changed files with 60 additions and 23 deletions.
9 changes: 6 additions & 3 deletions src/librustc_errors/emitter.rs
Expand Up @@ -37,9 +37,12 @@ impl Emitter for EmitterWriter {

if let Some(sugg) = db.suggestion.clone() {
assert_eq!(sugg.msp.primary_spans().len(), sugg.substitutes.len());
if sugg.substitutes.len() == 1 && // don't display multispans as labels
sugg.msg.split_whitespace().count() < 10 && // don't display long messages as labels
sugg.substitutes[0].find('\n').is_none() { // don't display multiline suggestions as labels
// don't display multispans as labels
if sugg.substitutes.len() == 1 &&
// don't display long messages as labels
sugg.msg.split_whitespace().count() < 10 &&
// don't display multiline suggestions as labels
sugg.substitutes[0].find('\n').is_none() {
let msg = format!("{} `{}`", sugg.msg, sugg.substitutes[0]);
primary_span.push_span_label(sugg.msp.primary_spans()[0], msg);
} else {
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_typeck/diagnostics.rs
Expand Up @@ -3185,7 +3185,7 @@ implementing traits from `std::ops`.
String concatenation appends the string on the right to the string on the
left and may require reallocation. This requires ownership of the string
on the left. If something should be added to a string literal, move the
literal to the heap by allocating it with `to_owned()` like in
literal to the heap by allocating it with `to_owned()` like in
`"Your text".to_owned()`.
"##,
Expand Down
9 changes: 5 additions & 4 deletions src/libsyntax/parse/parser.rs
Expand Up @@ -1490,9 +1490,8 @@ impl<'a> Parser<'a> {
let bounds = self.parse_ty_param_bounds()?;
let sum_span = ty.span.to(self.prev_span);

let mut err = struct_span_err!(self.sess.span_diagnostic, ty.span, E0178,
let mut err = struct_span_err!(self.sess.span_diagnostic, sum_span, E0178,
"expected a path on the left-hand side of `+`, not `{}`", pprust::ty_to_string(&ty));
err.span_label(ty.span, &format!("expected a path"));

match ty.node {
TyKind::Rptr(ref lifetime, ref mut_ty) => {
Expand All @@ -1511,9 +1510,11 @@ impl<'a> Parser<'a> {
err.span_suggestion(sum_span, "try adding parentheses:", sum_with_parens);
}
TyKind::Ptr(..) | TyKind::BareFn(..) => {
help!(&mut err, "perhaps you forgot parentheses?");
err.span_label(sum_span, &"perhaps you forgot parentheses?");
}
_ => {}
_ => {
err.span_label(sum_span, &"expected a path");
},
}
err.emit();
Ok(())
Expand Down
Expand Up @@ -12,17 +12,9 @@ trait Foo {}

struct Bar<'a> {
w: &'a Foo + Copy,
//~^ ERROR E0178
//~| NOTE expected a path
x: &'a Foo + 'a,
//~^ ERROR E0178
//~| NOTE expected a path
y: &'a mut Foo + 'a,
//~^ ERROR E0178
//~| NOTE expected a path
z: fn() -> Foo + 'a,
//~^ ERROR E0178
//~| NOTE expected a path
}

fn main() {
Expand Down
26 changes: 26 additions & 0 deletions src/test/ui/did_you_mean/E0178.stderr
@@ -0,0 +1,26 @@
error[E0178]: expected a path on the left-hand side of `+`, not `&'a Foo`
--> $DIR/E0178.rs:14:8
|
14 | w: &'a Foo + Copy,
| ^^^^^^^^^^^^^^ try adding parentheses: `&'a (Foo + Copy)`

error[E0178]: expected a path on the left-hand side of `+`, not `&'a Foo`
--> $DIR/E0178.rs:15:8
|
15 | x: &'a Foo + 'a,
| ^^^^^^^^^^^^ try adding parentheses: `&'a (Foo + 'a)`

error[E0178]: expected a path on the left-hand side of `+`, not `&'a mut Foo`
--> $DIR/E0178.rs:16:8
|
16 | y: &'a mut Foo + 'a,
| ^^^^^^^^^^^^^^^^ try adding parentheses: `&'a mut (Foo + 'a)`

error[E0178]: expected a path on the left-hand side of `+`, not `fn() -> Foo`
--> $DIR/E0178.rs:17:8
|
17 | z: fn() -> Foo + 'a,
| ^^^^^^^^^^^^^^^^ perhaps you forgot parentheses?

error: aborting due to 4 previous errors

Expand Up @@ -10,12 +10,5 @@

fn main() {
let _: &Copy + 'static;
//~^ ERROR expected a path
//~| HELP try adding parentheses
//~| SUGGESTION let _: &(Copy + 'static);
//~| ERROR the trait `std::marker::Copy` cannot be made into an object
let _: &'static Copy + 'static;
//~^ ERROR expected a path
//~| HELP try adding parentheses
//~| SUGGESTION let _: &'static (Copy + 'static);
}
@@ -0,0 +1,22 @@
error[E0178]: expected a path on the left-hand side of `+`, not `&Copy`
--> $DIR/trait-object-reference-without-parens-suggestion.rs:12:12
|
12 | let _: &Copy + 'static;
| ^^^^^^^^^^^^^^^ try adding parentheses: `&(Copy + 'static)`

error[E0178]: expected a path on the left-hand side of `+`, not `&'static Copy`
--> $DIR/trait-object-reference-without-parens-suggestion.rs:13:12
|
13 | let _: &'static Copy + 'static;
| ^^^^^^^^^^^^^^^^^^^^^^^ try adding parentheses: `&'static (Copy + 'static)`

error[E0038]: the trait `std::marker::Copy` cannot be made into an object
--> $DIR/trait-object-reference-without-parens-suggestion.rs:12:12
|
12 | let _: &Copy + 'static;
| ^^^^^ the trait `std::marker::Copy` cannot be made into an object
|
= note: the trait cannot require that `Self : Sized`

error: aborting due to previous error

0 comments on commit f4b1e2a

Please sign in to comment.