Unify associated item parsing more.
This commit is contained in:
parent
0d8a9d74e3
commit
51ccdebe0b
@ -669,25 +669,6 @@ fn parse_impl_body(&mut self) -> PResult<'a, (Vec<AssocItem>, Vec<Attribute>)> {
|
|||||||
Ok((impl_items, attrs))
|
Ok((impl_items, attrs))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parses an impl item.
|
|
||||||
pub fn parse_impl_item(&mut self, at_end: &mut bool) -> PResult<'a, AssocItem> {
|
|
||||||
maybe_whole!(self, NtImplItem, |x| x);
|
|
||||||
let attrs = self.parse_outer_attributes()?;
|
|
||||||
let mut unclosed_delims = vec![];
|
|
||||||
let (mut item, tokens) = self.collect_tokens(|this| {
|
|
||||||
let item = this.parse_assoc_item(at_end, attrs, |_| true);
|
|
||||||
unclosed_delims.append(&mut this.unclosed_delims);
|
|
||||||
item
|
|
||||||
})?;
|
|
||||||
self.unclosed_delims.append(&mut unclosed_delims);
|
|
||||||
|
|
||||||
// See `parse_item` for why this clause is here.
|
|
||||||
if !item.attrs.iter().any(|attr| attr.style == AttrStyle::Inner) {
|
|
||||||
item.tokens = Some(tokens);
|
|
||||||
}
|
|
||||||
Ok(item)
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Parses defaultness (i.e., `default` or nothing).
|
/// Parses defaultness (i.e., `default` or nothing).
|
||||||
fn parse_defaultness(&mut self) -> Defaultness {
|
fn parse_defaultness(&mut self) -> Defaultness {
|
||||||
// `pub` is included for better error messages
|
// `pub` is included for better error messages
|
||||||
@ -802,20 +783,30 @@ fn parse_item_trait(&mut self, lo: Span, unsafety: Unsafety) -> PResult<'a, Item
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Parses the items in a trait declaration.
|
pub fn parse_impl_item(&mut self, at_end: &mut bool) -> PResult<'a, AssocItem> {
|
||||||
|
maybe_whole!(self, NtImplItem, |x| x);
|
||||||
|
self.parse_assoc_item(at_end, |_| true)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn parse_trait_item(&mut self, at_end: &mut bool) -> PResult<'a, AssocItem> {
|
pub fn parse_trait_item(&mut self, at_end: &mut bool) -> PResult<'a, AssocItem> {
|
||||||
maybe_whole!(self, NtTraitItem, |x| x);
|
maybe_whole!(self, NtTraitItem, |x| x);
|
||||||
|
// This is somewhat dubious; We don't want to allow
|
||||||
|
// param names to be left off if there is a definition...
|
||||||
|
//
|
||||||
|
// We don't allow param names to be left off in edition 2018.
|
||||||
|
self.parse_assoc_item(at_end, |t| t.span.rust_2018())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Parses associated items.
|
||||||
|
fn parse_assoc_item(
|
||||||
|
&mut self,
|
||||||
|
at_end: &mut bool,
|
||||||
|
is_name_required: fn(&token::Token) -> bool,
|
||||||
|
) -> PResult<'a, AssocItem> {
|
||||||
let attrs = self.parse_outer_attributes()?;
|
let attrs = self.parse_outer_attributes()?;
|
||||||
let mut unclosed_delims = vec![];
|
let mut unclosed_delims = vec![];
|
||||||
let (mut item, tokens) = self.collect_tokens(|this| {
|
let (mut item, tokens) = self.collect_tokens(|this| {
|
||||||
// This is somewhat dubious; We don't want to allow
|
let item = this.parse_assoc_item_(at_end, attrs, is_name_required);
|
||||||
// param names to be left off if there is a definition...
|
|
||||||
//
|
|
||||||
// We don't allow param names to be left off in edition 2018.
|
|
||||||
//
|
|
||||||
// FIXME(Centril): bake closure into param parsing.
|
|
||||||
// Also add semantic restrictions and add tests.
|
|
||||||
let item = this.parse_assoc_item(at_end, attrs, |t| t.span.rust_2018());
|
|
||||||
unclosed_delims.append(&mut this.unclosed_delims);
|
unclosed_delims.append(&mut this.unclosed_delims);
|
||||||
item
|
item
|
||||||
})?;
|
})?;
|
||||||
@ -827,7 +818,7 @@ pub fn parse_trait_item(&mut self, at_end: &mut bool) -> PResult<'a, AssocItem>
|
|||||||
Ok(item)
|
Ok(item)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_assoc_item(
|
fn parse_assoc_item_(
|
||||||
&mut self,
|
&mut self,
|
||||||
at_end: &mut bool,
|
at_end: &mut bool,
|
||||||
mut attrs: Vec<Attribute>,
|
mut attrs: Vec<Attribute>,
|
||||||
|
Loading…
Reference in New Issue
Block a user