11pub use BinOpToken :: * ;
22pub use LitKind :: * ;
3- pub use Nonterminal :: * ;
43pub use TokenKind :: * ;
54
65use crate :: ast;
7- use crate :: ptr:: P ;
86use crate :: util:: case:: Case ;
97
10- use rustc_data_structures:: stable_hasher:: { HashStable , StableHasher } ;
11- use rustc_data_structures:: sync:: Lrc ;
128use rustc_macros:: { Decodable , Encodable , HashStable_Generic } ;
139use 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 ) ]
289283pub 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 ) ]
415381pub 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 ) ]
956902pub 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" ) ]
1089994mod 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
0 commit comments