@@ -76,6 +76,8 @@ fn should_enum_be_skipped(name: &str) -> bool {
7676fn should_node_be_skipped ( name : & str ) -> bool {
7777 name == "TypeAnchor" // we flatten TypeAnchor into PathSegment in the extractor
7878 || name == "MacroStmts" // we workaround a getter bug in the extractor
79+ || name == "ParenExpr" // parenthesized expressions are extracted as their inner expression
80+ || name == "ParenPat" // parenthesized patterns are extracted as their inner pattern
7981}
8082
8183fn should_node_be_skipped_in_extractor ( name : & str ) -> bool {
@@ -133,6 +135,7 @@ fn get_additional_fields(node_name: &str) -> Vec<FieldInfo> {
133135 FieldInfo :: body( "body" , "TokenTree" ) ,
134136 ] ,
135137 "MacroCall" => vec ! [ FieldInfo :: body( "token_tree" , "TokenTree" ) ] ,
138+ "MacroExpr" | "RecordExpr" => vec ! [ FieldInfo :: list( "attrs" , "AnyAttr" ) ] ,
136139 "FormatArgsExpr" => vec ! [ FieldInfo :: list( "args" , "FormatArgsArg" ) ] ,
137140 "ArgList" => vec ! [ FieldInfo :: list( "args" , "Expr" ) ] ,
138141 "Fn" => vec ! [ FieldInfo :: body( "body" , "BlockExpr" ) ] ,
@@ -349,6 +352,7 @@ struct EnumVariantInfo {
349352 name : String ,
350353 snake_case_name : String ,
351354 variant_ast_name : String ,
355+ emission : String ,
352356}
353357
354358#[ derive( Serialize ) ]
@@ -365,6 +369,8 @@ struct ExtractorNodeFieldInfo {
365369 name : String ,
366370 method : String ,
367371 snake_case_ty : String ,
372+ attributes : bool ,
373+ parenthesized_attrs : bool ,
368374 string : bool ,
369375 predicate : bool ,
370376 optional : bool ,
@@ -399,10 +405,16 @@ fn enum_to_extractor_info(node: &AstEnumSrc) -> ExtractorEnumInfo {
399405 . map ( |v| {
400406 let name = class_name ( v) ;
401407 let snake_case_name = to_lower_snake_case ( v) ;
408+ let emission = match v. as_str ( ) {
409+ "ParenExpr" => "self.emit_parenthesized_expr(inner)" . to_owned ( ) ,
410+ "ParenPat" => "self.emit_parenthesized_pat(inner)" . to_owned ( ) ,
411+ _ => format ! ( "self.emit_{snake_case_name}(inner).map(Into::into)" ) ,
412+ } ;
402413 EnumVariantInfo {
403414 name,
404415 snake_case_name,
405416 variant_ast_name : v. to_string ( ) ,
417+ emission,
406418 }
407419 } )
408420 . collect ( ) ,
@@ -412,6 +424,7 @@ fn enum_to_extractor_info(node: &AstEnumSrc) -> ExtractorEnumInfo {
412424
413425fn field_info_to_extractor_info ( name : & str , field : & FieldInfo ) -> ExtractorNodeFieldInfo {
414426 let name = property_name ( name, & field. name ) ;
427+ let attributes = name == "attrs" ;
415428 match & field. ty {
416429 FieldType :: String => ExtractorNodeFieldInfo {
417430 name,
@@ -440,6 +453,7 @@ fn field_info_to_extractor_info(name: &str, field: &FieldInfo) -> ExtractorNodeF
440453 } ,
441454 FieldType :: List ( ty) => ExtractorNodeFieldInfo {
442455 name,
456+ attributes,
443457 method : if ty == "AnyAttr" {
444458 "attrs_with_doc" . to_owned ( )
445459 } else {
@@ -453,12 +467,19 @@ fn field_info_to_extractor_info(name: &str, field: &FieldInfo) -> ExtractorNodeF
453467}
454468fn node_to_extractor_info ( node : & AstNodeSrc ) -> ExtractorNodeInfo {
455469 let fields = get_fields ( node) ;
456- let has_attrs = fields . iter ( ) . any ( |f| f . name == "attrs ") ;
470+ let parenthesized_attrs = matches ! ( node . name . as_str ( ) , "MacroExpr" | "RecordExpr ") ;
457471 let name = class_name ( & node. name ) ;
458- let fields = fields
472+ let fields: Vec < _ > = fields
459473 . iter ( )
460474 . map ( |f| field_info_to_extractor_info ( & name, f) )
475+ . map ( |mut f| {
476+ f. parenthesized_attrs = parenthesized_attrs && f. name == "attrs" ;
477+ f
478+ } )
461479 . collect ( ) ;
480+ let has_attrs = fields
481+ . iter ( )
482+ . any ( |f| f. name == "attrs" && !f. parenthesized_attrs ) ;
462483 ExtractorNodeInfo {
463484 name,
464485 snake_case_name : to_lower_snake_case ( & node. name ) ,
0 commit comments