@@ -13,7 +13,7 @@ use quote::{format_ident, quote};
1313use ungrammar:: { Grammar , Rule } ;
1414
1515use crate :: {
16- ast_src:: { AstEnumSrc , AstNodeSrc , AstSrc , Field , KindsSrc , Valence , KINDS_SRC } ,
16+ ast_src:: { AstEnumSrc , AstNodeSrc , AstSrc , Cardinality , Field , KindsSrc , KINDS_SRC } ,
1717 codegen:: { self , update, Mode } ,
1818 project_root, Result ,
1919} ;
@@ -431,7 +431,7 @@ fn pluralize(s: &str) -> String {
431431
432432impl Field {
433433 fn is_many ( & self ) -> bool {
434- matches ! ( self , Field :: Node { valence : Valence :: Many , .. } )
434+ matches ! ( self , Field :: Node { cardinality : Cardinality :: Many , .. } )
435435 }
436436 fn token_kind ( & self ) -> Option < proc_macro2:: TokenStream > {
437437 match self {
@@ -509,7 +509,7 @@ fn lower(grammar: &Grammar) -> AstSrc {
509509 }
510510 None => {
511511 let mut fields = Vec :: new ( ) ;
512- lower_rule ( & mut fields, grammar, rule) ;
512+ lower_rule ( & mut fields, grammar, None , rule) ;
513513 res. nodes . push ( AstNodeSrc { doc : Vec :: new ( ) , name, traits : Vec :: new ( ) , fields } ) ;
514514 }
515515 }
@@ -537,19 +537,20 @@ fn lower_enum(grammar: &Grammar, rule: &Rule) -> Option<Vec<String>> {
537537 Some ( variants)
538538}
539539
540- fn lower_rule ( acc : & mut Vec < Field > , grammar : & Grammar , rule : & Rule ) {
541- if lower_comma_list ( acc, grammar, rule) {
540+ fn lower_rule ( acc : & mut Vec < Field > , grammar : & Grammar , label : Option < & String > , rule : & Rule ) {
541+ if lower_comma_list ( acc, grammar, label , rule) {
542542 return ;
543543 }
544544
545545 match rule {
546546 Rule :: Node ( node) => {
547547 let ty = grammar[ * node] . name . clone ( ) ;
548- let name = to_lower_snake_case ( & ty) ;
549- let field = Field :: Node { name, ty, valence : Valence :: Optional } ;
548+ let name = label . cloned ( ) . unwrap_or_else ( || to_lower_snake_case ( & ty) ) ;
549+ let field = Field :: Node { name, ty, cardinality : Cardinality :: Optional } ;
550550 acc. push ( field) ;
551551 }
552552 Rule :: Token ( token) => {
553+ assert ! ( label. is_none( ) ) ;
553554 let mut name = grammar[ * token] . name . clone ( ) ;
554555 if name != "int_number" && name != "string" {
555556 if "[]{}()" . contains ( & name) {
@@ -562,44 +563,33 @@ fn lower_rule(acc: &mut Vec<Field>, grammar: &Grammar, rule: &Rule) {
562563 Rule :: Rep ( inner) => {
563564 if let Rule :: Node ( node) = & * * inner {
564565 let ty = grammar[ * node] . name . clone ( ) ;
565- let name = pluralize ( & to_lower_snake_case ( & ty) ) ;
566- let field = Field :: Node { name, ty, valence : Valence :: Many } ;
566+ let name = label . cloned ( ) . unwrap_or_else ( || pluralize ( & to_lower_snake_case ( & ty) ) ) ;
567+ let field = Field :: Node { name, ty, cardinality : Cardinality :: Many } ;
567568 acc. push ( field) ;
568569 return ;
569570 }
570571 todo ! ( "{:?}" , rule)
571572 }
572- Rule :: Labeled { label, rule } => {
573- let node = match & * * rule {
574- Rule :: Rep ( inner) | Rule :: Opt ( inner) => match & * * inner {
575- Rule :: Node ( node) => node,
576- _ => todo ! ( "{:?}" , rule) ,
577- } ,
578- Rule :: Node ( node) => node,
579- _ => todo ! ( "{:?}" , rule) ,
580- } ;
581- let ty = grammar[ * node] . name . clone ( ) ;
582- let field = Field :: Node {
583- name : label. clone ( ) ,
584- ty,
585- valence : match & * * rule {
586- Rule :: Rep ( _) => Valence :: Many ,
587- _ => Valence :: Optional ,
588- } ,
589- } ;
590- acc. push ( field) ;
573+ Rule :: Labeled { label : l, rule } => {
574+ assert ! ( label. is_none( ) ) ;
575+ lower_rule ( acc, grammar, Some ( l) , rule) ;
591576 }
592577 Rule :: Seq ( rules) | Rule :: Alt ( rules) => {
593578 for rule in rules {
594- lower_rule ( acc, grammar, rule)
579+ lower_rule ( acc, grammar, label , rule)
595580 }
596581 }
597- Rule :: Opt ( rule) => lower_rule ( acc, grammar, rule) ,
582+ Rule :: Opt ( rule) => lower_rule ( acc, grammar, label , rule) ,
598583 }
599584}
600585
601586// (T (',' T)* ','?)
602- fn lower_comma_list ( acc : & mut Vec < Field > , grammar : & Grammar , rule : & Rule ) -> bool {
587+ fn lower_comma_list (
588+ acc : & mut Vec < Field > ,
589+ grammar : & Grammar ,
590+ label : Option < & String > ,
591+ rule : & Rule ,
592+ ) -> bool {
603593 let rule = match rule {
604594 Rule :: Seq ( it) => it,
605595 _ => return false ,
@@ -619,8 +609,8 @@ fn lower_comma_list(acc: &mut Vec<Field>, grammar: &Grammar, rule: &Rule) -> boo
619609 _ => return false ,
620610 }
621611 let ty = grammar[ * node] . name . clone ( ) ;
622- let name = pluralize ( & to_lower_snake_case ( & ty) ) ;
623- let field = Field :: Node { name, ty, valence : Valence :: Many } ;
612+ let name = label . cloned ( ) . unwrap_or_else ( || pluralize ( & to_lower_snake_case ( & ty) ) ) ;
613+ let field = Field :: Node { name, ty, cardinality : Cardinality :: Many } ;
624614 acc. push ( field) ;
625615 true
626616}
@@ -656,7 +646,7 @@ fn extract_enums(ast: &mut AstSrc) {
656646 node. remove_field ( to_remove) ;
657647 let ty = enm. name . clone ( ) ;
658648 let name = to_lower_snake_case ( & ty) ;
659- node. fields . push ( Field :: Node { name, ty, valence : Valence :: Optional } ) ;
649+ node. fields . push ( Field :: Node { name, ty, cardinality : Cardinality :: Optional } ) ;
660650 }
661651 }
662652 }
0 commit comments