@@ -112,7 +112,7 @@ impl Lit {
112
112
}
113
113
Literal ( token_lit) => Some ( token_lit) ,
114
114
Interpolated ( ref nt)
115
- if let NtExpr ( expr) | NtLiteral ( expr) = & * * nt
115
+ if let NtExpr ( expr, _ ) | NtLiteral ( expr, _ ) = & * * nt
116
116
&& let ast:: ExprKind :: Lit ( token_lit) = expr. kind =>
117
117
{
118
118
Some ( token_lit)
@@ -395,7 +395,7 @@ impl Token {
395
395
/// if they keep spans or perform edition checks.
396
396
pub fn uninterpolated_span ( & self ) -> Span {
397
397
match & self . kind {
398
- Interpolated ( nt) => nt. span ( ) ,
398
+ Interpolated ( nt) => nt. use_span ( ) ,
399
399
_ => self . span ,
400
400
}
401
401
}
@@ -551,8 +551,8 @@ impl Token {
551
551
Literal ( ..) | BinOp ( Minus ) => true ,
552
552
Ident ( name, false ) if name. is_bool_lit ( ) => true ,
553
553
Interpolated ( ref nt) => match & * * nt {
554
- NtLiteral ( _ ) => true ,
555
- NtExpr ( e) => match & e. kind {
554
+ NtLiteral ( .. ) => true ,
555
+ NtExpr ( e, _ ) => match & e. kind {
556
556
ast:: ExprKind :: Lit ( _) => true ,
557
557
ast:: ExprKind :: Unary ( ast:: UnOp :: Neg , e) => {
558
558
matches ! ( & e. kind, ast:: ExprKind :: Lit ( _) )
@@ -572,10 +572,10 @@ impl Token {
572
572
pub fn uninterpolate ( & self ) -> Cow < ' _ , Token > {
573
573
match & self . kind {
574
574
Interpolated ( nt) => match * * nt {
575
- NtIdent ( ident, is_raw) => {
575
+ NtIdent ( ident, is_raw, _ ) => {
576
576
Cow :: Owned ( Token :: new ( Ident ( ident. name , is_raw) , ident. span ) )
577
577
}
578
- NtLifetime ( ident) => Cow :: Owned ( Token :: new ( Lifetime ( ident. name ) , ident. span ) ) ,
578
+ NtLifetime ( ident, _ ) => Cow :: Owned ( Token :: new ( Lifetime ( ident. name ) , ident. span ) ) ,
579
579
_ => Cow :: Borrowed ( self ) ,
580
580
} ,
581
581
_ => Cow :: Borrowed ( self ) ,
@@ -589,7 +589,7 @@ impl Token {
589
589
match & self . kind {
590
590
& Ident ( name, is_raw) => Some ( ( Ident :: new ( name, self . span ) , is_raw) ) ,
591
591
Interpolated ( nt) => match * * nt {
592
- NtIdent ( ident, is_raw) => Some ( ( ident, is_raw) ) ,
592
+ NtIdent ( ident, is_raw, _ ) => Some ( ( ident, is_raw) ) ,
593
593
_ => None ,
594
594
} ,
595
595
_ => None ,
@@ -603,7 +603,7 @@ impl Token {
603
603
match & self . kind {
604
604
& Lifetime ( name) => Some ( Ident :: new ( name, self . span ) ) ,
605
605
Interpolated ( nt) => match * * nt {
606
- NtLifetime ( ident) => Some ( ident) ,
606
+ NtLifetime ( ident, _ ) => Some ( ident) ,
607
607
_ => None ,
608
608
} ,
609
609
_ => None ,
@@ -640,7 +640,7 @@ impl Token {
640
640
/// (which happens while parsing the result of macro expansion)?
641
641
pub fn is_whole_expr ( & self ) -> bool {
642
642
if let Interpolated ( nt) = & self . kind
643
- && let NtExpr ( _ ) | NtLiteral ( _ ) | NtPath ( _ ) | NtBlock ( _ ) = * * nt
643
+ && let NtExpr ( .. ) | NtLiteral ( .. ) | NtPath ( .. ) | NtBlock ( .. ) = * * nt
644
644
{
645
645
return true ;
646
646
}
@@ -803,19 +803,19 @@ impl PartialEq<TokenKind> for Token {
803
803
#[ derive( Clone , Encodable , Decodable ) ]
804
804
/// For interpolation during macro expansion.
805
805
pub 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 ) ,
815
815
/// 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 ) ,
819
819
}
820
820
821
821
#[ derive( Debug , Copy , Clone , PartialEq , Encodable , Decodable ) ]
@@ -897,29 +897,63 @@ impl fmt::Display for NonterminalKind {
897
897
}
898
898
899
899
impl Nonterminal {
900
- pub fn span ( & self ) -> Span {
900
+ pub fn use_span ( & self ) -> Span {
901
901
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" ,
912
946
}
913
947
}
914
948
}
915
949
916
950
impl PartialEq for Nonterminal {
917
951
fn eq ( & self , rhs : & Self ) -> bool {
918
952
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, _ ) ) => {
920
954
ident_lhs == ident_rhs && is_raw_lhs == is_raw_rhs
921
955
}
922
- ( NtLifetime ( ident_lhs) , NtLifetime ( ident_rhs) ) => ident_lhs == ident_rhs,
956
+ ( NtLifetime ( ident_lhs, _ ) , NtLifetime ( ident_rhs, _ ) ) => ident_lhs == ident_rhs,
923
957
// FIXME: Assume that all "complex" nonterminal are not equal, we can't compare them
924
958
// correctly based on data from AST. This will prevent them from matching each other
925
959
// in macros. The comparison will become possible only when each nonterminal has an
@@ -965,7 +999,7 @@ mod size_asserts {
965
999
// tidy-alphabetical-start
966
1000
static_assert_size ! ( Lit , 12 ) ;
967
1001
static_assert_size ! ( LitKind , 2 ) ;
968
- static_assert_size ! ( Nonterminal , 16 ) ;
1002
+ static_assert_size ! ( Nonterminal , 24 ) ;
969
1003
static_assert_size ! ( Token , 24 ) ;
970
1004
static_assert_size ! ( TokenKind , 16 ) ;
971
1005
// tidy-alphabetical-end
0 commit comments