@@ -42,8 +42,11 @@ struct PropertyDefinitions {
42
42
/// `"snowy": Snowy(false)` or `"axis": properties::Axis::Y`
43
43
#[ derive( Debug ) ]
44
44
struct PropertyWithNameAndDefault {
45
- // "snowy" / "axis"
45
+ // "snowy" "axis"
46
46
name : String ,
47
+ /// The property name, potentially modified so it works better as a struct
48
+ /// field.
49
+ name_ident : Ident ,
47
50
// Snowy / Axis
48
51
property_type : Ident ,
49
52
property_value_type : Ident ,
@@ -100,8 +103,11 @@ impl Parse for PropertyWithNameAndDefault {
100
103
}
101
104
} ;
102
105
106
+ let property_name_ident = name_to_ident ( & property_name) ;
107
+
103
108
Ok ( PropertyWithNameAndDefault {
104
109
name : property_name,
110
+ name_ident : property_name_ident,
105
111
property_type,
106
112
property_value_type,
107
113
is_enum,
@@ -433,6 +439,7 @@ pub fn make_block_states(input: TokenStream) -> TokenStream {
433
439
write ! ( property_name, "_{index}" ) . unwrap ( ) ;
434
440
}
435
441
properties_with_name. push ( PropertyWithNameAndDefault {
442
+ name_ident : name_to_ident ( & property_name) ,
436
443
name : property_name,
437
444
property_type : property. property_type . clone ( ) ,
438
445
property_value_type : property. property_value_type . clone ( ) ,
@@ -452,12 +459,11 @@ pub fn make_block_states(input: TokenStream) -> TokenStream {
452
459
let mut block_struct_fields = quote ! { } ;
453
460
for PropertyWithNameAndDefault {
454
461
property_value_type,
455
- name ,
462
+ name_ident ,
456
463
is_enum,
457
464
..
458
465
} in & properties_with_name
459
466
{
460
- let name_ident = Ident :: new_raw ( name, proc_macro2:: Span :: call_site ( ) ) ;
461
467
block_struct_fields. extend ( if * is_enum {
462
468
quote ! { pub #name_ident: properties:: #property_value_type, }
463
469
} else {
@@ -496,7 +502,7 @@ pub fn make_block_states(input: TokenStream) -> TokenStream {
496
502
let mut from_block_to_state_combination_match_inner = quote ! { } ;
497
503
for i in 0 ..properties_with_name. len ( ) {
498
504
let property = & properties_with_name[ i] ;
499
- let property_name = & property. name ;
505
+ let property_name_ident = & property. name_ident ;
500
506
let property_value_name_ident = & property. property_type ;
501
507
let variant =
502
508
Ident :: new ( & combination[ i] . to_string ( ) , proc_macro2:: Span :: call_site ( ) ) ;
@@ -519,8 +525,6 @@ pub fn make_block_states(input: TokenStream) -> TokenStream {
519
525
quote ! { #variant}
520
526
} ;
521
527
522
- let property_name_ident =
523
- Ident :: new_raw ( property_name, proc_macro2:: Span :: call_site ( ) ) ;
524
528
from_block_to_state_combination_match_inner. extend ( quote ! {
525
529
#property_name_ident: #property_variant,
526
530
} ) ;
@@ -582,7 +586,7 @@ pub fn make_block_states(input: TokenStream) -> TokenStream {
582
586
for i in ( 0 ..properties_with_name. len ( ) ) . rev ( ) {
583
587
let PropertyWithNameAndDefault {
584
588
property_type : property_struct_name_ident,
585
- name : property_name ,
589
+ name_ident : property_name_ident ,
586
590
property_value_type,
587
591
..
588
592
} = & properties_with_name[ i] ;
@@ -598,7 +602,6 @@ pub fn make_block_states(input: TokenStream) -> TokenStream {
598
602
quote ! { properties:: #property_struct_name_ident:: from( ( b / #division) % #property_variants_count) }
599
603
}
600
604
} ;
601
- let property_name_ident = Ident :: new_raw ( property_name, proc_macro2:: Span :: call_site ( ) ) ;
602
605
from_state_to_block_inner. extend ( quote ! {
603
606
#property_name_ident: #conversion_code,
604
607
} ) ;
@@ -627,12 +630,11 @@ pub fn make_block_states(input: TokenStream) -> TokenStream {
627
630
628
631
let mut block_default_fields = quote ! { } ;
629
632
for PropertyWithNameAndDefault {
630
- name ,
633
+ name_ident ,
631
634
default : property_default,
632
635
..
633
636
} in properties_with_name
634
637
{
635
- let name_ident = Ident :: new_raw ( & name, proc_macro2:: Span :: call_site ( ) ) ;
636
638
block_default_fields. extend ( quote ! { #name_ident: #property_default, } ) ;
637
639
}
638
640
@@ -821,3 +823,13 @@ pub fn make_block_states(input: TokenStream) -> TokenStream {
821
823
822
824
generated. into ( )
823
825
}
826
+
827
+ /// Convert a name to a Rust identifier, replacing some Rust keywords with
828
+ /// alternatives (e.g. `type` -> `kind`).
829
+ fn name_to_ident ( name : & str ) -> Ident {
830
+ let ident_str = match name {
831
+ "type" => "kind" ,
832
+ _ => & name,
833
+ } ;
834
+ Ident :: new ( ident_str, proc_macro2:: Span :: call_site ( ) )
835
+ }
0 commit comments