@@ -13,7 +13,7 @@ use quote::{format_ident, quote};
1313use ungrammar:: { Grammar , Rule } ;
1414
1515use crate :: {
16- ast_src:: { AstEnumSrc , AstNodeSrc , AstSrc , Field , FieldSrc , KindsSrc , KINDS_SRC } ,
16+ ast_src:: { AstEnumSrc , AstNodeSrc , AstSrc , Field , KindsSrc , Valence , 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 { src : FieldSrc :: Many ( _ ) , .. } )
434+ matches ! ( self , Field :: Node { valence : Valence :: Many , .. } )
435435 }
436436 fn token_kind ( & self ) -> Option < proc_macro2:: TokenStream > {
437437 match self {
@@ -476,19 +476,13 @@ impl Field {
476476 } ;
477477 format_ident ! ( "{}_token" , name)
478478 }
479- Field :: Node { name, src } => match src {
480- FieldSrc :: Shorthand => format_ident ! ( "{}" , to_lower_snake_case( name) ) ,
481- _ => format_ident ! ( "{}" , name) ,
482- } ,
479+ Field :: Node { name, .. } => format_ident ! ( "{}" , name) ,
483480 }
484481 }
485482 fn ty ( & self ) -> proc_macro2:: Ident {
486483 match self {
487484 Field :: Token ( _) => format_ident ! ( "SyntaxToken" ) ,
488- Field :: Node { name, src } => match src {
489- FieldSrc :: Optional ( ty) | FieldSrc :: Many ( ty) => format_ident ! ( "{}" , ty) ,
490- FieldSrc :: Shorthand => format_ident ! ( "{}" , name) ,
491- } ,
485+ Field :: Node { ty, .. } => format_ident ! ( "{}" , ty) ,
492486 }
493487 }
494488}
@@ -550,7 +544,9 @@ fn lower_rule(acc: &mut Vec<Field>, grammar: &Grammar, rule: &Rule) {
550544
551545 match rule {
552546 Rule :: Node ( node) => {
553- let field = Field :: Node { name : grammar[ * node] . name . clone ( ) , src : FieldSrc :: Shorthand } ;
547+ let ty = grammar[ * node] . name . clone ( ) ;
548+ let name = to_lower_snake_case ( & ty) ;
549+ let field = Field :: Node { name, ty, valence : Valence :: Optional } ;
554550 acc. push ( field) ;
555551 }
556552 Rule :: Token ( token) => {
@@ -565,9 +561,9 @@ fn lower_rule(acc: &mut Vec<Field>, grammar: &Grammar, rule: &Rule) {
565561 }
566562 Rule :: Rep ( inner) => {
567563 if let Rule :: Node ( node) = & * * inner {
568- let name = grammar[ * node] . name . clone ( ) ;
569- let label = pluralize ( & to_lower_snake_case ( & name ) ) ;
570- let field = Field :: Node { name : label . clone ( ) , src : FieldSrc :: Many ( name ) } ;
564+ 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 } ;
571567 acc. push ( field) ;
572568 return ;
573569 }
@@ -582,11 +578,13 @@ fn lower_rule(acc: &mut Vec<Field>, grammar: &Grammar, rule: &Rule) {
582578 Rule :: Node ( node) => node,
583579 _ => todo ! ( "{:?}" , rule) ,
584580 } ;
581+ let ty = grammar[ * node] . name . clone ( ) ;
585582 let field = Field :: Node {
586583 name : label. clone ( ) ,
587- src : match & * * rule {
588- Rule :: Rep ( _) => FieldSrc :: Many ( grammar[ * node] . name . clone ( ) ) ,
589- _ => FieldSrc :: Optional ( grammar[ * node] . name . clone ( ) ) ,
584+ ty,
585+ valence : match & * * rule {
586+ Rule :: Rep ( _) => Valence :: Many ,
587+ _ => Valence :: Optional ,
590588 } ,
591589 } ;
592590 acc. push ( field) ;
@@ -620,9 +618,9 @@ fn lower_comma_list(acc: &mut Vec<Field>, grammar: &Grammar, rule: &Rule) -> boo
620618 [ comma, Rule :: Node ( n) ] if comma == & * * trailing_comma && n == node => ( ) ,
621619 _ => return false ,
622620 }
623- let name = grammar[ * node] . name . clone ( ) ;
624- let label = pluralize ( & to_lower_snake_case ( & name ) ) ;
625- let field = Field :: Node { name : label . clone ( ) , src : FieldSrc :: Many ( name ) } ;
621+ 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 } ;
626624 acc. push ( field) ;
627625 true
628626}
@@ -656,7 +654,9 @@ fn extract_enums(ast: &mut AstSrc) {
656654 }
657655 if to_remove. len ( ) == enm. variants . len ( ) {
658656 node. remove_field ( to_remove) ;
659- node. fields . push ( Field :: Node { name : enm. name . clone ( ) , src : FieldSrc :: Shorthand } ) ;
657+ let ty = enm. name . clone ( ) ;
658+ let name = to_lower_snake_case ( & ty) ;
659+ node. fields . push ( Field :: Node { name, ty, valence : Valence :: Optional } ) ;
660660 }
661661 }
662662 }
0 commit comments