Improve error messages for bad type constraints

Co-authored-by: Esteban Kuber <esteban@kuber.com.ar>
This commit is contained in:
Michael Howell 2021-09-28 12:48:58 -07:00
parent 8a7c1306b4
commit befdfb5c71
5 changed files with 34 additions and 30 deletions

View file

@ -495,25 +495,28 @@ impl<'a> Parser<'a> {
None => {
let after_eq = eq.shrink_to_hi();
let before_next = self.token.span.shrink_to_lo();
let the_type_placeholder = if matches!(self.token.kind, token::Comma | token::Gt) {
" TheType"
} else {
" TheType "
};
self.struct_span_err(after_eq.to(before_next), "missing type to the right of `=`")
.span_suggestion(
let mut err = self
.struct_span_err(after_eq.to(before_next), "missing type to the right of `=`");
if matches!(self.token.kind, token::Comma | token::Gt) {
err.span_suggestion(
self.sess.source_map().next_point(eq).to(before_next),
"to constrain the associated type, add a type after `=`",
the_type_placeholder.to_string(),
" TheType".to_string(),
Applicability::HasPlaceholders,
)
.span_suggestion(
);
err.span_suggestion(
eq.to(before_next),
&format!("remove the `=` if `{}` is a type", ident),
String::new(),
Applicability::MaybeIncorrect,
)
.emit();
} else {
err.span_label(
self.token.span,
&format!("expected type, found {}", super::token_descr(&self.token)),
)
};
return Err(err);
}
}
Ok(self.mk_ty(span, ast::TyKind::Err))
@ -584,6 +587,12 @@ impl<'a> Parser<'a> {
"expected lifetime, type, or constant, found keyword `const`",
);
if self.check_const_arg() {
err.span_suggestion_verbose(
start.until(self.token.span),
"the `const` keyword is only needed in the definition of the type",
String::new(),
Applicability::MaybeIncorrect,
);
err.emit();
GenericArg::Const(self.parse_const_arg()?)
} else {