improve error for impl<..> impl Trait for Type
This commit is contained in:
parent
69fef92ab2
commit
7fe83345ef
6 changed files with 97 additions and 4 deletions
|
@ -1519,6 +1519,16 @@ pub(crate) struct ExpectedTraitInTraitImplFoundType {
|
|||
pub span: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(parse_extra_impl_keyword_in_trait_impl)]
|
||||
pub(crate) struct ExtraImplKeywordInTraitImpl {
|
||||
#[primary_span]
|
||||
#[suggestion(code = "", applicability = "maybe-incorrect")]
|
||||
pub extra_impl_kw: Span,
|
||||
#[note]
|
||||
pub impl_trait_span: Span,
|
||||
}
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(parse_bounds_not_allowed_on_trait_aliases)]
|
||||
pub(crate) struct BoundsNotAllowedOnTraitAliases {
|
||||
|
|
|
@ -603,10 +603,24 @@ impl<'a> Parser<'a> {
|
|||
let path = match ty_first.kind {
|
||||
// This notably includes paths passed through `ty` macro fragments (#46438).
|
||||
TyKind::Path(None, path) => path,
|
||||
_ => {
|
||||
self.sess.emit_err(errors::ExpectedTraitInTraitImplFoundType {
|
||||
span: ty_first.span,
|
||||
});
|
||||
other => {
|
||||
if let TyKind::ImplTrait(_, bounds) = other
|
||||
&& let [bound] = bounds.as_slice()
|
||||
{
|
||||
// Suggest removing extra `impl` keyword:
|
||||
// `impl<T: Default> impl Default for Wrapper<T>`
|
||||
// ^^^^^
|
||||
let extra_impl_kw = ty_first.span.until(bound.span());
|
||||
self.sess
|
||||
.emit_err(errors::ExtraImplKeywordInTraitImpl {
|
||||
extra_impl_kw,
|
||||
impl_trait_span: ty_first.span
|
||||
});
|
||||
} else {
|
||||
self.sess.emit_err(errors::ExpectedTraitInTraitImplFoundType {
|
||||
span: ty_first.span,
|
||||
});
|
||||
}
|
||||
err_path(ty_first.span)
|
||||
}
|
||||
};
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue