Set tokens on AST node in collect_tokens
A new `HasTokens` trait is introduced, which is used to move logic from the callers of `collect_tokens` into the body of `collect_tokens`. In addition to reducing duplication, this paves the way for PR #80689, which needs to perform additional logic during token collection.
This commit is contained in:
parent
9bc8b00b4a
commit
a961e6785c
7 changed files with 101 additions and 147 deletions
|
@ -89,7 +89,7 @@ impl<'a> Parser<'a> {
|
|||
inner_parse_policy, self.token
|
||||
);
|
||||
let lo = self.token.span;
|
||||
let ((item, style, span), tokens) = self.collect_tokens(|this| {
|
||||
self.collect_tokens(|this| {
|
||||
if this.eat(&token::Pound) {
|
||||
let style = if this.eat(&token::Not) {
|
||||
ast::AttrStyle::Inner
|
||||
|
@ -107,15 +107,13 @@ impl<'a> Parser<'a> {
|
|||
this.error_on_forbidden_inner_attr(attr_sp, inner_parse_policy);
|
||||
}
|
||||
|
||||
Ok((item, style, attr_sp))
|
||||
Ok(attr::mk_attr_from_item(item, None, style, attr_sp))
|
||||
} else {
|
||||
let token_str = pprust::token_to_string(&this.token);
|
||||
let msg = &format!("expected `#`, found `{}`", token_str);
|
||||
Err(this.struct_span_err(this.token.span, msg))
|
||||
}
|
||||
})?;
|
||||
|
||||
Ok(attr::mk_attr_from_item(item, tokens, style, span))
|
||||
})
|
||||
}
|
||||
|
||||
pub(super) fn error_on_forbidden_inner_attr(&self, attr_sp: Span, policy: InnerAttrPolicy<'_>) {
|
||||
|
@ -165,13 +163,7 @@ impl<'a> Parser<'a> {
|
|||
let args = this.parse_attr_args()?;
|
||||
Ok(ast::AttrItem { path, args, tokens: None })
|
||||
};
|
||||
if capture_tokens {
|
||||
let (mut item, tokens) = self.collect_tokens(do_parse)?;
|
||||
item.tokens = tokens;
|
||||
item
|
||||
} else {
|
||||
do_parse(self)?
|
||||
}
|
||||
if capture_tokens { self.collect_tokens(do_parse) } else { do_parse(self) }?
|
||||
})
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue