Skip to content

Commit f1a2ea3

Browse files
committed
Remove NtTy.
Notes about tests: - tests/ui/parser/macro/trait-object-macro-matcher.rs: the syntax error is duplicated, because it occurs now when parsing the decl macro input, and also when parsing the expanded decl macro. But this won't show up for normal users due to error de-duplication. - tests/ui/associated-consts/issue-93835.rs: ditto.
1 parent d9d405b commit f1a2ea3

21 files changed

+95
-47
lines changed

compiler/rustc_ast/src/ast_traits.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,6 @@ impl HasTokens for Nonterminal {
235235
Nonterminal::NtStmt(stmt) => stmt.tokens(),
236236
Nonterminal::NtExpr(expr) | Nonterminal::NtLiteral(expr) => expr.tokens(),
237237
Nonterminal::NtPat(pat) => pat.tokens(),
238-
Nonterminal::NtTy(ty) => ty.tokens(),
239238
Nonterminal::NtMeta(attr_item) => attr_item.tokens(),
240239
Nonterminal::NtPath(path) => path.tokens(),
241240
Nonterminal::NtBlock(block) => block.tokens(),
@@ -247,7 +246,6 @@ impl HasTokens for Nonterminal {
247246
Nonterminal::NtStmt(stmt) => stmt.tokens_mut(),
248247
Nonterminal::NtExpr(expr) | Nonterminal::NtLiteral(expr) => expr.tokens_mut(),
249248
Nonterminal::NtPat(pat) => pat.tokens_mut(),
250-
Nonterminal::NtTy(ty) => ty.tokens_mut(),
251249
Nonterminal::NtMeta(attr_item) => attr_item.tokens_mut(),
252250
Nonterminal::NtPath(path) => path.tokens_mut(),
253251
Nonterminal::NtBlock(block) => block.tokens_mut(),

compiler/rustc_ast/src/mut_visit.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -837,7 +837,6 @@ fn visit_nonterminal<T: MutVisitor>(nt: &mut token::Nonterminal, vis: &mut T) {
837837
}),
838838
token::NtPat(pat) => vis.visit_pat(pat),
839839
token::NtExpr(expr) => vis.visit_expr(expr),
840-
token::NtTy(ty) => vis.visit_ty(ty),
841840
token::NtLiteral(expr) => vis.visit_expr(expr),
842841
token::NtMeta(item) => {
843842
let AttrItem { path, args, tokens } = item.deref_mut();

compiler/rustc_ast/src/token.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -590,7 +590,7 @@ impl Token {
590590
Lifetime(..) | // lifetime bound in trait object
591591
Lt | BinOp(Shl) | // associated path
592592
PathSep => true, // global path
593-
Interpolated(ref nt) => matches!(&**nt, NtTy(..) | NtPath(..)),
593+
Interpolated(ref nt) => matches!(&**nt, NtPath(..)),
594594
OpenDelim(Delimiter::Invisible(InvisibleOrigin::MetaVar(
595595
NonterminalKind::Ty |
596596
NonterminalKind::Path
@@ -924,7 +924,6 @@ pub enum Nonterminal {
924924
NtStmt(P<ast::Stmt>),
925925
NtPat(P<ast::Pat>),
926926
NtExpr(P<ast::Expr>),
927-
NtTy(P<ast::Ty>),
928927
NtLiteral(P<ast::Expr>),
929928
/// Stuff inside brackets for attributes
930929
NtMeta(P<ast::AttrItem>),
@@ -1017,7 +1016,6 @@ impl Nonterminal {
10171016
NtStmt(stmt) => stmt.span,
10181017
NtPat(pat) => pat.span,
10191018
NtExpr(expr) | NtLiteral(expr) => expr.span,
1020-
NtTy(ty) => ty.span,
10211019
NtMeta(attr_item) => attr_item.span(),
10221020
NtPath(path) => path.span,
10231021
}
@@ -1031,7 +1029,6 @@ impl Nonterminal {
10311029
NtPat(..) => "pattern",
10321030
NtExpr(..) => "expression",
10331031
NtLiteral(..) => "literal",
1034-
NtTy(..) => "type",
10351032
NtMeta(..) => "attribute",
10361033
NtPath(..) => "path",
10371034
}
@@ -1056,7 +1053,6 @@ impl fmt::Debug for Nonterminal {
10561053
NtStmt(..) => f.pad("NtStmt(..)"),
10571054
NtPat(..) => f.pad("NtPat(..)"),
10581055
NtExpr(..) => f.pad("NtExpr(..)"),
1059-
NtTy(..) => f.pad("NtTy(..)"),
10601056
NtLiteral(..) => f.pad("NtLiteral(..)"),
10611057
NtMeta(..) => f.pad("NtMeta(..)"),
10621058
NtPath(..) => f.pad("NtPath(..)"),

compiler/rustc_ast/src/tokenstream.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -474,7 +474,6 @@ impl TokenStream {
474474
}
475475
Nonterminal::NtStmt(stmt) => TokenStream::from_ast(stmt),
476476
Nonterminal::NtPat(pat) => TokenStream::from_ast(pat),
477-
Nonterminal::NtTy(ty) => TokenStream::from_ast(ty),
478477
Nonterminal::NtMeta(attr) => TokenStream::from_ast(attr),
479478
Nonterminal::NtPath(path) => TokenStream::from_ast(path),
480479
Nonterminal::NtExpr(expr) | Nonterminal::NtLiteral(expr) => TokenStream::from_ast(expr),

compiler/rustc_ast_pretty/src/pprust/state.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -855,7 +855,6 @@ pub trait PrintState<'a>: std::ops::Deref<Target = pp::Printer> + std::ops::Dere
855855
match nt {
856856
token::NtExpr(e) => self.expr_to_string(e),
857857
token::NtMeta(e) => self.attr_item_to_string(e),
858-
token::NtTy(e) => self.ty_to_string(e),
859858
token::NtPath(e) => self.path_to_string(e),
860859
token::NtItem(e) => self.item_to_string(e),
861860
token::NtBlock(e) => self.block_to_string(e),

compiler/rustc_expand/src/mbe/transcribe.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,9 @@ pub(super) fn transcribe<'a>(
283283
let kind = token::NtLifetime(*ident);
284284
TokenTree::token_alone(kind, sp)
285285
}
286+
MatchedSingle(ParseNtResult::Ty(ref ty)) => {
287+
mk_delimited(NonterminalKind::Ty, TokenStream::from_ast(ty))
288+
}
286289
MatchedSingle(ParseNtResult::Vis(ref vis)) => {
287290
mk_delimited(NonterminalKind::Vis, TokenStream::from_ast(vis))
288291
}

compiler/rustc_parse/src/parser/mod.rs

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -158,12 +158,16 @@ macro_rules! maybe_recover_from_interpolated_ty_qpath {
158158
($self: expr, $allow_qpath_recovery: expr) => {
159159
if $allow_qpath_recovery
160160
&& $self.may_recover()
161-
&& $self.look_ahead(1, |t| t == &token::PathSep)
162-
&& let token::Interpolated(nt) = &$self.token.kind
163-
&& let token::NtTy(ty) = &**nt
161+
&& let Some(token::NonterminalKind::Ty) = $self.token.is_metavar_seq()
162+
&& $self.check_noexpect_past_close_delim(&token::PathSep)
164163
{
165-
let ty = ty.clone();
166-
$self.bump();
164+
// Reparse the type, then move to recovery.
165+
let ty = crate::reparse_metavar_seq!(
166+
$self,
167+
token::NonterminalKind::Ty,
168+
super::ParseNtResult::Ty(ty),
169+
ty
170+
);
167171
return $self.maybe_recover_from_bad_qpath_stage_2($self.prev_token.span, ty);
168172
}
169173
};
@@ -613,6 +617,24 @@ impl<'a> Parser<'a> {
613617
self.token == *tok
614618
}
615619

620+
// Check the first token after the delimiter that closes the current
621+
// delimited sequence. (Panics if used in the outermost token stream, which
622+
// has no delimiters.) It uses a clone of the relevant tree cursor to skip
623+
// past the entire `TokenTree::Delimited` in a single step, avoiding the
624+
// need for unbounded token lookahead.
625+
//
626+
// Primarily used when `self.token` matches
627+
// `OpenDelim(Delimiter::Invisible(_))`, to look ahead through the current
628+
// metavar expansion.
629+
fn check_noexpect_past_close_delim(&self, tok: &TokenKind) -> bool {
630+
let mut tree_cursor = self.token_cursor.stack.last().unwrap().0.clone();
631+
let tt = tree_cursor.next_ref();
632+
matches!(
633+
tt,
634+
Some(ast::tokenstream::TokenTree::Token(token::Token { kind, .. }, _)) if kind == tok
635+
)
636+
}
637+
616638
/// Consumes a token 'tok' if it exists. Returns whether the given token was present.
617639
///
618640
/// the main purpose of this function is to reduce the cluttering of the suggestions list
@@ -1691,6 +1713,7 @@ pub enum ParseNtResult {
16911713
Tt(TokenTree),
16921714
Ident(Ident, IdentIsRaw),
16931715
Lifetime(Ident),
1716+
Ty(P<ast::Ty>),
16941717
Vis(P<ast::Visibility>),
16951718

16961719
/// This variant will eventually be removed, along with `Token::Interpolate`.

compiler/rustc_parse/src/parser/nonterminal.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@ impl<'a> Parser<'a> {
4949
NtStmt(_)
5050
| NtPat(_)
5151
| NtExpr(_)
52-
| NtTy(_)
5352
| NtLiteral(_) // `true`, `false`
5453
| NtMeta(_)
5554
| NtPath(_) => true,
@@ -84,7 +83,7 @@ impl<'a> Parser<'a> {
8483
token::NtLifetime(..) => true,
8584
token::Interpolated(nt) => match &**nt {
8685
NtBlock(_) | NtStmt(_) | NtExpr(_) | NtLiteral(_) => true,
87-
NtItem(_) | NtPat(_) | NtTy(_) | NtMeta(_) | NtPath(_) => false,
86+
NtItem(_) | NtPat(_) | NtMeta(_) | NtPath(_) => false,
8887
},
8988
token::OpenDelim(Delimiter::Invisible(InvisibleOrigin::MetaVar(k))) => match k {
9089
NonterminalKind::Block
@@ -196,7 +195,9 @@ impl<'a> Parser<'a> {
196195
}
197196

198197
NonterminalKind::Ty => {
199-
NtTy(self.collect_tokens_no_attrs(|this| this.parse_ty_no_question_mark_recover())?)
198+
return Ok(ParseNtResult::Ty(
199+
self.collect_tokens_no_attrs(|this| this.parse_ty_no_question_mark_recover())?,
200+
));
200201
}
201202

202203
// this could be handled like a token, since it is one

compiler/rustc_parse/src/parser/path.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
11
use super::ty::{AllowPlus, RecoverQPath, RecoverReturnSign};
2-
use super::{Parser, Restrictions, TokenType};
2+
use super::{ParseNtResult, Parser, Restrictions, TokenType};
33
use crate::errors::PathSingleColon;
44
use crate::parser::{CommaRecoveryMode, RecoverColon, RecoverComma};
55
use crate::{errors, maybe_whole};
66
use ast::token::IdentIsRaw;
77
use rustc_ast::ptr::P;
8-
use rustc_ast::token::{self, Delimiter, Token, TokenKind};
8+
use rustc_ast::token::{self, Delimiter, NonterminalKind, Token, TokenKind};
99
use rustc_ast::{
1010
self as ast, AngleBracketedArg, AngleBracketedArgs, AnonConst, AssocConstraint,
1111
AssocConstraintKind, BlockCheckMode, GenericArg, GenericArgs, Generics, ParenthesizedArgs,
@@ -195,13 +195,13 @@ impl<'a> Parser<'a> {
195195

196196
maybe_whole!(self, NtPath, |path| reject_generics_if_mod_style(self, path.into_inner()));
197197

198-
if let token::Interpolated(nt) = &self.token.kind {
199-
if let token::NtTy(ty) = &**nt {
200-
if let ast::TyKind::Path(None, path) = &ty.kind {
201-
let path = path.clone();
202-
self.bump();
203-
return Ok(reject_generics_if_mod_style(self, path));
204-
}
198+
if let Some(NonterminalKind::Ty) = self.token.is_metavar_seq() {
199+
let mut self2 = self.clone();
200+
let ty =
201+
crate::reparse_metavar_seq!(self2, NonterminalKind::Ty, ParseNtResult::Ty(ty), ty);
202+
if let ast::TyKind::Path(None, path) = ty.into_inner().kind {
203+
*self = self2;
204+
return Ok(reject_generics_if_mod_style(self, path));
205205
}
206206
}
207207

compiler/rustc_parse/src/parser/ty.rs

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
use super::{Parser, PathStyle, SeqSep, TokenType, Trailing};
1+
use super::{ParseNtResult, Parser, PathStyle, SeqSep, TokenType, Trailing};
22

33
use crate::errors::{
44
self, DynAfterMut, ExpectedFnPathFoundFnKeyword, ExpectedMutOrConstInRawPointerType,
55
FnPointerCannotBeAsync, FnPointerCannotBeConst, FnPtrWithGenerics, FnPtrWithGenericsSugg,
66
HelpUseLatestEdition, InvalidDynKeyword, LifetimeAfterMut, NeedPlusAfterTraitObjectLifetime,
77
NestedCVariadicType, ReturnTypesUseThinArrow,
88
};
9-
use crate::{maybe_recover_from_interpolated_ty_qpath, maybe_whole};
9+
use crate::{maybe_recover_from_interpolated_ty_qpath, maybe_reparse_metavar_seq};
1010

1111
use rustc_ast::ptr::P;
12-
use rustc_ast::token::{self, Delimiter, Token, TokenKind};
12+
use rustc_ast::token::{self, Delimiter, NonterminalKind, Token, TokenKind};
1313
use rustc_ast::util::case::Case;
1414
use rustc_ast::{
1515
self as ast, BareFnTy, BoundAsyncness, BoundConstness, BoundPolarity, FnRetTy, GenericBound,
@@ -190,7 +190,8 @@ impl<'a> Parser<'a> {
190190
)
191191
}
192192

193-
/// Parse a type without recovering `:` as `->` to avoid breaking code such as `where fn() : for<'a>`
193+
/// Parse a type without recovering `:` as `->` to avoid breaking code such
194+
/// as `where fn() : for<'a>`.
194195
pub(super) fn parse_ty_for_where_clause(&mut self) -> PResult<'a, P<Ty>> {
195196
self.parse_ty_common(
196197
AllowPlus::Yes,
@@ -250,7 +251,15 @@ impl<'a> Parser<'a> {
250251
) -> PResult<'a, P<Ty>> {
251252
let allow_qpath_recovery = recover_qpath == RecoverQPath::Yes;
252253
maybe_recover_from_interpolated_ty_qpath!(self, allow_qpath_recovery);
253-
maybe_whole!(self, NtTy, |ty| ty);
254+
if let Some(ty) = maybe_reparse_metavar_seq!(
255+
self,
256+
NonterminalKind::Ty,
257+
NonterminalKind::Ty,
258+
ParseNtResult::Ty(ty),
259+
ty
260+
) {
261+
return Ok(ty);
262+
}
254263

255264
let lo = self.token.span;
256265
let mut impl_dyn_multi = false;

0 commit comments

Comments
 (0)