@@ -81,6 +81,8 @@ pub struct YaccGrammar<StorageT = u32> {
8181 implicit_rule : Option < RIdx < StorageT > > ,
8282 /// User defined Rust programs which can be called within actions
8383 actions : Box < [ Option < String > ] > ,
84+ /// Spans for each action.
85+ action_spans : Box < [ Option < Span > ] > ,
8486 /// A `(name, type)` pair defining an extra parameter to pass to action functions.
8587 parse_param : Option < ( String , String ) > ,
8688 /// Generic parameters (types and lifetimes) to pass to action functions.
@@ -131,6 +133,7 @@ where
131133 prod_precs : Decode :: decode ( decoder) ?,
132134 implicit_rule : Decode :: decode ( decoder) ?,
133135 actions : Decode :: decode ( decoder) ?,
136+ action_spans : Decode :: decode ( decoder) ?,
134137 parse_param : Decode :: decode ( decoder) ?,
135138 parse_generics : Decode :: decode ( decoder) ?,
136139 programs : Decode :: decode ( decoder) ?,
@@ -170,6 +173,7 @@ where
170173 prod_precs : :: bincode:: BorrowDecode :: < ' _ , __Context > :: borrow_decode ( decoder) ?,
171174 implicit_rule : :: bincode:: BorrowDecode :: < ' _ , __Context > :: borrow_decode ( decoder) ?,
172175 actions : :: bincode:: BorrowDecode :: < ' _ , __Context > :: borrow_decode ( decoder) ?,
176+ action_spans : :: bincode:: BorrowDecode :: < ' _ , __Context > :: borrow_decode ( decoder) ?,
173177 parse_param : :: bincode:: BorrowDecode :: < ' _ , __Context > :: borrow_decode ( decoder) ?,
174178 parse_generics : :: bincode:: BorrowDecode :: < ' _ , __Context > :: borrow_decode ( decoder) ?,
175179 programs : :: bincode:: BorrowDecode :: < ' _ , __Context > :: borrow_decode ( decoder) ?,
@@ -328,6 +332,7 @@ where
328332 let mut prod_precs: Vec < Option < Option < Precedence > > > = vec ! [ None ; ast. prods. len( ) ] ;
329333 let mut prods_rules = vec ! [ None ; ast. prods. len( ) ] ;
330334 let mut actions = vec ! [ None ; ast. prods. len( ) ] ;
335+ let mut action_spans = vec ! [ None ; ast. prods. len( ) ] ;
331336 let mut actiontypes = vec ! [ None ; rule_names. len( ) ] ;
332337 let ( start_name, _) = ast. start . as_ref ( ) . unwrap ( ) ;
333338 for ( astrulename, _) in & rule_names {
@@ -419,8 +424,9 @@ where
419424 prods[ pidx] = Some ( prod) ;
420425 prod_precs[ pidx] = Some ( prec. map ( |( prec, _) | prec) ) ;
421426 prods_rules[ pidx] = Some ( ridx) ;
422- if let Some ( ref s ) = astprod. action {
427+ if let Some ( ( s , span ) ) = & astprod. action {
423428 actions[ pidx] = Some ( s. clone ( ) ) ;
429+ action_spans[ pidx] = Some ( * span) ;
424430 }
425431 }
426432 }
@@ -459,6 +465,7 @@ where
459465 prod_precs : prod_precs. into_iter ( ) . map ( Option :: unwrap) . collect ( ) ,
460466 implicit_rule : implicit_rule. map ( |x| rule_map[ & x] ) ,
461467 actions : actions. into_boxed_slice ( ) ,
468+ action_spans : action_spans. into_boxed_slice ( ) ,
462469 parse_param : ast. parse_param . clone ( ) ,
463470 parse_generics : ast. parse_generics . clone ( ) ,
464471 programs : ast. programs . clone ( ) ,
@@ -625,6 +632,10 @@ where
625632 & self . actions [ usize:: from ( pidx) ]
626633 }
627634
635+ pub fn action_span ( & self , pidx : PIdx < StorageT > ) -> Option < Span > {
636+ self . action_spans [ usize:: from ( pidx) ]
637+ }
638+
628639 pub fn actiontype ( & self , ridx : RIdx < StorageT > ) -> & Option < String > {
629640 & self . actiontypes [ usize:: from ( ridx) ]
630641 }
0 commit comments