syntax: extract parse_derive_paths
This commit is contained in:
parent
9dba03f6cd
commit
7d7969d065
3 changed files with 20 additions and 19 deletions
|
|
@ -298,24 +298,12 @@ impl Attribute {
|
|||
Ok(result)
|
||||
}
|
||||
|
||||
pub fn parse_list<'a, T, F>(&self, sess: &'a ParseSess, mut f: F) -> PResult<'a, Vec<T>>
|
||||
where F: FnMut(&mut Parser<'a>) -> PResult<'a, T>,
|
||||
{
|
||||
pub fn parse_derive_paths<'a>(&self, sess: &'a ParseSess) -> PResult<'a, Vec<Path>> {
|
||||
if self.tokens.is_empty() {
|
||||
return Ok(Vec::new());
|
||||
}
|
||||
self.parse(sess, |parser| {
|
||||
parser.expect(&token::OpenDelim(token::Paren))?;
|
||||
let mut list = Vec::new();
|
||||
while !parser.eat(&token::CloseDelim(token::Paren)) {
|
||||
list.push(f(parser)?);
|
||||
if !parser.eat(&token::Comma) {
|
||||
parser.expect(&token::CloseDelim(token::Paren))?;
|
||||
break
|
||||
}
|
||||
}
|
||||
Ok(list)
|
||||
})
|
||||
|
||||
self.parse(sess, |p| p.parse_derive_paths())
|
||||
}
|
||||
|
||||
pub fn parse_meta<'a>(&self, sess: &'a ParseSess) -> PResult<'a, MetaItem> {
|
||||
|
|
|
|||
|
|
@ -4,7 +4,6 @@ use crate::errors::{Applicability, FatalError};
|
|||
use crate::ext::base::{self, *};
|
||||
use crate::ext::proc_macro_server;
|
||||
use crate::parse::{self, token};
|
||||
use crate::parse::parser::PathStyle;
|
||||
use crate::symbol::sym;
|
||||
use crate::tokenstream::{self, TokenStream};
|
||||
use crate::visit::Visitor;
|
||||
|
|
@ -205,8 +204,7 @@ crate fn collect_derives(cx: &mut ExtCtxt<'_>, attrs: &mut Vec<ast::Attribute>)
|
|||
return false;
|
||||
}
|
||||
|
||||
match attr.parse_list(cx.parse_sess,
|
||||
|parser| parser.parse_path_allowing_meta(PathStyle::Mod)) {
|
||||
match attr.parse_derive_paths(cx.parse_sess) {
|
||||
Ok(traits) => {
|
||||
result.extend(traits);
|
||||
true
|
||||
|
|
|
|||
|
|
@ -111,7 +111,7 @@ impl<'a> Parser<'a> {
|
|||
/// Like `parse_path`, but also supports parsing `Word` meta items into paths for
|
||||
/// backwards-compatibility. This is used when parsing derive macro paths in `#[derive]`
|
||||
/// attributes.
|
||||
pub fn parse_path_allowing_meta(&mut self, style: PathStyle) -> PResult<'a, Path> {
|
||||
fn parse_path_allowing_meta(&mut self, style: PathStyle) -> PResult<'a, Path> {
|
||||
let meta_ident = match self.token.kind {
|
||||
token::Interpolated(ref nt) => match **nt {
|
||||
token::NtMeta(ref item) => match item.tokens.is_empty() {
|
||||
|
|
@ -129,6 +129,21 @@ impl<'a> Parser<'a> {
|
|||
self.parse_path(style)
|
||||
}
|
||||
|
||||
/// Parse a list of paths inside `#[derive(path_0, ..., path_n)]`.
|
||||
crate fn parse_derive_paths(&mut self) -> PResult<'a, Vec<Path>> {
|
||||
self.expect(&token::OpenDelim(token::Paren))?;
|
||||
let mut list = Vec::new();
|
||||
while !self.eat(&token::CloseDelim(token::Paren)) {
|
||||
let path = self.parse_path_allowing_meta(PathStyle::Mod)?;
|
||||
list.push(path);
|
||||
if !self.eat(&token::Comma) {
|
||||
self.expect(&token::CloseDelim(token::Paren))?;
|
||||
break
|
||||
}
|
||||
}
|
||||
Ok(list)
|
||||
}
|
||||
|
||||
crate fn parse_path_segments(
|
||||
&mut self,
|
||||
segments: &mut Vec<PathSegment>,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue