@@ -11,7 +11,7 @@ use quote::quote;
11
11
#[ allow( non_camel_case_types) ]
12
12
mod kw {
13
13
syn:: custom_keyword!( Keywords ) ;
14
- syn:: custom_keyword!( Other ) ;
14
+ syn:: custom_keyword!( Symbols ) ;
15
15
}
16
16
17
17
struct Keyword {
@@ -33,14 +33,24 @@ impl Parse for Keyword {
33
33
}
34
34
}
35
35
36
- struct Symbol ( Ident ) ;
36
+ struct Symbol {
37
+ name : Ident ,
38
+ value : Option < LitStr > ,
39
+ }
37
40
38
41
impl Parse for Symbol {
39
42
fn parse ( input : ParseStream < ' _ > ) -> Result < Self > {
40
- let ident: Ident = input. parse ( ) ?;
43
+ let name = input. parse ( ) ?;
44
+ let value = match input. parse :: < Token ! [ : ] > ( ) {
45
+ Ok ( _) => Some ( input. parse ( ) ?) ,
46
+ Err ( _) => None ,
47
+ } ;
41
48
input. parse :: < Token ! [ , ] > ( ) ?;
42
49
43
- Ok ( Symbol ( ident) )
50
+ Ok ( Symbol {
51
+ name,
52
+ value,
53
+ } )
44
54
}
45
55
}
46
56
@@ -69,7 +79,7 @@ impl Parse for Input {
69
79
braced ! ( content in input) ;
70
80
let keywords = content. parse ( ) ?;
71
81
72
- input. parse :: < kw:: Other > ( ) ?;
82
+ input. parse :: < kw:: Symbols > ( ) ?;
73
83
let content;
74
84
braced ! ( content in input) ;
75
85
let symbols = content. parse ( ) ?;
@@ -116,19 +126,22 @@ pub fn symbols(input: TokenStream) -> TokenStream {
116
126
}
117
127
118
128
for symbol in & input. symbols . 0 {
119
- let value = & symbol. 0 ;
120
- let value_str = value. to_string ( ) ;
121
- check_dup ( & value_str) ;
129
+ let name = & symbol. name ;
130
+ let value = match & symbol. value {
131
+ Some ( value) => value. value ( ) ,
132
+ None => name. to_string ( ) ,
133
+ } ;
134
+ check_dup ( & value) ;
122
135
prefill_stream. extend ( quote ! {
123
- #value_str ,
136
+ #value ,
124
137
} ) ;
125
138
symbols_stream. extend ( quote ! {
126
- pub const #value : Symbol = Symbol :: new( #counter) ;
139
+ pub const #name : Symbol = Symbol :: new( #counter) ;
127
140
} ) ;
128
141
counter += 1 ;
129
142
}
130
143
131
- TokenStream :: from ( quote ! {
144
+ let tt = TokenStream :: from ( quote ! {
132
145
macro_rules! keywords {
133
146
( ) => {
134
147
#keyword_stream
@@ -159,5 +172,11 @@ pub fn symbols(input: TokenStream) -> TokenStream {
159
172
] )
160
173
}
161
174
}
162
- } )
175
+ } ) ;
176
+
177
+ // To see the generated code generated, uncomment this line, recompile, and
178
+ // run the resulting output through `rustfmt`.
179
+ //eprintln!("{}", tt);
180
+
181
+ tt
163
182
}
0 commit comments