Join multiple E0191 errors in the same location under a single diagnostic

This commit is contained in:
Esteban Küber 2018-11-08 18:11:37 -08:00
parent abdcb868ff
commit 286f7ae1dd
4 changed files with 33 additions and 27 deletions

View file

@ -1029,18 +1029,31 @@ impl<'o, 'gcx: 'tcx, 'tcx> dyn AstConv<'gcx, 'tcx>+'o {
associated_types.remove(&projection_bound.projection_def_id());
}
for item_def_id in associated_types {
let assoc_item = tcx.associated_item(item_def_id);
let trait_def_id = assoc_item.container.id();
if !associated_types.is_empty() {
let names = associated_types.iter().map(|item_def_id| {
let assoc_item = tcx.associated_item(*item_def_id);
let trait_def_id = assoc_item.container.id();
format!(
"`{}` (from the trait `{}`)",
assoc_item.ident,
tcx.item_path_str(trait_def_id),
)
}).collect::<Vec<_>>().join(", ");
let mut err = struct_span_err!(
tcx.sess,
span,
E0191,
"the value of the associated type `{}` (from the trait `{}`) must be specified",
assoc_item.ident,
tcx.item_path_str(trait_def_id),
"the value of the associated type{} {} must be specified",
if associated_types.len() == 1 { "" } else { "s" },
names,
);
err.span_label(span, format!("missing associated type `{}` value", assoc_item.ident));
for item_def_id in associated_types {
let assoc_item = tcx.associated_item(item_def_id);
err.span_label(
span,
format!("missing associated type `{}` value", assoc_item.ident),
);
}
err.emit();
}

View file

@ -37,6 +37,5 @@ pub fn main() {
//~^ ERROR the value of the associated type `A` (from the trait `Foo`) must be specified
let d = &42isize as &Foo;
//~^ ERROR the value of the associated type `A` (from the trait `Foo`) must be specified
//~| ERROR the value of the associated type `B` (from the trait `Foo`) must be specified
//~^ ERROR the value of the associated types `A` (from the trait `Foo`), `B` (from the trait
}

View file

@ -10,18 +10,15 @@ error[E0191]: the value of the associated type `A` (from the trait `Foo`) must b
LL | let c = &42isize as &Foo<B=char>;
| ^^^^^^^^^^^ missing associated type `A` value
error[E0191]: the value of the associated type `A` (from the trait `Foo`) must be specified
error[E0191]: the value of the associated types `A` (from the trait `Foo`), `B` (from the trait `Foo`) must be specified
--> $DIR/associated-types-incomplete-object.rs:39:26
|
LL | let d = &42isize as &Foo;
| ^^^ missing associated type `A` value
| ^^^
| |
| missing associated type `A` value
| missing associated type `B` value
error[E0191]: the value of the associated type `B` (from the trait `Foo`) must be specified
--> $DIR/associated-types-incomplete-object.rs:39:26
|
LL | let d = &42isize as &Foo;
| ^^^ missing associated type `B` value
error: aborting due to 4 previous errors
error: aborting due to 3 previous errors
For more information about this error, try `rustc --explain E0191`.

View file

@ -6,19 +6,16 @@ LL | pub struct Foo { i: Box<T<usize, usize, usize, usize, B=usize>> }
| |
| unexpected type argument
error[E0191]: the value of the associated type `A` (from the trait `T`) must be specified
error[E0191]: the value of the associated types `A` (from the trait `T`), `C` (from the trait `T`) must be specified
--> $DIR/E0107-b.rs:6:26
|
LL | pub struct Foo { i: Box<T<usize, usize, usize, usize, B=usize>> }
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing associated type `A` value
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| |
| missing associated type `A` value
| missing associated type `C` value
error[E0191]: the value of the associated type `C` (from the trait `T`) must be specified
--> $DIR/E0107-b.rs:6:26
|
LL | pub struct Foo { i: Box<T<usize, usize, usize, usize, B=usize>> }
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing associated type `C` value
error: aborting due to 3 previous errors
error: aborting due to 2 previous errors
Some errors occurred: E0107, E0191.
For more information about an error, try `rustc --explain E0107`.