@@ -23,9 +23,7 @@ fn class_name(type_name: &str) -> String {
2323 "Literal" => "LiteralExpr" . to_owned ( ) ,
2424 "ArrayExpr" => "ArrayExprInternal" . to_owned ( ) ,
2525 "AsmOptions" => "AsmOptionsList" . to_owned ( ) ,
26- _ if type_name. starts_with ( "Record" ) && type_name != "RecordFieldList" => {
27- type_name. replacen ( "Record" , "Struct" , 1 )
28- }
26+ _ if type_name. starts_with ( "Record" ) => type_name. replacen ( "Record" , "Struct" , 1 ) ,
2927 _ if type_name. ends_with ( "Type" ) => format ! ( "{}Repr" , type_name) ,
3028 _ => type_name. to_owned ( ) ,
3129 }
@@ -36,10 +34,14 @@ fn property_name(type_name: &str, field_name: &str) -> String {
3634 ( "CallExpr" , "expr" ) => "function" ,
3735 ( "LetExpr" , "expr" ) => "scrutinee" ,
3836 ( "MatchExpr" , "expr" ) => "scrutinee" ,
37+ ( "Variant" , "expr" ) => "discriminant" ,
38+ ( "FieldExpr" , "expr" ) => "container" ,
39+ ( _, "name_ref" ) => "identifier" ,
3940 ( _, "then_branch" ) => "then" ,
4041 ( _, "else_branch" ) => "else_" ,
41- ( "ArrayType " , "ty" ) => "element_type_repr" ,
42+ ( "ArrayTypeRepr " , "ty" ) => "element_type_repr" ,
4243 ( "SelfParam" , "is_amp" ) => "is_ref" ,
44+ ( "StructField" , "expr" ) => "default" ,
4345 ( "UseTree" , "is_star" ) => "is_glob" ,
4446 ( _, "ty" ) => "type_repr" ,
4547 _ if field_name. contains ( "record" ) => & field_name. replacen ( "record" , "struct" , 1 ) ,
@@ -103,25 +105,27 @@ fn node_src_to_schema_class(
103105 node : & AstNodeSrc ,
104106 super_types : & BTreeMap < String , BTreeSet < String > > ,
105107) -> SchemaClass {
108+ let name = class_name ( & node. name ) ;
109+ let fields = get_fields ( node)
110+ . iter ( )
111+ . map ( |f| {
112+ let ( ty, child) = match & f. ty {
113+ FieldType :: String => ( "optional[string]" . to_string ( ) , false ) ,
114+ FieldType :: Predicate => ( "predicate" . to_string ( ) , false ) ,
115+ FieldType :: Optional ( ty) => ( format ! ( "optional[\" {}\" ]" , class_name( ty) ) , true ) ,
116+ FieldType :: List ( ty) => ( format ! ( "list[\" {}\" ]" , class_name( ty) ) , true ) ,
117+ } ;
118+ SchemaField {
119+ name : property_name ( & name, & f. name ) ,
120+ ty,
121+ child,
122+ }
123+ } )
124+ . collect ( ) ;
106125 SchemaClass {
107- name : class_name ( & node. name ) ,
126+ name,
127+ fields,
108128 bases : get_bases ( & node. name , super_types) ,
109- fields : get_fields ( node)
110- . iter ( )
111- . map ( |f| {
112- let ( ty, child) = match & f. ty {
113- FieldType :: String => ( "optional[string]" . to_string ( ) , false ) ,
114- FieldType :: Predicate => ( "predicate" . to_string ( ) , false ) ,
115- FieldType :: Optional ( ty) => ( format ! ( "optional[\" {}\" ]" , class_name( ty) ) , true ) ,
116- FieldType :: List ( ty) => ( format ! ( "list[\" {}\" ]" , class_name( ty) ) , true ) ,
117- } ;
118- SchemaField {
119- name : property_name ( & node. name , & f. name ) ,
120- ty,
121- child,
122- }
123- } )
124- . collect ( ) ,
125129 }
126130}
127131
@@ -428,6 +432,7 @@ fn get_fields(node: &AstNodeSrc) -> Vec<FieldInfo> {
428432struct EnumVariantInfo {
429433 name : String ,
430434 snake_case_name : String ,
435+ variant_ast_name : String ,
431436}
432437
433438#[ derive( Serialize ) ]
@@ -476,16 +481,21 @@ fn enum_to_extractor_info(node: &AstEnumSrc) -> Option<ExtractorEnumInfo> {
476481 variants : node
477482 . variants
478483 . iter ( )
479- . map ( |v| EnumVariantInfo {
480- name : v. clone ( ) ,
481- snake_case_name : to_lower_snake_case ( v) ,
484+ . map ( |v| {
485+ let name = class_name ( v) ;
486+ let snake_case_name = to_lower_snake_case ( v) ;
487+ EnumVariantInfo {
488+ name,
489+ snake_case_name,
490+ variant_ast_name : v. clone ( ) ,
491+ }
482492 } )
483493 . collect ( ) ,
484494 } )
485495}
486496
487- fn field_info_to_extractor_info ( node : & AstNodeSrc , field : & FieldInfo ) -> ExtractorNodeFieldInfo {
488- let name = property_name ( & node . name , & field. name ) ;
497+ fn field_info_to_extractor_info ( name : & str , field : & FieldInfo ) -> ExtractorNodeFieldInfo {
498+ let name = property_name ( name, & field. name ) ;
489499 match & field. ty {
490500 FieldType :: String => ExtractorNodeFieldInfo {
491501 name,
@@ -517,14 +527,16 @@ fn field_info_to_extractor_info(node: &AstNodeSrc, field: &FieldInfo) -> Extract
517527fn node_to_extractor_info ( node : & AstNodeSrc ) -> ExtractorNodeInfo {
518528 let fields = get_fields ( node) ;
519529 let has_attrs = fields. iter ( ) . any ( |f| f. name == "attrs" ) ;
530+ let name = class_name ( & node. name ) ;
531+ let fields = fields
532+ . iter ( )
533+ . map ( |f| field_info_to_extractor_info ( & name, f) )
534+ . collect ( ) ;
520535 ExtractorNodeInfo {
521- name : class_name ( & node . name ) ,
536+ name,
522537 snake_case_name : to_lower_snake_case ( & node. name ) ,
523538 ast_name : node. name . clone ( ) ,
524- fields : fields
525- . iter ( )
526- . map ( |f| field_info_to_extractor_info ( node, f) )
527- . collect ( ) ,
539+ fields,
528540 has_attrs,
529541 }
530542}
0 commit comments