@@ -166,213 +166,187 @@ struct FieldInfo {
166166 name : String ,
167167 ty : FieldType ,
168168}
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- }
185169
170+ fn get_additional_fields ( node : & AstNodeSrc ) -> Vec < FieldInfo > {
186171 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 {
213190 name: "lhs" . to_string( ) ,
214191 ty: FieldType :: Optional ( "Expr" . to_string( ) ) ,
215- } ) ;
216- result . push ( FieldInfo {
192+ } ,
193+ FieldInfo {
217194 name: "rhs" . to_string( ) ,
218195 ty: FieldType :: Optional ( "Expr" . to_string( ) ) ,
219- } ) ;
220- result . push ( FieldInfo {
196+ } ,
197+ FieldInfo {
221198 name: "operator_name" . to_string( ) ,
222199 ty: FieldType :: String ,
223- } ) ;
224- }
225- "IfExpr" => {
226- result . push ( FieldInfo {
200+ } ,
201+ ] ,
202+ "IfExpr" => vec ! [
203+ FieldInfo {
227204 name: "then_branch" . to_string( ) ,
228205 ty: FieldType :: Optional ( "BlockExpr" . to_string( ) ) ,
229- } ) ;
230- result . push ( FieldInfo {
206+ } ,
207+ FieldInfo {
231208 name: "else_branch" . to_string( ) ,
232209 ty: FieldType :: Optional ( "ElseBranch" . to_string( ) ) ,
233- } ) ;
234- result . push ( FieldInfo {
210+ } ,
211+ FieldInfo {
235212 name: "condition" . to_string( ) ,
236213 ty: FieldType :: Optional ( "Expr" . to_string( ) ) ,
237- } ) ;
238- }
239- "RangeExpr" => {
240- result . push ( FieldInfo {
214+ } ,
215+ ] ,
216+ "RangeExpr" => vec ! [
217+ FieldInfo {
241218 name: "start" . to_string( ) ,
242219 ty: FieldType :: Optional ( "Expr" . to_string( ) ) ,
243- } ) ;
244- result . push ( FieldInfo {
220+ } ,
221+ FieldInfo {
245222 name: "end" . to_string( ) ,
246223 ty: FieldType :: Optional ( "Expr" . to_string( ) ) ,
247- } ) ;
248- result . push ( FieldInfo {
224+ } ,
225+ FieldInfo {
249226 name: "operator_name" . to_string( ) ,
250227 ty: FieldType :: String ,
251- } ) ;
252- }
253- "RangePat" => {
254- result . push ( FieldInfo {
228+ } ,
229+ ] ,
230+ "RangePat" => vec ! [
231+ FieldInfo {
255232 name: "start" . to_string( ) ,
256233 ty: FieldType :: Optional ( "Pat" . to_string( ) ) ,
257- } ) ;
258- result . push ( FieldInfo {
234+ } ,
235+ FieldInfo {
259236 name: "end" . to_string( ) ,
260237 ty: FieldType :: Optional ( "Pat" . to_string( ) ) ,
261- } ) ;
262- result . push ( FieldInfo {
238+ } ,
239+ FieldInfo {
263240 name: "operator_name" . to_string( ) ,
264241 ty: FieldType :: String ,
265- } ) ;
266- }
267- "IndexExpr" => {
268- result . push ( FieldInfo {
242+ } ,
243+ ] ,
244+ "IndexExpr" => vec ! [
245+ FieldInfo {
269246 name: "index" . to_string( ) ,
270247 ty: FieldType :: Optional ( "Expr" . to_string( ) ) ,
271- } ) ;
272- result . push ( FieldInfo {
248+ } ,
249+ FieldInfo {
273250 name: "base" . to_string( ) ,
274251 ty: FieldType :: Optional ( "Expr" . to_string( ) ) ,
275- } ) ;
276- }
277- "Impl" => {
278- result . push ( FieldInfo {
252+ } ,
253+ ] ,
254+ "Impl" => vec ! [
255+ FieldInfo {
279256 name: "trait_" . to_string( ) ,
280257 ty: FieldType :: Optional ( "Type" . to_string( ) ) ,
281- } ) ;
282- result . push ( FieldInfo {
258+ } ,
259+ FieldInfo {
283260 name: "self_ty" . to_string( ) ,
284261 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 {
307278 name: "args" . to_string( ) ,
308279 ty: FieldType :: Optional ( "TokenTree" . to_string( ) ) ,
309- } ) ;
310- result . push ( FieldInfo {
280+ } ,
281+ FieldInfo {
311282 name: "body" . to_string( ) ,
312283 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+ }
368339 }
369- _ => { }
370340 }
371341
342+ result. extend ( get_additional_fields ( node) ) ;
343+
372344 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+ _ => { }
376350 }
377351 let ty = match field {
378352 Field :: Token ( _) => continue ,
0 commit comments