@@ -49,7 +49,7 @@ impl NestedMetaItem {
49
49
/// Returns the `Lit` if `self` is a `NestedMetaItem::Literal`s.
50
50
pub fn literal ( & self ) -> Option < & Lit > {
51
51
match * self {
52
- NestedMetaItem :: Literal ( ref lit) => Some ( lit) ,
52
+ NestedMetaItem :: Literal ( ref lit, _ ) => Some ( lit) ,
53
53
_ => None ,
54
54
}
55
55
}
@@ -174,10 +174,24 @@ impl MetaItem {
174
174
175
175
// Example:
176
176
// #[attribute(name = "value")]
177
- // ^^^^^^^ ^^^^^^^
177
+ // ^^^^^^^
178
178
pub fn name_value_literal ( & self ) -> Option < & Lit > {
179
179
match & self . kind {
180
- MetaItemKind :: NameValue ( v) => Some ( v) ,
180
+ MetaItemKind :: NameValue ( v, _) => Some ( v) ,
181
+ _ => None ,
182
+ }
183
+ }
184
+
185
+ pub fn name_value_literal_and_span ( & self ) -> Option < ( & Lit , Span ) > {
186
+ match & self . kind {
187
+ MetaItemKind :: NameValue ( v, v_span) => Some ( ( v, * v_span) ) ,
188
+ _ => None ,
189
+ }
190
+ }
191
+
192
+ pub fn name_value_literal_span ( & self ) -> Option < Span > {
193
+ match self . kind {
194
+ MetaItemKind :: NameValue ( _, v_span) => Some ( v_span) ,
181
195
_ => None ,
182
196
}
183
197
}
@@ -200,17 +214,6 @@ impl MetaItem {
200
214
pub fn has_name ( & self , name : Symbol ) -> bool {
201
215
self . path == name
202
216
}
203
-
204
- /// This is used in case you want the value span instead of the whole attribute. Example:
205
- ///
206
- /// ```text
207
- /// #[doc(alias = "foo")]
208
- /// ```
209
- ///
210
- /// In here, it'll return a span for `"foo"`.
211
- pub fn name_value_literal_span ( & self ) -> Option < Span > {
212
- Some ( self . name_value_literal ( ) ?. span )
213
- }
214
217
}
215
218
216
219
impl AttrItem {
@@ -320,9 +323,9 @@ pub fn mk_name_value_item_str(ident: Ident, str: Symbol, str_span: Span) -> Meta
320
323
}
321
324
322
325
pub fn mk_name_value_item ( ident : Ident , lit_kind : LitKind , lit_span : Span ) -> MetaItem {
323
- let lit = Lit :: from_lit_kind ( lit_kind, lit_span ) ;
326
+ let lit = Lit :: from_lit_kind ( lit_kind) ;
324
327
let span = ident. span . to ( lit_span) ;
325
- MetaItem { path : Path :: from_ident ( ident) , span, kind : MetaItemKind :: NameValue ( lit) }
328
+ MetaItem { path : Path :: from_ident ( ident) , span, kind : MetaItemKind :: NameValue ( lit, lit_span ) }
326
329
}
327
330
328
331
pub fn mk_list_item ( ident : Ident , items : Vec < NestedMetaItem > ) -> MetaItem {
@@ -458,7 +461,7 @@ impl MetaItem {
458
461
let list_closing_paren_pos = tokens. peek ( ) . map ( |tt| tt. span ( ) . hi ( ) ) ;
459
462
let kind = MetaItemKind :: from_tokens ( tokens) ?;
460
463
let hi = match kind {
461
- MetaItemKind :: NameValue ( ref lit ) => lit . span . hi ( ) ,
464
+ MetaItemKind :: NameValue ( _ , lit_span ) => lit_span . hi ( ) ,
462
465
MetaItemKind :: List ( ..) => list_closing_paren_pos. unwrap_or ( path. span . hi ( ) ) ,
463
466
_ => path. span . hi ( ) ,
464
467
} ;
@@ -470,7 +473,7 @@ impl MetaItem {
470
473
impl MetaItemKind {
471
474
pub fn value_str ( & self ) -> Option < Symbol > {
472
475
match self {
473
- MetaItemKind :: NameValue ( ref v) => match v. kind {
476
+ MetaItemKind :: NameValue ( ref v, _ ) => match v. kind {
474
477
LitKind :: Str ( ref s, _) => Some ( * s) ,
475
478
_ => None ,
476
479
} ,
@@ -481,11 +484,11 @@ impl MetaItemKind {
481
484
pub fn mac_args ( & self , span : Span ) -> MacArgs {
482
485
match self {
483
486
MetaItemKind :: Word => MacArgs :: Empty ,
484
- MetaItemKind :: NameValue ( lit) => {
487
+ MetaItemKind :: NameValue ( lit, lit_span ) => {
485
488
let expr = P ( ast:: Expr {
486
489
id : ast:: DUMMY_NODE_ID ,
487
490
kind : ast:: ExprKind :: Lit ( lit. clone ( ) ) ,
488
- span : lit . span ,
491
+ span : * lit_span ,
489
492
attrs : ast:: AttrVec :: new ( ) ,
490
493
tokens : None ,
491
494
} ) ;
@@ -511,10 +514,10 @@ impl MetaItemKind {
511
514
fn token_trees ( & self , span : Span ) -> Vec < TokenTree > {
512
515
match * self {
513
516
MetaItemKind :: Word => vec ! [ ] ,
514
- MetaItemKind :: NameValue ( ref lit) => {
517
+ MetaItemKind :: NameValue ( ref lit, lit_span ) => {
515
518
vec ! [
516
519
TokenTree :: token_alone( token:: Eq , span) ,
517
- TokenTree :: Token ( lit. to_token( ) , Spacing :: Alone ) ,
520
+ TokenTree :: Token ( lit. to_token( lit_span ) , Spacing :: Alone ) ,
518
521
]
519
522
}
520
523
MetaItemKind :: List ( ref list) => {
@@ -555,9 +558,9 @@ impl MetaItemKind {
555
558
Some ( TokenTree :: Delimited ( _, Delimiter :: Invisible , inner_tokens) ) => {
556
559
MetaItemKind :: name_value_from_tokens ( & mut inner_tokens. into_trees ( ) )
557
560
}
558
- Some ( TokenTree :: Token ( token, _) ) => {
559
- Lit :: from_token ( & token ) . ok ( ) . map ( MetaItemKind :: NameValue )
560
- }
561
+ Some ( TokenTree :: Token ( token, _) ) => Lit :: from_token ( & token )
562
+ . ok ( )
563
+ . map ( | ( lit , lit_span ) | MetaItemKind :: NameValue ( lit , lit_span ) ) ,
561
564
_ => None ,
562
565
}
563
566
}
@@ -570,10 +573,12 @@ impl MetaItemKind {
570
573
}
571
574
MacArgs :: Delimited ( ..) => None ,
572
575
MacArgs :: Eq ( _, MacArgsEq :: Ast ( expr) ) => match & expr. kind {
573
- ast:: ExprKind :: Lit ( lit) => Some ( MetaItemKind :: NameValue ( lit. clone ( ) ) ) ,
576
+ ast:: ExprKind :: Lit ( lit) => Some ( MetaItemKind :: NameValue ( lit. clone ( ) , expr . span ) ) ,
574
577
_ => None ,
575
578
} ,
576
- MacArgs :: Eq ( _, MacArgsEq :: Hir ( lit) ) => Some ( MetaItemKind :: NameValue ( lit. clone ( ) ) ) ,
579
+ MacArgs :: Eq ( _, MacArgsEq :: Hir ( lit, span) ) => {
580
+ Some ( MetaItemKind :: NameValue ( lit. clone ( ) , * span) )
581
+ }
577
582
}
578
583
}
579
584
@@ -600,15 +605,15 @@ impl NestedMetaItem {
600
605
pub fn span ( & self ) -> Span {
601
606
match * self {
602
607
NestedMetaItem :: MetaItem ( ref item) => item. span ,
603
- NestedMetaItem :: Literal ( ref lit ) => lit . span ,
608
+ NestedMetaItem :: Literal ( _ , lit_span ) => lit_span ,
604
609
}
605
610
}
606
611
607
612
fn token_trees ( & self ) -> Vec < TokenTree > {
608
613
match * self {
609
614
NestedMetaItem :: MetaItem ( ref item) => item. token_trees ( ) ,
610
- NestedMetaItem :: Literal ( ref lit) => {
611
- vec ! [ TokenTree :: Token ( lit. to_token( ) , Spacing :: Alone ) ]
615
+ NestedMetaItem :: Literal ( ref lit, lit_span ) => {
616
+ vec ! [ TokenTree :: Token ( lit. to_token( lit_span ) , Spacing :: Alone ) ]
612
617
}
613
618
}
614
619
}
@@ -619,10 +624,10 @@ impl NestedMetaItem {
619
624
{
620
625
match tokens. peek ( ) {
621
626
Some ( TokenTree :: Token ( token, _) )
622
- if let Ok ( lit) = Lit :: from_token ( token) =>
627
+ if let Ok ( ( lit, lit_span ) ) = Lit :: from_token ( token) =>
623
628
{
624
629
tokens. next ( ) ;
625
- return Some ( NestedMetaItem :: Literal ( lit) ) ;
630
+ return Some ( NestedMetaItem :: Literal ( lit, lit_span ) ) ;
626
631
}
627
632
Some ( TokenTree :: Delimited ( _, Delimiter :: Invisible , inner_tokens) ) => {
628
633
let inner_tokens = inner_tokens. clone ( ) ;
0 commit comments