syntax: extract parse_derive_paths

This commit is contained in:
Mazdak Farrokhzad 2019-10-08 09:06:07 +02:00
parent 9dba03f6cd
commit 7d7969d065
3 changed files with 20 additions and 19 deletions

View file

@ -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> {

View file

@ -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

View file

@ -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>,