Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 42265a8

Browse files
committed
Remove NtBlock.
XXX: also Nonterminal and TokenKind::Interpolated XXX: grep for interpolated/Interpolated, see if anything else can be removed?
1 parent a6d91db commit 42265a8

File tree

16 files changed

+98
-356
lines changed

16 files changed

+98
-356
lines changed

compiler/rustc_ast/src/ast_traits.rs

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
//! The traits are not implemented exhaustively, only when actually necessary.
44
55
use crate::ptr::P;
6-
use crate::token::Nonterminal;
76
use crate::tokenstream::LazyAttrTokenStream;
87
use crate::{Arm, Crate, ExprField, FieldDef, GenericParam, Param, PatField, Variant};
98
use crate::{AssocItem, Expr, ForeignItem, Item, NodeId};
@@ -228,19 +227,6 @@ impl HasTokens for Attribute {
228227
}
229228
}
230229

231-
impl HasTokens for Nonterminal {
232-
fn tokens(&self) -> Option<&LazyAttrTokenStream> {
233-
match self {
234-
Nonterminal::NtBlock(block) => block.tokens(),
235-
}
236-
}
237-
fn tokens_mut(&mut self) -> Option<&mut Option<LazyAttrTokenStream>> {
238-
match self {
239-
Nonterminal::NtBlock(block) => block.tokens_mut(),
240-
}
241-
}
242-
}
243-
244230
/// A trait for AST nodes having (or not having) attributes.
245231
pub trait HasAttrs {
246232
/// This is `true` if this `HasAttrs` might support 'custom' (proc-macro) inner

compiler/rustc_ast/src/mut_visit.rs

Lines changed: 3 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -764,9 +764,9 @@ fn visit_lazy_tts<T: MutVisitor>(lazy_tts: &mut Option<LazyAttrTokenStream>, vis
764764
visit_lazy_tts_opt_mut(lazy_tts.as_mut(), vis);
765765
}
766766

767-
/// Applies ident visitor if it's an ident; applies other visits to interpolated nodes.
768-
/// In practice the ident part is not actually used by specific visitors right now,
769-
/// but there's a test below checking that it works.
767+
/// Applies ident visitor if it's an ident. In practice this is not actually
768+
/// used by specific visitors right now, but there's a test below checking that
769+
/// it works.
770770
// No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
771771
pub fn visit_token<T: MutVisitor>(t: &mut Token, vis: &mut T) {
772772
let Token { kind, span } = t;
@@ -784,45 +784,11 @@ pub fn visit_token<T: MutVisitor>(t: &mut Token, vis: &mut T) {
784784
token::NtLifetime(ident) => {
785785
vis.visit_ident(ident);
786786
}
787-
token::Interpolated(nt) => {
788-
let nt = Lrc::make_mut(nt);
789-
visit_nonterminal(nt, vis);
790-
}
791787
_ => {}
792788
}
793789
vis.visit_span(span);
794790
}
795791

796-
// No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
797-
/// Applies the visitor to elements of interpolated nodes.
798-
//
799-
// N.B., this can occur only when applying a visitor to partially expanded
800-
// code, where parsed pieces have gotten implanted ito *other* macro
801-
// invocations. This is relevant for macro hygiene, but possibly not elsewhere.
802-
//
803-
// One problem here occurs because the types for flat_map_item, flat_map_stmt,
804-
// etc., allow the visitor to return *multiple* items; this is a problem for the
805-
// nodes here, because they insist on having exactly one piece. One solution
806-
// would be to mangle the MutVisitor trait to include one-to-many and
807-
// one-to-one versions of these entry points, but that would probably confuse a
808-
// lot of people and help very few. Instead, I'm just going to put in dynamic
809-
// checks. I think the performance impact of this will be pretty much
810-
// nonexistent. The danger is that someone will apply a `MutVisitor` to a
811-
// partially expanded node, and will be confused by the fact that their
812-
// `flat_map_item` or `flat_map_stmt` isn't getting called on `NtItem` or `NtStmt`
813-
// nodes. Hopefully they'll wind up reading this comment, and doing something
814-
// appropriate.
815-
//
816-
// BTW, design choice: I considered just changing the type of, e.g., `NtItem` to
817-
// contain multiple items, but decided against it when I looked at
818-
// `parse_item_or_view_item` and tried to figure out what I would do with
819-
// multiple items there....
820-
fn visit_nonterminal<T: MutVisitor>(nt: &mut token::Nonterminal, vis: &mut T) {
821-
match nt {
822-
token::NtBlock(block) => vis.visit_block(block),
823-
}
824-
}
825-
826792
// No `noop_` prefix because there isn't a corresponding method in `MutVisitor`.
827793
fn visit_defaultness<T: MutVisitor>(defaultness: &mut Defaultness, vis: &mut T) {
828794
match defaultness {

compiler/rustc_ast/src/token.rs

Lines changed: 16 additions & 112 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
pub use BinOpToken::*;
22
pub use LitKind::*;
3-
pub use Nonterminal::*;
43
pub use TokenKind::*;
54

65
use crate::ast;
7-
use crate::ptr::P;
86
use crate::util::case::Case;
97

10-
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
11-
use rustc_data_structures::sync::Lrc;
128
use rustc_macros::{Decodable, Encodable, HashStable_Generic};
139
use rustc_span::symbol::{kw, sym};
1410
#[allow(clippy::useless_attribute)] // FIXME: following use of `hidden_glob_reexports` incorrectly triggers `useless_attribute` lint.
@@ -283,9 +279,7 @@ impl From<IdentIsRaw> for bool {
283279
}
284280
}
285281

286-
// SAFETY: due to the `Clone` impl below, all fields of all variants other than
287-
// `Interpolated` must impl `Copy`.
288-
#[derive(PartialEq, Encodable, Decodable, Debug, HashStable_Generic)]
282+
#[derive(Clone, PartialEq, Encodable, Decodable, Debug, HashStable_Generic)]
289283
pub enum TokenKind {
290284
/* Expression-operator symbols. */
291285
/// `=`
@@ -374,21 +368,6 @@ pub enum TokenKind {
374368
/// the `lifetime` metavariable in the macro's RHS.
375369
NtLifetime(Ident),
376370

377-
/// An embedded AST node, as produced by a macro. This only exists for
378-
/// historical reasons. We'd like to get rid of it, for multiple reasons.
379-
/// - It's conceptually very strange. Saying a token can contain an AST
380-
/// node is like saying, in natural language, that a word can contain a
381-
/// sentence.
382-
/// - It requires special handling in a bunch of places in the parser.
383-
/// - It prevents `Token` from implementing `Copy`.
384-
/// It adds complexity and likely slows things down. Please don't add new
385-
/// occurrences of this token kind!
386-
///
387-
/// The span in the surrounding `Token` is that of the metavariable in the
388-
/// macro's RHS. The span within the Nonterminal is that of the fragment
389-
/// passed to the macro at the call site.
390-
Interpolated(Lrc<Nonterminal>),
391-
392371
/// A doc comment token.
393372
/// `Symbol` is the doc comment's data excluding its "quotes" (`///`, `/**`, etc)
394373
/// similarly to symbols in string literal tokens.
@@ -398,19 +377,6 @@ pub enum TokenKind {
398377
Eof,
399378
}
400379

401-
impl Clone for TokenKind {
402-
fn clone(&self) -> Self {
403-
// `TokenKind` would impl `Copy` if it weren't for `Interpolated`. So
404-
// for all other variants, this implementation of `clone` is just like
405-
// a copy. This is faster than the `derive(Clone)` version which has a
406-
// separate path for every variant.
407-
match self {
408-
Interpolated(nt) => Interpolated(nt.clone()),
409-
_ => unsafe { std::ptr::read(self) },
410-
}
411-
}
412-
}
413-
414380
#[derive(Clone, PartialEq, Encodable, Decodable, Debug, HashStable_Generic)]
415381
pub struct Token {
416382
pub kind: TokenKind,
@@ -497,7 +463,6 @@ impl Token {
497463
pub fn uninterpolated_span(&self) -> Span {
498464
match self.kind {
499465
NtIdent(ident, _) | NtLifetime(ident) => ident.span,
500-
Interpolated(ref nt) => nt.use_span(),
501466
_ => self.span,
502467
}
503468
}
@@ -515,7 +480,7 @@ impl Token {
515480
}
516481

517482
OpenDelim(..) | CloseDelim(..) | Literal(..) | DocComment(..) | Ident(..)
518-
| NtIdent(..) | Lifetime(..) | NtLifetime(..) | Interpolated(..) | Eof => false,
483+
| NtIdent(..) | Lifetime(..) | NtLifetime(..) | Eof => false,
519484
}
520485
}
521486

@@ -543,7 +508,6 @@ impl Token {
543508
PathSep | // global path
544509
Lifetime(..) | // labeled loop
545510
Pound => true, // expression attributes
546-
Interpolated(ref nt) => matches!(&**nt, NtBlock(..)),
547511
OpenDelim(Delimiter::Invisible(InvisibleOrigin::MetaVar(
548512
NonterminalKind::Block |
549513
NonterminalKind::Expr |
@@ -571,7 +535,6 @@ impl Token {
571535
| DotDot | DotDotDot | DotDotEq // ranges
572536
| Lt | BinOp(Shl) // associated path
573537
| PathSep => true, // global path
574-
Interpolated(ref nt) => matches!(&**nt, NtBlock(..)),
575538
OpenDelim(Delimiter::Invisible(InvisibleOrigin::MetaVar(
576539
NonterminalKind::Block |
577540
NonterminalKind::PatParam { .. } |
@@ -613,7 +576,6 @@ impl Token {
613576
match self.kind {
614577
OpenDelim(Delimiter::Brace) | Literal(..) | BinOp(Minus) => true,
615578
Ident(name, IdentIsRaw::No) if name.is_bool_lit() => true,
616-
Interpolated(ref nt) => matches!(&**nt, NtBlock(..)),
617579
OpenDelim(Delimiter::Invisible(InvisibleOrigin::MetaVar(
618580
NonterminalKind::Expr
619581
| NonterminalKind::Expr2021 { .. }
@@ -760,31 +722,20 @@ impl Token {
760722
/// That is, is this a pre-parsed expression dropped into the token stream
761723
/// (which happens while parsing the result of macro expansion)?
762724
pub fn is_metavar_expr(&self) -> bool {
763-
#[allow(irrefutable_let_patterns)] // FIXME: temporary
764-
if let Interpolated(nt) = &self.kind
765-
&& let NtBlock(_) = &**nt
766-
{
767-
true
768-
} else if matches!(
725+
matches!(
769726
self.is_metavar_seq(),
770-
Some(NonterminalKind::Expr | NonterminalKind::Literal | NonterminalKind::Path)
771-
) {
772-
true
773-
} else {
774-
false
775-
}
727+
Some(
728+
NonterminalKind::Expr
729+
| NonterminalKind::Literal
730+
| NonterminalKind::Path
731+
| NonterminalKind::Block
732+
)
733+
)
776734
}
777735

778-
/// Is the token an interpolated block (`$b:block`)?
779-
pub fn is_whole_block(&self) -> bool {
780-
#[allow(irrefutable_let_patterns)] // FIXME: temporary
781-
if let Interpolated(nt) = &self.kind
782-
&& let NtBlock(..) = &**nt
783-
{
784-
return true;
785-
}
786-
787-
false
736+
/// Are we at a block from a metavar (`$b:block`)?
737+
pub fn is_metavar_block(&self) -> bool {
738+
matches!(self.is_metavar_seq(), Some(NonterminalKind::Block))
788739
}
789740

790741
/// Returns `true` if the token is either the `mut` or `const` keyword.
@@ -809,7 +760,8 @@ impl Token {
809760
self.is_non_raw_ident_where(|id| id.name == kw)
810761
}
811762

812-
/// Returns `true` if the token is a given keyword, `kw` or if `case` is `Insensitive` and this token is an identifier equal to `kw` ignoring the case.
763+
/// Returns `true` if the token is a given keyword, `kw` or if `case` is `Insensitive` and this
764+
/// token is an identifier equal to `kw` ignoring the case.
813765
pub fn is_keyword_case(&self, kw: Symbol, case: Case) -> bool {
814766
self.is_keyword(kw)
815767
|| (case == Case::Insensitive
@@ -930,7 +882,7 @@ impl Token {
930882
Le | EqEq | Ne | Ge | AndAnd | OrOr | Tilde | BinOpEq(..) | At | DotDotDot
931883
| DotDotEq | Comma | Semi | PathSep | RArrow | LArrow | FatArrow | Pound | Dollar
932884
| Question | OpenDelim(..) | CloseDelim(..) | Literal(..) | Ident(..) | NtIdent(..)
933-
| Lifetime(..) | NtLifetime(..) | Interpolated(..) | DocComment(..) | Eof => {
885+
| Lifetime(..) | NtLifetime(..) | DocComment(..) | Eof => {
934886
return None;
935887
}
936888
};
@@ -946,12 +898,6 @@ impl PartialEq<TokenKind> for Token {
946898
}
947899
}
948900

949-
#[derive(Clone, Encodable, Decodable)]
950-
/// For interpolation during macro expansion.
951-
pub enum Nonterminal {
952-
NtBlock(P<ast::Block>),
953-
}
954-
955901
#[derive(Debug, Copy, Clone, PartialEq, Eq, Encodable, Decodable, Hash, HashStable_Generic)]
956902
pub enum NonterminalKind {
957903
Item,
@@ -1043,47 +989,6 @@ impl fmt::Display for NonterminalKind {
1043989
}
1044990
}
1045991

1046-
impl Nonterminal {
1047-
pub fn use_span(&self) -> Span {
1048-
match self {
1049-
NtBlock(block) => block.span,
1050-
}
1051-
}
1052-
1053-
pub fn descr(&self) -> &'static str {
1054-
match self {
1055-
NtBlock(..) => "block",
1056-
}
1057-
}
1058-
}
1059-
1060-
impl PartialEq for Nonterminal {
1061-
fn eq(&self, _rhs: &Self) -> bool {
1062-
// FIXME: Assume that all nonterminals are not equal, we can't compare them
1063-
// correctly based on data from AST. This will prevent them from matching each other
1064-
// in macros. The comparison will become possible only when each nonterminal has an
1065-
// attached token stream from which it was parsed.
1066-
false
1067-
}
1068-
}
1069-
1070-
impl fmt::Debug for Nonterminal {
1071-
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
1072-
match *self {
1073-
NtBlock(..) => f.pad("NtBlock(..)"),
1074-
}
1075-
}
1076-
}
1077-
1078-
impl<CTX> HashStable<CTX> for Nonterminal
1079-
where
1080-
CTX: crate::HashStableContext,
1081-
{
1082-
fn hash_stable(&self, _hcx: &mut CTX, _hasher: &mut StableHasher) {
1083-
panic!("interpolated tokens should not be present in the HIR")
1084-
}
1085-
}
1086-
1087992
// Some types are used a lot. Make sure they don't unintentionally get bigger.
1088993
#[cfg(target_pointer_width = "64")]
1089994
mod size_asserts {
@@ -1092,7 +997,6 @@ mod size_asserts {
1092997
// tidy-alphabetical-start
1093998
static_assert_size!(Lit, 12);
1094999
static_assert_size!(LitKind, 2);
1095-
static_assert_size!(Nonterminal, 8);
10961000
static_assert_size!(Token, 24);
10971001
static_assert_size!(TokenKind, 16);
10981002
// tidy-alphabetical-end

compiler/rustc_ast/src/tokenstream.rs

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
1616
use crate::ast::AttrStyle;
1717
use crate::ast_traits::{HasAttrs, HasSpan, HasTokens};
18-
use crate::token::{self, Delimiter, InvisibleOrigin, Nonterminal, Token, TokenKind};
18+
use crate::token::{self, Delimiter, InvisibleOrigin, Token, TokenKind};
1919
use crate::AttrVec;
2020

2121
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
@@ -464,12 +464,6 @@ impl TokenStream {
464464
attr_stream.to_tokenstream()
465465
}
466466

467-
pub fn from_nonterminal_ast(nt: &Nonterminal) -> TokenStream {
468-
match nt {
469-
Nonterminal::NtBlock(block) => TokenStream::from_ast(block),
470-
}
471-
}
472-
473467
fn flatten_token(token: &Token, spacing: Spacing) -> TokenTree {
474468
match token.kind {
475469
token::NtIdent(ident, is_raw) => {
@@ -481,12 +475,6 @@ impl TokenStream {
481475
Delimiter::Invisible(InvisibleOrigin::FlattenToken),
482476
TokenStream::token_alone(token::Lifetime(ident.name), ident.span),
483477
),
484-
token::Interpolated(ref nt) => TokenTree::Delimited(
485-
DelimSpan::from_single(token.span),
486-
DelimSpacing::new(Spacing::JointHidden, spacing),
487-
Delimiter::Invisible(InvisibleOrigin::FlattenToken),
488-
TokenStream::from_nonterminal_ast(&nt).flattened(),
489-
),
490478
_ => TokenTree::Token(token.clone(), spacing),
491479
}
492480
}
@@ -504,10 +492,9 @@ impl TokenStream {
504492
pub fn flattened(&self) -> TokenStream {
505493
fn can_skip(stream: &TokenStream) -> bool {
506494
stream.trees().all(|tree| match tree {
507-
TokenTree::Token(token, _) => !matches!(
508-
token.kind,
509-
token::NtIdent(..) | token::NtLifetime(..) | token::Interpolated(..)
510-
),
495+
TokenTree::Token(token, _) => {
496+
!matches!(token.kind, token::NtIdent(..) | token::NtLifetime(..))
497+
}
511498
TokenTree::Delimited(.., inner) => can_skip(inner),
512499
})
513500
}

compiler/rustc_ast_pretty/src/pprust/mod.rs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,11 @@ pub mod state;
55
pub use state::{print_crate, AnnNode, Comments, PpAnn, PrintState, State};
66

77
use rustc_ast as ast;
8-
use rustc_ast::token::{Nonterminal, Token, TokenKind};
8+
use rustc_ast::token::{Token, TokenKind};
99
use rustc_ast::tokenstream::{TokenStream, TokenTree};
1010

1111
use std::borrow::Cow;
1212

13-
pub fn nonterminal_to_string(nt: &Nonterminal) -> String {
14-
State::new().nonterminal_to_string(nt)
15-
}
16-
1713
/// Print the token kind precisely, without converting `$crate` into its respective crate name.
1814
pub fn token_kind_to_string(tok: &TokenKind) -> Cow<'static, str> {
1915
State::new().token_kind_to_string(tok)

0 commit comments

Comments
 (0)