derive: avoid parse_in_attr
This commit is contained in:
parent
bbcda98d41
commit
cbc9f68312
7 changed files with 90 additions and 80 deletions
|
@ -3,7 +3,6 @@ use crate::maybe_whole;
|
|||
use rustc_errors::{PResult, Applicability, pluralize};
|
||||
use syntax::ast::{self, QSelf, Path, PathSegment, Ident, ParenthesizedArgs, AngleBracketedArgs};
|
||||
use syntax::ast::{AnonConst, GenericArg, AssocTyConstraint, AssocTyConstraintKind, BlockCheckMode};
|
||||
use syntax::ast::MacArgs;
|
||||
use syntax::ThinVec;
|
||||
use syntax::token::{self, Token};
|
||||
use syntax_pos::source_map::{Span, BytePos};
|
||||
|
@ -109,42 +108,6 @@ impl<'a> Parser<'a> {
|
|||
Ok(Path { segments, span: lo.to(self.prev_span) })
|
||||
}
|
||||
|
||||
/// 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.
|
||||
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.args {
|
||||
MacArgs::Empty => Some(item.path.clone()),
|
||||
_ => None,
|
||||
},
|
||||
_ => None,
|
||||
},
|
||||
_ => None,
|
||||
};
|
||||
if let Some(path) = meta_ident {
|
||||
self.bump();
|
||||
return Ok(path);
|
||||
}
|
||||
self.parse_path(style)
|
||||
}
|
||||
|
||||
/// Parse a list of paths inside `#[derive(path_0, ..., path_n)]`.
|
||||
pub 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)
|
||||
}
|
||||
|
||||
pub(super) fn parse_path_segments(
|
||||
&mut self,
|
||||
segments: &mut Vec<PathSegment>,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue