@@ -166,213 +166,187 @@ struct FieldInfo {
166
166
name : String ,
167
167
ty : FieldType ,
168
168
}
169
- fn get_fields ( node : & AstNodeSrc ) -> Vec < FieldInfo > {
170
- let mut result = Vec :: new ( ) ;
171
- let predicates = [
172
- "async" , "auto" , "const" , "default" , "gen" , "move" , "mut" , "raw" , "ref" , "static" , "try" ,
173
- "unsafe" ,
174
- ] ;
175
- for field in & node. fields {
176
- if let Field :: Token ( name) = field {
177
- if predicates. contains ( & name. as_str ( ) ) {
178
- result. push ( FieldInfo {
179
- name : format ! ( "is_{name}" ) ,
180
- ty : FieldType :: Predicate ,
181
- } ) ;
182
- }
183
- }
184
- }
185
169
170
+ fn get_additional_fields ( node : & AstNodeSrc ) -> Vec < FieldInfo > {
186
171
match node. name . as_str ( ) {
187
- "Name" | "NameRef" | "Lifetime" => {
188
- result. push ( FieldInfo {
189
- name : "text" . to_string ( ) ,
190
- ty : FieldType :: String ,
191
- } ) ;
192
- }
193
- "Abi" => {
194
- result. push ( FieldInfo {
195
- name : "abi_string" . to_string ( ) ,
196
- ty : FieldType :: String ,
197
- } ) ;
198
- }
199
- "Literal" => {
200
- result. push ( FieldInfo {
201
- name : "text_value" . to_string ( ) ,
202
- ty : FieldType :: String ,
203
- } ) ;
204
- }
205
- "PrefixExpr" => {
206
- result. push ( FieldInfo {
207
- name : "operator_name" . to_string ( ) ,
208
- ty : FieldType :: String ,
209
- } ) ;
210
- }
211
- "BinExpr" => {
212
- result. push ( FieldInfo {
172
+ "Name" | "NameRef" | "Lifetime" => vec ! [ FieldInfo {
173
+ name: "text" . to_string( ) ,
174
+ ty: FieldType :: String ,
175
+ } ] ,
176
+ "Abi" => vec ! [ FieldInfo {
177
+ name: "abi_string" . to_string( ) ,
178
+ ty: FieldType :: String ,
179
+ } ] ,
180
+ "Literal" => vec ! [ FieldInfo {
181
+ name: "text_value" . to_string( ) ,
182
+ ty: FieldType :: String ,
183
+ } ] ,
184
+ "PrefixExpr" => vec ! [ FieldInfo {
185
+ name: "operator_name" . to_string( ) ,
186
+ ty: FieldType :: String ,
187
+ } ] ,
188
+ "BinExpr" => vec ! [
189
+ FieldInfo {
213
190
name: "lhs" . to_string( ) ,
214
191
ty: FieldType :: Optional ( "Expr" . to_string( ) ) ,
215
- } ) ;
216
- result . push ( FieldInfo {
192
+ } ,
193
+ FieldInfo {
217
194
name: "rhs" . to_string( ) ,
218
195
ty: FieldType :: Optional ( "Expr" . to_string( ) ) ,
219
- } ) ;
220
- result . push ( FieldInfo {
196
+ } ,
197
+ FieldInfo {
221
198
name: "operator_name" . to_string( ) ,
222
199
ty: FieldType :: String ,
223
- } ) ;
224
- }
225
- "IfExpr" => {
226
- result . push ( FieldInfo {
200
+ } ,
201
+ ] ,
202
+ "IfExpr" => vec ! [
203
+ FieldInfo {
227
204
name: "then_branch" . to_string( ) ,
228
205
ty: FieldType :: Optional ( "BlockExpr" . to_string( ) ) ,
229
- } ) ;
230
- result . push ( FieldInfo {
206
+ } ,
207
+ FieldInfo {
231
208
name: "else_branch" . to_string( ) ,
232
209
ty: FieldType :: Optional ( "ElseBranch" . to_string( ) ) ,
233
- } ) ;
234
- result . push ( FieldInfo {
210
+ } ,
211
+ FieldInfo {
235
212
name: "condition" . to_string( ) ,
236
213
ty: FieldType :: Optional ( "Expr" . to_string( ) ) ,
237
- } ) ;
238
- }
239
- "RangeExpr" => {
240
- result . push ( FieldInfo {
214
+ } ,
215
+ ] ,
216
+ "RangeExpr" => vec ! [
217
+ FieldInfo {
241
218
name: "start" . to_string( ) ,
242
219
ty: FieldType :: Optional ( "Expr" . to_string( ) ) ,
243
- } ) ;
244
- result . push ( FieldInfo {
220
+ } ,
221
+ FieldInfo {
245
222
name: "end" . to_string( ) ,
246
223
ty: FieldType :: Optional ( "Expr" . to_string( ) ) ,
247
- } ) ;
248
- result . push ( FieldInfo {
224
+ } ,
225
+ FieldInfo {
249
226
name: "operator_name" . to_string( ) ,
250
227
ty: FieldType :: String ,
251
- } ) ;
252
- }
253
- "RangePat" => {
254
- result . push ( FieldInfo {
228
+ } ,
229
+ ] ,
230
+ "RangePat" => vec ! [
231
+ FieldInfo {
255
232
name: "start" . to_string( ) ,
256
233
ty: FieldType :: Optional ( "Pat" . to_string( ) ) ,
257
- } ) ;
258
- result . push ( FieldInfo {
234
+ } ,
235
+ FieldInfo {
259
236
name: "end" . to_string( ) ,
260
237
ty: FieldType :: Optional ( "Pat" . to_string( ) ) ,
261
- } ) ;
262
- result . push ( FieldInfo {
238
+ } ,
239
+ FieldInfo {
263
240
name: "operator_name" . to_string( ) ,
264
241
ty: FieldType :: String ,
265
- } ) ;
266
- }
267
- "IndexExpr" => {
268
- result . push ( FieldInfo {
242
+ } ,
243
+ ] ,
244
+ "IndexExpr" => vec ! [
245
+ FieldInfo {
269
246
name: "index" . to_string( ) ,
270
247
ty: FieldType :: Optional ( "Expr" . to_string( ) ) ,
271
- } ) ;
272
- result . push ( FieldInfo {
248
+ } ,
249
+ FieldInfo {
273
250
name: "base" . to_string( ) ,
274
251
ty: FieldType :: Optional ( "Expr" . to_string( ) ) ,
275
- } ) ;
276
- }
277
- "Impl" => {
278
- result . push ( FieldInfo {
252
+ } ,
253
+ ] ,
254
+ "Impl" => vec ! [
255
+ FieldInfo {
279
256
name: "trait_" . to_string( ) ,
280
257
ty: FieldType :: Optional ( "Type" . to_string( ) ) ,
281
- } ) ;
282
- result . push ( FieldInfo {
258
+ } ,
259
+ FieldInfo {
283
260
name: "self_ty" . to_string( ) ,
284
261
ty: FieldType :: Optional ( "Type" . to_string( ) ) ,
285
- } ) ;
286
- }
287
- "ForExpr" => {
288
- result. push ( FieldInfo {
289
- name : "iterable" . to_string ( ) ,
290
- ty : FieldType :: Optional ( "Expr" . to_string ( ) ) ,
291
- } ) ;
292
- }
293
- "WhileExpr" => {
294
- result. push ( FieldInfo {
295
- name : "condition" . to_string ( ) ,
296
- ty : FieldType :: Optional ( "Expr" . to_string ( ) ) ,
297
- } ) ;
298
- }
299
- "MatchGuard" => {
300
- result. push ( FieldInfo {
301
- name : "condition" . to_string ( ) ,
302
- ty : FieldType :: Optional ( "Expr" . to_string ( ) ) ,
303
- } ) ;
304
- }
305
- "MacroDef" => {
306
- result. push ( FieldInfo {
262
+ } ,
263
+ ] ,
264
+ "ForExpr" => vec ! [ FieldInfo {
265
+ name: "iterable" . to_string( ) ,
266
+ ty: FieldType :: Optional ( "Expr" . to_string( ) ) ,
267
+ } ] ,
268
+ "WhileExpr" => vec ! [ FieldInfo {
269
+ name: "condition" . to_string( ) ,
270
+ ty: FieldType :: Optional ( "Expr" . to_string( ) ) ,
271
+ } ] ,
272
+ "MatchGuard" => vec ! [ FieldInfo {
273
+ name: "condition" . to_string( ) ,
274
+ ty: FieldType :: Optional ( "Expr" . to_string( ) ) ,
275
+ } ] ,
276
+ "MacroDef" => vec ! [
277
+ FieldInfo {
307
278
name: "args" . to_string( ) ,
308
279
ty: FieldType :: Optional ( "TokenTree" . to_string( ) ) ,
309
- } ) ;
310
- result . push ( FieldInfo {
280
+ } ,
281
+ FieldInfo {
311
282
name: "body" . to_string( ) ,
312
283
ty: FieldType :: Optional ( "TokenTree" . to_string( ) ) ,
313
- } ) ;
314
- }
315
- "FormatArgsExpr" => {
316
- result . push ( FieldInfo {
317
- name : "args ". to_string ( ) ,
318
- ty : FieldType :: List ( "FormatArgsArg" . to_string ( ) ) ,
319
- } ) ;
320
- }
321
- "ArgList" => {
322
- result . push ( FieldInfo {
323
- name : "args" . to_string ( ) ,
324
- ty : FieldType :: List ( "Expr ". to_string ( ) ) ,
325
- } ) ;
326
- }
327
- "Fn " => {
328
- result . push ( FieldInfo {
329
- name : "body ". to_string ( ) ,
330
- ty : FieldType :: Optional ( "BlockExpr" . to_string ( ) ) ,
331
- } ) ;
332
- }
333
- "Const" => {
334
- result . push ( FieldInfo {
335
- name : "body" . to_string ( ) ,
336
- ty : FieldType :: Optional ( "Expr ". to_string ( ) ) ,
337
- } ) ;
338
- }
339
- "Static " => {
340
- result . push ( FieldInfo {
341
- name : "body" . to_string ( ) ,
342
- ty : FieldType :: Optional ( "Expr" . to_string ( ) ) ,
343
- } ) ;
344
- }
345
- "ClosureExpr" => {
346
- result . push ( FieldInfo {
347
- name : "body" . to_string ( ) ,
348
- ty : FieldType :: Optional ( "Expr ". to_string ( ) ) ,
349
- } ) ;
350
- }
351
- "ArrayExpr" => {
352
- result . push ( FieldInfo {
353
- name : "is_semicolon" . to_string ( ) ,
354
- ty : FieldType :: Predicate ,
355
- } ) ;
356
- }
357
- "SelfParam" => {
358
- result . push ( FieldInfo {
359
- name : "is_amp" . to_string ( ) ,
360
- ty : FieldType :: Predicate ,
361
- } ) ;
362
- }
363
- "UseTree" => {
364
- result . push ( FieldInfo {
365
- name : "is_star" . to_string ( ) ,
366
- ty : FieldType :: Predicate ,
367
- } ) ;
284
+ } ,
285
+ ] ,
286
+ "FormatArgsExpr" => vec ! [ FieldInfo {
287
+ name : "args" . to_string ( ) ,
288
+ ty : FieldType :: List ( "FormatArgsArg ". to_string( ) ) ,
289
+ } ] ,
290
+ "ArgList" => vec ! [ FieldInfo {
291
+ name : "args" . to_string ( ) ,
292
+ ty : FieldType :: List ( "Expr" . to_string ( ) ) ,
293
+ } ] ,
294
+ "Fn" => vec ! [ FieldInfo {
295
+ name : "body ". to_string( ) ,
296
+ ty : FieldType :: Optional ( "BlockExpr" . to_string ( ) ) ,
297
+ } ] ,
298
+ "Const " => vec ! [ FieldInfo {
299
+ name : "body" . to_string ( ) ,
300
+ ty : FieldType :: Optional ( "Expr ". to_string( ) ) ,
301
+ } ] ,
302
+ "Static" => vec ! [ FieldInfo {
303
+ name : "body" . to_string ( ) ,
304
+ ty : FieldType :: Optional ( "Expr" . to_string ( ) ) ,
305
+ } ] ,
306
+ "ClosureExpr" => vec ! [ FieldInfo {
307
+ name : "body ". to_string( ) ,
308
+ ty : FieldType :: Optional ( "Expr" . to_string ( ) ) ,
309
+ } ] ,
310
+ "ArrayExpr " => vec ! [ FieldInfo {
311
+ name : "is_semicolon" . to_string ( ) ,
312
+ ty : FieldType :: Predicate ,
313
+ } ] ,
314
+ "SelfParam" => vec ! [ FieldInfo {
315
+ name : "is_amp" . to_string ( ) ,
316
+ ty : FieldType :: Predicate ,
317
+ } ] ,
318
+ "UseTree" => vec ! [ FieldInfo {
319
+ name : "is_star ". to_string( ) ,
320
+ ty : FieldType :: Predicate ,
321
+ } ] ,
322
+ _ => vec ! [ ] ,
323
+ }
324
+ }
325
+ fn get_fields ( node : & AstNodeSrc ) -> Vec < FieldInfo > {
326
+ let mut result = Vec :: new ( ) ;
327
+ let predicates = [
328
+ "async" , "auto" , "const" , "default" , "gen" , "move" , "mut" , "raw" , "ref" , "static" , "try" ,
329
+ "unsafe" ,
330
+ ] ;
331
+ for field in & node . fields {
332
+ if let Field :: Token ( name ) = field {
333
+ if predicates . contains ( & name . as_str ( ) ) {
334
+ result . push ( FieldInfo {
335
+ name : format ! ( "is_{name}" ) ,
336
+ ty : FieldType :: Predicate ,
337
+ } ) ;
338
+ }
368
339
}
369
- _ => { }
370
340
}
371
341
342
+ result. extend ( get_additional_fields ( node) ) ;
343
+
372
344
for field in & node. fields {
373
- // The ArrayExpr type also has an 'exprs' field
374
- if node. name == "ArrayExpr" && field. method_name ( ) == "expr" {
375
- continue ;
345
+ match ( node. name . as_str ( ) , field. method_name ( ) . as_str ( ) ) {
346
+ ( "ArrayExpr" , "expr" ) // The ArrayExpr type also has an 'exprs' field
347
+ | ( "PathSegment" , "ty" | "path_type" ) // these are broken, handling them manually
348
+ => continue ,
349
+ _ => { }
376
350
}
377
351
let ty = match field {
378
352
Field :: Token ( _) => continue ,
0 commit comments