@@ -209,10 +209,10 @@ struct Visitor<'a> {
209209 diagnostics_writer : & ' a mut diagnostics:: LogWriter ,
210210 /// A trap::Writer to accumulate trap entries
211211 trap_writer : & ' a mut trap:: Writer ,
212- /// A counter for top-level child nodes
213- toplevel_child_counter : usize ,
214- /// Language-specific name of the AST info table
215- ast_node_info_table_name : String ,
212+ /// Language-specific name of the AST location table
213+ ast_node_location_table_name : String ,
214+ /// Language-specific name of the AST parent table
215+ ast_node_parent_table_name : String ,
216216 /// Language-specific name of the tokeninfo table
217217 tokeninfo_table_name : String ,
218218 /// A lookup table from type name to node types
@@ -242,8 +242,8 @@ impl<'a> Visitor<'a> {
242242 source,
243243 diagnostics_writer,
244244 trap_writer,
245- toplevel_child_counter : 0 ,
246- ast_node_info_table_name : format ! ( "{}_ast_node_info " , language_prefix) ,
245+ ast_node_location_table_name : format ! ( "{}_ast_node_location" , language_prefix ) ,
246+ ast_node_parent_table_name : format ! ( "{}_ast_node_parent " , language_prefix) ,
247247 tokeninfo_table_name : format ! ( "{}_tokeninfo" , language_prefix) ,
248248 schema,
249249 stack : Vec :: new ( ) ,
@@ -342,27 +342,29 @@ impl<'a> Visitor<'a> {
342342 } )
343343 . unwrap ( ) ;
344344 let mut valid = true ;
345- let ( parent_id , parent_index ) = match self . stack . last_mut ( ) {
345+ let parent_info = match self . stack . last_mut ( ) {
346346 Some ( p) if !node. is_extra ( ) => {
347347 p. 1 += 1 ;
348- ( p. 0 , p. 1 - 1 )
349- }
350- _ => {
351- self . toplevel_child_counter += 1 ;
352- ( self . file_label , self . toplevel_child_counter - 1 )
348+ Some ( ( p. 0 , p. 1 - 1 ) )
353349 }
350+ _ => None ,
354351 } ;
355352 match & table. kind {
356353 EntryKind :: Token { kind_id, .. } => {
357354 self . trap_writer . add_tuple (
358- & self . ast_node_info_table_name ,
359- vec ! [
360- trap:: Arg :: Label ( id) ,
361- trap:: Arg :: Label ( parent_id) ,
362- trap:: Arg :: Int ( parent_index) ,
363- trap:: Arg :: Label ( loc_label) ,
364- ] ,
355+ & self . ast_node_location_table_name ,
356+ vec ! [ trap:: Arg :: Label ( id) , trap:: Arg :: Label ( loc_label) ] ,
365357 ) ;
358+ if let Some ( ( parent_id, parent_index) ) = parent_info {
359+ self . trap_writer . add_tuple (
360+ & self . ast_node_parent_table_name ,
361+ vec ! [
362+ trap:: Arg :: Label ( id) ,
363+ trap:: Arg :: Label ( parent_id) ,
364+ trap:: Arg :: Int ( parent_index) ,
365+ ] ,
366+ ) ;
367+ } ;
366368 self . trap_writer . add_tuple (
367369 & self . tokeninfo_table_name ,
368370 vec ! [
@@ -378,14 +380,19 @@ impl<'a> Visitor<'a> {
378380 } => {
379381 if let Some ( args) = self . complex_node ( & node, fields, & child_nodes, id) {
380382 self . trap_writer . add_tuple (
381- & self . ast_node_info_table_name ,
382- vec ! [
383- trap:: Arg :: Label ( id) ,
384- trap:: Arg :: Label ( parent_id) ,
385- trap:: Arg :: Int ( parent_index) ,
386- trap:: Arg :: Label ( loc_label) ,
387- ] ,
383+ & self . ast_node_location_table_name ,
384+ vec ! [ trap:: Arg :: Label ( id) , trap:: Arg :: Label ( loc_label) ] ,
388385 ) ;
386+ if let Some ( ( parent_id, parent_index) ) = parent_info {
387+ self . trap_writer . add_tuple (
388+ & self . ast_node_parent_table_name ,
389+ vec ! [
390+ trap:: Arg :: Label ( id) ,
391+ trap:: Arg :: Label ( parent_id) ,
392+ trap:: Arg :: Int ( parent_index) ,
393+ ] ,
394+ ) ;
395+ } ;
389396 let mut all_args = vec ! [ trap:: Arg :: Label ( id) ] ;
390397 all_args. extend ( args) ;
391398 self . trap_writer . add_tuple ( table_name, all_args) ;
0 commit comments