Remove NtBlock, Nonterminal, and TokenKind::Interpolated.
`NtBlock` is the last remaining variant of `Nonterminal`, so once it is gone then `Nonterminal` can be removed as well.
This commit is contained in:
@@ -1,14 +1,7 @@
|
||||
use std::sync::Arc;
|
||||
|
||||
use rustc_ast::HasTokens;
|
||||
use rustc_ast::ptr::P;
|
||||
use rustc_ast::token::Nonterminal::*;
|
||||
use rustc_ast::token::NtExprKind::*;
|
||||
use rustc_ast::token::NtPatKind::*;
|
||||
use rustc_ast::token::{
|
||||
self, Delimiter, InvisibleOrigin, MetaVarKind, Nonterminal, NonterminalKind, Token,
|
||||
};
|
||||
use rustc_ast_pretty::pprust;
|
||||
use rustc_ast::token::{self, Delimiter, InvisibleOrigin, MetaVarKind, NonterminalKind, Token};
|
||||
use rustc_errors::PResult;
|
||||
use rustc_span::{Ident, kw};
|
||||
|
||||
@@ -45,13 +38,6 @@ impl<'a> Parser<'a> {
|
||||
}
|
||||
}
|
||||
|
||||
/// Old variant of `may_be_ident`. Being phased out.
|
||||
fn nt_may_be_ident(nt: &Nonterminal) -> bool {
|
||||
match nt {
|
||||
NtBlock(_) => false,
|
||||
}
|
||||
}
|
||||
|
||||
match kind {
|
||||
// `expr_2021` and earlier
|
||||
NonterminalKind::Expr(Expr2021 { .. }) => {
|
||||
@@ -83,16 +69,12 @@ impl<'a> Parser<'a> {
|
||||
| token::Ident(..)
|
||||
| token::NtIdent(..)
|
||||
| token::NtLifetime(..)
|
||||
| token::Interpolated(_)
|
||||
| token::OpenDelim(Delimiter::Invisible(InvisibleOrigin::MetaVar(_))) => true,
|
||||
_ => token.can_begin_type(),
|
||||
},
|
||||
NonterminalKind::Block => match &token.kind {
|
||||
token::OpenDelim(Delimiter::Brace) => true,
|
||||
token::NtLifetime(..) => true,
|
||||
token::Interpolated(nt) => match &**nt {
|
||||
NtBlock(_) => true,
|
||||
},
|
||||
token::OpenDelim(Delimiter::Invisible(InvisibleOrigin::MetaVar(k))) => match k {
|
||||
MetaVarKind::Block
|
||||
| MetaVarKind::Stmt
|
||||
@@ -112,7 +94,6 @@ impl<'a> Parser<'a> {
|
||||
},
|
||||
NonterminalKind::Path | NonterminalKind::Meta => match &token.kind {
|
||||
token::PathSep | token::Ident(..) | token::NtIdent(..) => true,
|
||||
token::Interpolated(nt) => nt_may_be_ident(nt),
|
||||
token::OpenDelim(Delimiter::Invisible(InvisibleOrigin::MetaVar(kind))) => {
|
||||
may_be_ident(*kind)
|
||||
}
|
||||
@@ -136,62 +117,52 @@ impl<'a> Parser<'a> {
|
||||
// A `macro_rules!` invocation may pass a captured item/expr to a proc-macro,
|
||||
// which requires having captured tokens available. Since we cannot determine
|
||||
// in advance whether or not a proc-macro will be (transitively) invoked,
|
||||
// we always capture tokens for any `Nonterminal` which needs them.
|
||||
let mut nt = match kind {
|
||||
// we always capture tokens for any nonterminal that needs them.
|
||||
match kind {
|
||||
// Note that TT is treated differently to all the others.
|
||||
NonterminalKind::TT => return Ok(ParseNtResult::Tt(self.parse_token_tree())),
|
||||
NonterminalKind::TT => Ok(ParseNtResult::Tt(self.parse_token_tree())),
|
||||
NonterminalKind::Item => match self.parse_item(ForceCollect::Yes)? {
|
||||
Some(item) => return Ok(ParseNtResult::Item(item)),
|
||||
None => {
|
||||
return Err(self
|
||||
.dcx()
|
||||
.create_err(UnexpectedNonterminal::Item(self.token.span)));
|
||||
}
|
||||
Some(item) => Ok(ParseNtResult::Item(item)),
|
||||
None => Err(self.dcx().create_err(UnexpectedNonterminal::Item(self.token.span))),
|
||||
},
|
||||
NonterminalKind::Block => {
|
||||
// While a block *expression* may have attributes (e.g. `#[my_attr] { ... }`),
|
||||
// the ':block' matcher does not support them
|
||||
NtBlock(self.collect_tokens_no_attrs(|this| this.parse_block())?)
|
||||
Ok(ParseNtResult::Block(self.collect_tokens_no_attrs(|this| this.parse_block())?))
|
||||
}
|
||||
NonterminalKind::Stmt => match self.parse_stmt(ForceCollect::Yes)? {
|
||||
Some(stmt) => return Ok(ParseNtResult::Stmt(P(stmt))),
|
||||
Some(stmt) => Ok(ParseNtResult::Stmt(P(stmt))),
|
||||
None => {
|
||||
return Err(self
|
||||
.dcx()
|
||||
.create_err(UnexpectedNonterminal::Statement(self.token.span)));
|
||||
Err(self.dcx().create_err(UnexpectedNonterminal::Statement(self.token.span)))
|
||||
}
|
||||
},
|
||||
NonterminalKind::Pat(pat_kind) => {
|
||||
return Ok(ParseNtResult::Pat(
|
||||
self.collect_tokens_no_attrs(|this| match pat_kind {
|
||||
PatParam { .. } => this.parse_pat_no_top_alt(None, None),
|
||||
PatWithOr => this.parse_pat_no_top_guard(
|
||||
None,
|
||||
RecoverComma::No,
|
||||
RecoverColon::No,
|
||||
CommaRecoveryMode::EitherTupleOrPipe,
|
||||
),
|
||||
})?,
|
||||
pat_kind,
|
||||
));
|
||||
}
|
||||
NonterminalKind::Pat(pat_kind) => Ok(ParseNtResult::Pat(
|
||||
self.collect_tokens_no_attrs(|this| match pat_kind {
|
||||
PatParam { .. } => this.parse_pat_no_top_alt(None, None),
|
||||
PatWithOr => this.parse_pat_no_top_guard(
|
||||
None,
|
||||
RecoverComma::No,
|
||||
RecoverColon::No,
|
||||
CommaRecoveryMode::EitherTupleOrPipe,
|
||||
),
|
||||
})?,
|
||||
pat_kind,
|
||||
)),
|
||||
NonterminalKind::Expr(expr_kind) => {
|
||||
return Ok(ParseNtResult::Expr(self.parse_expr_force_collect()?, expr_kind));
|
||||
Ok(ParseNtResult::Expr(self.parse_expr_force_collect()?, expr_kind))
|
||||
}
|
||||
NonterminalKind::Literal => {
|
||||
// The `:literal` matcher does not support attributes.
|
||||
return Ok(ParseNtResult::Literal(
|
||||
Ok(ParseNtResult::Literal(
|
||||
self.collect_tokens_no_attrs(|this| this.parse_literal_maybe_minus())?,
|
||||
));
|
||||
))
|
||||
}
|
||||
NonterminalKind::Ty => {
|
||||
return Ok(ParseNtResult::Ty(
|
||||
self.collect_tokens_no_attrs(|this| this.parse_ty_no_question_mark_recover())?,
|
||||
));
|
||||
}
|
||||
// this could be handled like a token, since it is one
|
||||
NonterminalKind::Ty => Ok(ParseNtResult::Ty(
|
||||
self.collect_tokens_no_attrs(|this| this.parse_ty_no_question_mark_recover())?,
|
||||
)),
|
||||
// This could be handled like a token, since it is one.
|
||||
NonterminalKind::Ident => {
|
||||
return if let Some((ident, is_raw)) = get_macro_ident(&self.token) {
|
||||
if let Some((ident, is_raw)) = get_macro_ident(&self.token) {
|
||||
self.bump();
|
||||
Ok(ParseNtResult::Ident(ident, is_raw))
|
||||
} else {
|
||||
@@ -199,25 +170,22 @@ impl<'a> Parser<'a> {
|
||||
span: self.token.span,
|
||||
token: self.token.clone(),
|
||||
}))
|
||||
};
|
||||
}
|
||||
NonterminalKind::Path => {
|
||||
return Ok(ParseNtResult::Path(P(
|
||||
self.collect_tokens_no_attrs(|this| this.parse_path(PathStyle::Type))?
|
||||
)));
|
||||
}
|
||||
}
|
||||
NonterminalKind::Path => Ok(ParseNtResult::Path(P(
|
||||
self.collect_tokens_no_attrs(|this| this.parse_path(PathStyle::Type))?
|
||||
))),
|
||||
NonterminalKind::Meta => {
|
||||
return Ok(ParseNtResult::Meta(P(self.parse_attr_item(ForceCollect::Yes)?)));
|
||||
Ok(ParseNtResult::Meta(P(self.parse_attr_item(ForceCollect::Yes)?)))
|
||||
}
|
||||
NonterminalKind::Vis => {
|
||||
return Ok(ParseNtResult::Vis(P(self.collect_tokens_no_attrs(|this| {
|
||||
this.parse_visibility(FollowedByType::Yes)
|
||||
})?)));
|
||||
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
|
||||
// an ident for nonterminal purposes.
|
||||
return if let Some((ident, is_raw)) = self.token.lifetime() {
|
||||
if let Some((ident, is_raw)) = self.token.lifetime() {
|
||||
self.bump();
|
||||
Ok(ParseNtResult::Lifetime(ident, is_raw))
|
||||
} else {
|
||||
@@ -225,21 +193,9 @@ impl<'a> Parser<'a> {
|
||||
span: self.token.span,
|
||||
token: self.token.clone(),
|
||||
}))
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// If tokens are supported at all, they should be collected.
|
||||
if matches!(nt.tokens_mut(), Some(None)) {
|
||||
panic!(
|
||||
"Missing tokens for nt {:?} at {:?}: {:?}",
|
||||
nt,
|
||||
nt.use_span(),
|
||||
pprust::nonterminal_to_string(&nt)
|
||||
);
|
||||
}
|
||||
|
||||
Ok(ParseNtResult::Nt(Arc::new(nt)))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user