@@ -112,7 +112,7 @@ impl Lit {
112112 }
113113 Literal ( token_lit) => Some ( token_lit) ,
114114 Interpolated ( ref nt)
115- if let NtExpr ( expr) | NtLiteral ( expr) = & * * nt
115+ if let NtExpr ( expr, _ ) | NtLiteral ( expr, _ ) = & * * nt
116116 && let ast:: ExprKind :: Lit ( token_lit) = expr. kind =>
117117 {
118118 Some ( token_lit)
@@ -395,7 +395,7 @@ impl Token {
395395 /// if they keep spans or perform edition checks.
396396 pub fn uninterpolated_span ( & self ) -> Span {
397397 match & self . kind {
398- Interpolated ( nt) => nt. span ( ) ,
398+ Interpolated ( nt) => nt. use_span ( ) ,
399399 _ => self . span ,
400400 }
401401 }
@@ -551,8 +551,8 @@ impl Token {
551551 Literal ( ..) | BinOp ( Minus ) => true ,
552552 Ident ( name, false ) if name. is_bool_lit ( ) => true ,
553553 Interpolated ( ref nt) => match & * * nt {
554- NtLiteral ( _ ) => true ,
555- NtExpr ( e) => match & e. kind {
554+ NtLiteral ( .. ) => true ,
555+ NtExpr ( e, _ ) => match & e. kind {
556556 ast:: ExprKind :: Lit ( _) => true ,
557557 ast:: ExprKind :: Unary ( ast:: UnOp :: Neg , e) => {
558558 matches ! ( & e. kind, ast:: ExprKind :: Lit ( _) )
@@ -572,10 +572,10 @@ impl Token {
572572 pub fn uninterpolate ( & self ) -> Cow < ' _ , Token > {
573573 match & self . kind {
574574 Interpolated ( nt) => match * * nt {
575- NtIdent ( ident, is_raw) => {
575+ NtIdent ( ident, is_raw, _ ) => {
576576 Cow :: Owned ( Token :: new ( Ident ( ident. name , is_raw) , ident. span ) )
577577 }
578- NtLifetime ( ident) => Cow :: Owned ( Token :: new ( Lifetime ( ident. name ) , ident. span ) ) ,
578+ NtLifetime ( ident, _ ) => Cow :: Owned ( Token :: new ( Lifetime ( ident. name ) , ident. span ) ) ,
579579 _ => Cow :: Borrowed ( self ) ,
580580 } ,
581581 _ => Cow :: Borrowed ( self ) ,
@@ -589,7 +589,7 @@ impl Token {
589589 match & self . kind {
590590 & Ident ( name, is_raw) => Some ( ( Ident :: new ( name, self . span ) , is_raw) ) ,
591591 Interpolated ( nt) => match * * nt {
592- NtIdent ( ident, is_raw) => Some ( ( ident, is_raw) ) ,
592+ NtIdent ( ident, is_raw, _ ) => Some ( ( ident, is_raw) ) ,
593593 _ => None ,
594594 } ,
595595 _ => None ,
@@ -603,7 +603,7 @@ impl Token {
603603 match & self . kind {
604604 & Lifetime ( name) => Some ( Ident :: new ( name, self . span ) ) ,
605605 Interpolated ( nt) => match * * nt {
606- NtLifetime ( ident) => Some ( ident) ,
606+ NtLifetime ( ident, _ ) => Some ( ident) ,
607607 _ => None ,
608608 } ,
609609 _ => None ,
@@ -640,7 +640,7 @@ impl Token {
640640 /// (which happens while parsing the result of macro expansion)?
641641 pub fn is_whole_expr ( & self ) -> bool {
642642 if let Interpolated ( nt) = & self . kind
643- && let NtExpr ( _ ) | NtLiteral ( _ ) | NtPath ( _ ) | NtBlock ( _ ) = * * nt
643+ && let NtExpr ( .. ) | NtLiteral ( .. ) | NtPath ( .. ) | NtBlock ( .. ) = * * nt
644644 {
645645 return true ;
646646 }
@@ -803,19 +803,19 @@ impl PartialEq<TokenKind> for Token {
803803#[ derive( Clone , Encodable , Decodable ) ]
804804/// For interpolation during macro expansion.
805805pub enum Nonterminal {
806- NtItem ( P < ast:: Item > ) ,
807- NtBlock ( P < ast:: Block > ) ,
808- NtStmt ( P < ast:: Stmt > ) ,
809- NtPat ( P < ast:: Pat > ) ,
810- NtExpr ( P < ast:: Expr > ) ,
811- NtTy ( P < ast:: Ty > ) ,
812- NtIdent ( Ident , /* is_raw */ bool ) ,
813- NtLifetime ( Ident ) ,
814- NtLiteral ( P < ast:: Expr > ) ,
806+ NtItem ( P < ast:: Item > , Span ) ,
807+ NtBlock ( P < ast:: Block > , Span ) ,
808+ NtStmt ( P < ast:: Stmt > , Span ) ,
809+ NtPat ( P < ast:: Pat > , Span ) ,
810+ NtExpr ( P < ast:: Expr > , Span ) ,
811+ NtTy ( P < ast:: Ty > , Span ) ,
812+ NtIdent ( Ident , /* is_raw */ bool , Span ) ,
813+ NtLifetime ( Ident , Span ) ,
814+ NtLiteral ( P < ast:: Expr > , Span ) ,
815815 /// Stuff inside brackets for attributes
816- NtMeta ( P < ast:: AttrItem > ) ,
817- NtPath ( P < ast:: Path > ) ,
818- NtVis ( P < ast:: Visibility > ) ,
816+ NtMeta ( P < ast:: AttrItem > , Span ) ,
817+ NtPath ( P < ast:: Path > , Span ) ,
818+ NtVis ( P < ast:: Visibility > , Span ) ,
819819}
820820
821821#[ derive( Debug , Copy , Clone , PartialEq , Encodable , Decodable ) ]
@@ -897,29 +897,63 @@ impl fmt::Display for NonterminalKind {
897897}
898898
899899impl Nonterminal {
900- pub fn span ( & self ) -> Span {
900+ pub fn use_span ( & self ) -> Span {
901901 match self {
902- NtItem ( item) => item. span ,
903- NtBlock ( block) => block. span ,
904- NtStmt ( stmt) => stmt. span ,
905- NtPat ( pat) => pat. span ,
906- NtExpr ( expr) | NtLiteral ( expr) => expr. span ,
907- NtTy ( ty) => ty. span ,
908- NtIdent ( ident, _) | NtLifetime ( ident) => ident. span ,
909- NtMeta ( attr_item) => attr_item. span ( ) ,
910- NtPath ( path) => path. span ,
911- NtVis ( vis) => vis. span ,
902+ NtItem ( item, _) => item. span ,
903+ NtBlock ( block, _) => block. span ,
904+ NtStmt ( stmt, _) => stmt. span ,
905+ NtPat ( pat, _) => pat. span ,
906+ NtExpr ( expr, _) | NtLiteral ( expr, _) => expr. span ,
907+ NtTy ( ty, _) => ty. span ,
908+ NtIdent ( ident, _, _) | NtLifetime ( ident, _) => ident. span ,
909+ NtMeta ( attr_item, _) => attr_item. span ( ) ,
910+ NtPath ( path, _) => path. span ,
911+ NtVis ( vis, _) => vis. span ,
912+ }
913+ }
914+
915+ pub fn def_span ( & self ) -> Span {
916+ match self {
917+ NtItem ( _, span)
918+ | NtBlock ( _, span)
919+ | NtStmt ( _, span)
920+ | NtPat ( _, span)
921+ | NtExpr ( _, span)
922+ | NtLiteral ( _, span)
923+ | NtTy ( _, span)
924+ | NtIdent ( _, _, span)
925+ | NtLifetime ( _, span)
926+ | NtMeta ( _, span)
927+ | NtPath ( _, span)
928+ | NtVis ( _, span) => * span,
929+ }
930+ }
931+
932+ pub fn descr ( & self ) -> & ' static str {
933+ match self {
934+ NtItem ( ..) => "item" ,
935+ NtBlock ( ..) => "block" ,
936+ NtStmt ( ..) => "statement" ,
937+ NtPat ( ..) => "pattern" ,
938+ NtExpr ( ..) => "expression" ,
939+ NtLiteral ( ..) => "literal" ,
940+ NtTy ( ..) => "type" ,
941+ NtIdent ( ..) => "identifier" ,
942+ NtLifetime ( ..) => "lifetime" ,
943+ NtMeta ( ..) => "attribute" ,
944+ NtPath ( ..) => "path" ,
945+ NtVis ( ..) => "visibility" ,
912946 }
913947 }
914948}
915949
916950impl PartialEq for Nonterminal {
917951 fn eq ( & self , rhs : & Self ) -> bool {
918952 match ( self , rhs) {
919- ( NtIdent ( ident_lhs, is_raw_lhs) , NtIdent ( ident_rhs, is_raw_rhs) ) => {
953+ ( NtIdent ( ident_lhs, is_raw_lhs, _ ) , NtIdent ( ident_rhs, is_raw_rhs, _ ) ) => {
920954 ident_lhs == ident_rhs && is_raw_lhs == is_raw_rhs
921955 }
922- ( NtLifetime ( ident_lhs) , NtLifetime ( ident_rhs) ) => ident_lhs == ident_rhs,
956+ ( NtLifetime ( ident_lhs, _ ) , NtLifetime ( ident_rhs, _ ) ) => ident_lhs == ident_rhs,
923957 // FIXME: Assume that all "complex" nonterminal are not equal, we can't compare them
924958 // correctly based on data from AST. This will prevent them from matching each other
925959 // in macros. The comparison will become possible only when each nonterminal has an
@@ -965,7 +999,7 @@ mod size_asserts {
965999 // tidy-alphabetical-start
9661000 static_assert_size ! ( Lit , 12 ) ;
9671001 static_assert_size ! ( LitKind , 2 ) ;
968- static_assert_size ! ( Nonterminal , 16 ) ;
1002+ static_assert_size ! ( Nonterminal , 24 ) ;
9691003 static_assert_size ! ( Token , 24 ) ;
9701004 static_assert_size ! ( TokenKind , 16 ) ;
9711005 // tidy-alphabetical-end
0 commit comments