1
1
use std:: { fmt:: Display , str:: FromStr as _} ;
2
2
3
+ use crate :: syn_compat:: { AttributeExt as _, NestedMeta , ParsedMeta } ;
3
4
use proc_macro2:: { Ident , Span , TokenStream } ;
4
5
use quote:: { quote, quote_spanned} ;
5
6
use syn:: {
6
7
parse:: Parser as _, punctuated:: Punctuated , spanned:: Spanned as _, Error , Result ,
7
8
} ;
9
+ use syn:: { Expr , ExprLit } ;
8
10
9
11
use crate :: utils;
10
12
use utils:: { HashMap , HashSet } ;
@@ -220,21 +222,20 @@ impl<'a, 'b> State<'a, 'b> {
220
222
& self ,
221
223
attrs : & [ syn:: Attribute ] ,
222
224
meta_key : & str ,
223
- ) -> Result < Option < syn :: Meta > > {
225
+ ) -> Result < Option < ParsedMeta > > {
224
226
let mut metas = Vec :: new ( ) ;
225
227
for meta in attrs. iter ( ) . filter_map ( |attr| attr. parse_meta ( ) . ok ( ) ) {
226
228
let meta_list = match & meta {
227
- syn :: Meta :: List ( meta) => meta,
229
+ ParsedMeta :: List ( meta) => meta,
228
230
_ => continue ,
229
231
} ;
230
232
231
233
if !meta_list. path . is_ident ( self . trait_attr ) {
232
234
continue ;
233
235
}
234
236
235
- use syn:: { Meta , NestedMeta } ;
236
237
let meta_nv = match meta_list. nested . first ( ) {
237
- Some ( NestedMeta :: Meta ( Meta :: NameValue ( meta_nv) ) ) => meta_nv,
238
+ Some ( NestedMeta :: Meta ( ParsedMeta :: NameValue ( meta_nv) ) ) => meta_nv,
238
239
_ => {
239
240
// If the given attribute is not MetaNameValue, it most likely implies that the
240
241
// user is writing an incorrect format. For example:
@@ -337,20 +338,24 @@ impl<'a, 'b> State<'a, 'b> {
337
338
}
338
339
fn parse_meta_fmt (
339
340
& self ,
340
- meta : & syn :: Meta ,
341
+ meta : & ParsedMeta ,
341
342
outer_enum : bool ,
342
343
) -> Result < ( TokenStream , bool ) > {
343
344
let list = match meta {
344
- syn :: Meta :: List ( list) => list,
345
+ ParsedMeta :: List ( list) => list,
345
346
_ => {
346
347
return Err ( Error :: new ( meta. span ( ) , self . get_proper_fmt_syntax ( ) ) ) ;
347
348
}
348
349
} ;
349
350
350
351
match & list. nested [ 0 ] {
351
- syn :: NestedMeta :: Meta ( syn :: Meta :: NameValue ( syn:: MetaNameValue {
352
+ NestedMeta :: Meta ( ParsedMeta :: NameValue ( syn:: MetaNameValue {
352
353
path,
353
- lit : syn:: Lit :: Str ( fmt) ,
354
+ value :
355
+ Expr :: Lit ( ExprLit {
356
+ lit : syn:: Lit :: Str ( fmt) ,
357
+ ..
358
+ } ) ,
354
359
..
355
360
} ) ) => match path {
356
361
op if op. segments . first ( ) . expect ( "path shouldn't be empty" ) . ident
@@ -366,10 +371,14 @@ impl<'a, 'b> State<'a, 'b> {
366
371
}
367
372
// TODO: Check for a single `Display` group?
368
373
let fmt_string = match & list. nested [ 0 ] {
369
- syn :: NestedMeta :: Meta ( syn :: Meta :: NameValue (
374
+ NestedMeta :: Meta ( ParsedMeta :: NameValue (
370
375
syn:: MetaNameValue {
371
376
path,
372
- lit : syn:: Lit :: Str ( s) ,
377
+ value :
378
+ Expr :: Lit ( ExprLit {
379
+ lit : syn:: Lit :: Str ( s) ,
380
+ ..
381
+ } ) ,
373
382
..
374
383
} ,
375
384
) ) if path
@@ -403,8 +412,8 @@ impl<'a, 'b> State<'a, 'b> {
403
412
. skip ( 1 ) // skip fmt = "..."
404
413
. try_fold ( TokenStream :: new ( ) , |args, arg| {
405
414
let arg = match arg {
406
- syn :: NestedMeta :: Lit ( syn:: Lit :: Str ( s) ) => s,
407
- syn :: NestedMeta :: Meta ( syn :: Meta :: Path ( i) ) => {
415
+ NestedMeta :: Lit ( syn:: Lit :: Str ( s) ) => s,
416
+ NestedMeta :: Meta ( ParsedMeta :: Path ( i) ) => {
408
417
return Ok ( quote_spanned ! ( list. span( ) => #args #i, ) ) ;
409
418
}
410
419
_ => {
@@ -586,7 +595,7 @@ impl<'a, 'b> State<'a, 'b> {
586
595
let span = meta. span ( ) ;
587
596
588
597
let meta = match meta {
589
- syn :: Meta :: List ( meta) => meta. nested ,
598
+ ParsedMeta :: List ( meta) => meta. nested ,
590
599
_ => return Err ( Error :: new ( span, self . get_proper_bound_syntax ( ) ) ) ,
591
600
} ;
592
601
@@ -595,12 +604,15 @@ impl<'a, 'b> State<'a, 'b> {
595
604
}
596
605
597
606
let meta = match & meta[ 0 ] {
598
- syn :: NestedMeta :: Meta ( syn :: Meta :: NameValue ( meta) ) => meta,
607
+ NestedMeta :: Meta ( ParsedMeta :: NameValue ( meta) ) => meta,
599
608
_ => return Err ( Error :: new ( span, self . get_proper_bound_syntax ( ) ) ) ,
600
609
} ;
601
610
602
- let extra_bounds = match & meta. lit {
603
- syn:: Lit :: Str ( extra_bounds) => extra_bounds,
611
+ let extra_bounds = match & meta. value {
612
+ Expr :: Lit ( ExprLit {
613
+ lit : syn:: Lit :: Str ( extra_bounds) ,
614
+ ..
615
+ } ) => extra_bounds,
604
616
_ => return Err ( Error :: new ( span, self . get_proper_bound_syntax ( ) ) ) ,
605
617
} ;
606
618
@@ -615,7 +627,7 @@ impl<'a, 'b> State<'a, 'b> {
615
627
fn get_used_type_params_bounds (
616
628
& self ,
617
629
fields : & syn:: Fields ,
618
- meta : & syn :: Meta ,
630
+ meta : & ParsedMeta ,
619
631
) -> HashMap < syn:: Type , HashSet < syn:: TraitBound > > {
620
632
if self . type_params . is_empty ( ) {
621
633
return HashMap :: default ( ) ;
@@ -645,7 +657,7 @@ impl<'a, 'b> State<'a, 'b> {
645
657
}
646
658
647
659
let list = match meta {
648
- syn :: Meta :: List ( list) => list,
660
+ ParsedMeta :: List ( list) => list,
649
661
// This one has been checked already in get_meta_fmt() method.
650
662
_ => unreachable ! ( ) ,
651
663
} ;
@@ -655,10 +667,10 @@ impl<'a, 'b> State<'a, 'b> {
655
667
. skip ( 1 ) // skip fmt = "..."
656
668
. enumerate ( )
657
669
. filter_map ( |( i, arg) | match arg {
658
- syn :: NestedMeta :: Lit ( syn:: Lit :: Str ( ref s) ) => {
670
+ NestedMeta :: Lit ( syn:: Lit :: Str ( ref s) ) => {
659
671
syn:: parse_str ( & s. value ( ) ) . ok ( ) . map ( |id| ( i, id) )
660
672
}
661
- syn :: NestedMeta :: Meta ( syn :: Meta :: Path ( ref id) ) => Some ( ( i, id. clone ( ) ) ) ,
673
+ NestedMeta :: Meta ( ParsedMeta :: Path ( ref id) ) => Some ( ( i, id. clone ( ) ) ) ,
662
674
// This one has been checked already in get_meta_fmt() method.
663
675
_ => unreachable ! ( ) ,
664
676
} )
@@ -667,9 +679,13 @@ impl<'a, 'b> State<'a, 'b> {
667
679
return HashMap :: default ( ) ;
668
680
}
669
681
let fmt_string = match & list. nested [ 0 ] {
670
- syn :: NestedMeta :: Meta ( syn :: Meta :: NameValue ( syn:: MetaNameValue {
682
+ NestedMeta :: Meta ( ParsedMeta :: NameValue ( syn:: MetaNameValue {
671
683
path,
672
- lit : syn:: Lit :: Str ( s) ,
684
+ value :
685
+ Expr :: Lit ( ExprLit {
686
+ lit : syn:: Lit :: Str ( s) ,
687
+ ..
688
+ } ) ,
673
689
..
674
690
} ) ) if path
675
691
. segments
0 commit comments