Remove NtVis
.
We now use invisible delimiters for expanded `vis` fragments, instead of `Token::Interpolated`.
This commit is contained in:
parent
5986ff05d8
commit
c7981d6411
8 changed files with 110 additions and 18 deletions
|
@ -721,6 +721,43 @@ impl<'a> Parser<'a> {
|
|||
if !self.eat_keyword(exp) { self.unexpected() } else { Ok(()) }
|
||||
}
|
||||
|
||||
/// Consume a sequence produced by a metavar expansion, if present.
|
||||
fn eat_metavar_seq<T>(
|
||||
&mut self,
|
||||
mv_kind: MetaVarKind,
|
||||
f: impl FnMut(&mut Parser<'a>) -> PResult<'a, T>,
|
||||
) -> Option<T> {
|
||||
self.eat_metavar_seq_with_matcher(|mvk| mvk == mv_kind, f)
|
||||
}
|
||||
|
||||
/// A slightly more general form of `eat_metavar_seq`, for use with the
|
||||
/// `MetaVarKind` variants that have parameters, where an exact match isn't
|
||||
/// desired.
|
||||
fn eat_metavar_seq_with_matcher<T>(
|
||||
&mut self,
|
||||
match_mv_kind: impl Fn(MetaVarKind) -> bool,
|
||||
mut f: impl FnMut(&mut Parser<'a>) -> PResult<'a, T>,
|
||||
) -> Option<T> {
|
||||
if let token::OpenDelim(delim) = self.token.kind
|
||||
&& let Delimiter::Invisible(InvisibleOrigin::MetaVar(mv_kind)) = delim
|
||||
&& match_mv_kind(mv_kind)
|
||||
{
|
||||
self.bump();
|
||||
let res = f(self).expect("failed to reparse {mv_kind:?}");
|
||||
if let token::CloseDelim(delim) = self.token.kind
|
||||
&& let Delimiter::Invisible(InvisibleOrigin::MetaVar(mv_kind)) = delim
|
||||
&& match_mv_kind(mv_kind)
|
||||
{
|
||||
self.bump();
|
||||
Some(res)
|
||||
} else {
|
||||
panic!("no close delim when reparsing {mv_kind:?}");
|
||||
}
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
/// Is the given keyword `kw` followed by a non-reserved identifier?
|
||||
fn is_kw_followed_by_ident(&self, kw: Symbol) -> bool {
|
||||
self.token.is_keyword(kw) && self.look_ahead(1, |t| t.is_ident() && !t.is_reserved_ident())
|
||||
|
@ -1455,7 +1492,11 @@ impl<'a> Parser<'a> {
|
|||
/// so emit a proper diagnostic.
|
||||
// Public for rustfmt usage.
|
||||
pub fn parse_visibility(&mut self, fbt: FollowedByType) -> PResult<'a, Visibility> {
|
||||
maybe_whole!(self, NtVis, |vis| vis.into_inner());
|
||||
if let Some(vis) = self
|
||||
.eat_metavar_seq(MetaVarKind::Vis, |this| this.parse_visibility(FollowedByType::Yes))
|
||||
{
|
||||
return Ok(vis);
|
||||
}
|
||||
|
||||
if !self.eat_keyword(exp!(Pub)) {
|
||||
// We need a span for our `Spanned<VisibilityKind>`, but there's inherently no
|
||||
|
@ -1683,7 +1724,8 @@ pub enum ParseNtResult {
|
|||
Tt(TokenTree),
|
||||
Ident(Ident, IdentIsRaw),
|
||||
Lifetime(Ident, IdentIsRaw),
|
||||
Vis(P<ast::Visibility>),
|
||||
|
||||
/// This case will eventually be removed, along with `Token::Interpolate`.
|
||||
/// This variant will eventually be removed, along with `Token::Interpolate`.
|
||||
Nt(Arc<Nonterminal>),
|
||||
}
|
||||
|
|
|
@ -56,9 +56,7 @@ impl<'a> Parser<'a> {
|
|||
| NtMeta(_)
|
||||
| NtPath(_) => true,
|
||||
|
||||
NtItem(_)
|
||||
| NtBlock(_)
|
||||
| NtVis(_) => false,
|
||||
NtItem(_) | NtBlock(_) => false,
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -88,7 +86,7 @@ impl<'a> Parser<'a> {
|
|||
NonterminalKind::Ident => get_macro_ident(token).is_some(),
|
||||
NonterminalKind::Literal => token.can_begin_literal_maybe_minus(),
|
||||
NonterminalKind::Vis => match token.kind {
|
||||
// The follow-set of :vis + "priv" keyword + interpolated
|
||||
// The follow-set of :vis + "priv" keyword + interpolated/metavar-expansion.
|
||||
token::Comma
|
||||
| token::Ident(..)
|
||||
| token::NtIdent(..)
|
||||
|
@ -102,7 +100,7 @@ impl<'a> Parser<'a> {
|
|||
token::NtLifetime(..) => true,
|
||||
token::Interpolated(nt) => match &**nt {
|
||||
NtBlock(_) | NtStmt(_) | NtExpr(_) | NtLiteral(_) => true,
|
||||
NtItem(_) | NtPat(_) | NtTy(_) | NtMeta(_) | NtPath(_) | NtVis(_) => false,
|
||||
NtItem(_) | NtPat(_) | NtTy(_) | NtMeta(_) | NtPath(_) => false,
|
||||
},
|
||||
token::OpenDelim(Delimiter::Invisible(InvisibleOrigin::MetaVar(k))) => match k {
|
||||
MetaVarKind::Block
|
||||
|
@ -208,8 +206,9 @@ impl<'a> Parser<'a> {
|
|||
}
|
||||
NonterminalKind::Meta => NtMeta(P(self.parse_attr_item(ForceCollect::Yes)?)),
|
||||
NonterminalKind::Vis => {
|
||||
NtVis(P(self
|
||||
.collect_tokens_no_attrs(|this| this.parse_visibility(FollowedByType::Yes))?))
|
||||
return Ok(ParseNtResult::Vis(P(self.collect_tokens_no_attrs(|this| {
|
||||
this.parse_visibility(FollowedByType::Yes)
|
||||
})?)));
|
||||
}
|
||||
NonterminalKind::Lifetime => {
|
||||
// We want to keep `'keyword` parsing, just like `keyword` is still
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue