@@ -11,9 +11,11 @@ use std::{
1111 fs,
1212} ;
1313
14+ use either:: Either ;
1415use itertools:: Itertools ;
1516use proc_macro2:: { Punct , Spacing } ;
1617use quote:: { format_ident, quote} ;
18+ use ra_ap_stdx:: panic_context;
1719use ungrammar:: { Grammar , Rule } ;
1820
1921use crate :: {
@@ -495,6 +497,7 @@ fn generate_syntax_kinds(grammar: KindsSrc) -> String {
495497 . map ( |name| format_ident ! ( "{}" , name) )
496498 . collect :: < Vec < _ > > ( ) ;
497499
500+ // FIXME: This generates enum kinds?
498501 let nodes = grammar
499502 . nodes
500503 . iter ( )
@@ -757,6 +760,7 @@ pub(crate) fn lower(grammar: &Grammar) -> AstSrc {
757760 for & node in & nodes {
758761 let name = grammar[ node] . name . clone ( ) ;
759762 let rule = & grammar[ node] . rule ;
763+ let _g = panic_context:: enter ( name. clone ( ) ) ;
760764 match lower_enum ( grammar, rule) {
761765 Some ( variants) => {
762766 let enum_src = AstEnumSrc {
@@ -904,11 +908,16 @@ fn lower_separated_list(
904908 Rule :: Seq ( it) => it,
905909 _ => return false ,
906910 } ;
907- let ( node, repeat, trailing_sep) = match rule. as_slice ( ) {
911+
912+ let ( nt, repeat, trailing_sep) = match rule. as_slice ( ) {
908913 [ Rule :: Node ( node) , Rule :: Rep ( repeat) , Rule :: Opt ( trailing_sep) ] => {
909- ( node, repeat, Some ( trailing_sep) )
914+ ( Either :: Left ( node) , repeat, Some ( trailing_sep) )
915+ }
916+ [ Rule :: Node ( node) , Rule :: Rep ( repeat) ] => ( Either :: Left ( node) , repeat, None ) ,
917+ [ Rule :: Token ( token) , Rule :: Rep ( repeat) , Rule :: Opt ( trailing_sep) ] => {
918+ ( Either :: Right ( token) , repeat, Some ( trailing_sep) )
910919 }
911- [ Rule :: Node ( node ) , Rule :: Rep ( repeat) ] => ( node , repeat, None ) ,
920+ [ Rule :: Token ( token ) , Rule :: Rep ( repeat) ] => ( Either :: Right ( token ) , repeat, None ) ,
912921 _ => return false ,
913922 } ;
914923 let repeat = match & * * repeat {
@@ -917,21 +926,34 @@ fn lower_separated_list(
917926 } ;
918927 if !matches ! (
919928 repeat. as_slice( ) ,
920- [ comma, Rule :: Node ( n) ]
921- if trailing_sep. map_or( true , |it| comma == & * * it) && n == node
929+ [ comma, nt_]
930+ if trailing_sep. map_or( true , |it| comma == & * * it) && match ( nt, nt_) {
931+ ( Either :: Left ( node) , Rule :: Node ( nt_) ) => node == nt_,
932+ ( Either :: Right ( token) , Rule :: Token ( nt_) ) => token == nt_,
933+ _ => false ,
934+ }
922935 ) {
923936 return false ;
924937 }
925- let ty = grammar[ * node] . name . clone ( ) ;
926- let name = label
927- . cloned ( )
928- . unwrap_or_else ( || pluralize ( & to_lower_snake_case ( & ty) ) ) ;
929- let field = Field :: Node {
930- name,
931- ty,
932- cardinality : Cardinality :: Many ,
933- } ;
934- acc. push ( field) ;
938+ match nt {
939+ Either :: Right ( token) => {
940+ let name = clean_token_name ( & grammar[ * token] . name ) ;
941+ let field = Field :: Token ( name) ;
942+ acc. push ( field) ;
943+ }
944+ Either :: Left ( node) => {
945+ let ty = grammar[ * node] . name . clone ( ) ;
946+ let name = label
947+ . cloned ( )
948+ . unwrap_or_else ( || pluralize ( & to_lower_snake_case ( & ty) ) ) ;
949+ let field = Field :: Node {
950+ name,
951+ ty,
952+ cardinality : Cardinality :: Many ,
953+ } ;
954+ acc. push ( field) ;
955+ }
956+ }
935957 true
936958}
937959
0 commit comments