parse dyn (Foo) as a trait object
This commit is contained in:
@@ -405,11 +405,14 @@ impl TokenType {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns true if `IDENT t` can start a type - `IDENT::a::b`, `IDENT<u8, u8>`,
|
/// Returns true if `IDENT t` can start a type - `IDENT::a::b`, `IDENT<u8, u8>`,
|
||||||
// `IDENT<<u8 as Trait>::AssocTy>`, `IDENT(u8, u8) -> u8`.
|
/// `IDENT<<u8 as Trait>::AssocTy>`.
|
||||||
fn can_continue_type_after_ident(t: &token::Token) -> bool {
|
///
|
||||||
|
/// Types can also be of the form `IDENT(u8, u8) -> u8`, however this assumes
|
||||||
|
/// that IDENT is not the ident of a fn trait
|
||||||
|
fn can_continue_type_after_non_fn_ident(t: &token::Token) -> bool {
|
||||||
t == &token::ModSep || t == &token::Lt ||
|
t == &token::ModSep || t == &token::Lt ||
|
||||||
t == &token::BinOp(token::Shl) || t == &token::OpenDelim(token::Paren)
|
t == &token::BinOp(token::Shl)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Information about the path to a module.
|
/// Information about the path to a module.
|
||||||
@@ -1619,7 +1622,8 @@ impl<'a> Parser<'a> {
|
|||||||
impl_dyn_multi = bounds.len() > 1 || self.prev_token_kind == PrevTokenKind::Plus;
|
impl_dyn_multi = bounds.len() > 1 || self.prev_token_kind == PrevTokenKind::Plus;
|
||||||
TyKind::ImplTrait(bounds)
|
TyKind::ImplTrait(bounds)
|
||||||
} else if self.check_keyword(keywords::Dyn) &&
|
} else if self.check_keyword(keywords::Dyn) &&
|
||||||
self.look_ahead(1, |t| t.can_begin_bound() && !can_continue_type_after_ident(t)) {
|
self.look_ahead(1, |t| t.can_begin_bound() &&
|
||||||
|
!can_continue_type_after_non_fn_ident(t)) {
|
||||||
self.bump(); // `dyn`
|
self.bump(); // `dyn`
|
||||||
// Always parse bounds greedily for better error recovery.
|
// Always parse bounds greedily for better error recovery.
|
||||||
let bounds = self.parse_ty_param_bounds()?;
|
let bounds = self.parse_ty_param_bounds()?;
|
||||||
|
|||||||
Reference in New Issue
Block a user