1212import asdl
1313
1414TABSIZE = 4
15- AUTOGEN_MESSAGE = "// File automatically generated by {}.\n "
15+ AUTOGEN_MESSAGE = "// File automatically generated by {}.\n \n "
1616
1717builtin_type_mapping = {
1818 "identifier" : "Ident" ,
@@ -535,13 +535,9 @@ def gen_construction(self, header, fields, footer, depth):
535535class FoldModuleVisitor (EmitVisitor ):
536536 def visitModule (self , mod ):
537537 depth = 0
538- self .emit ('#[cfg(feature = "fold")]' , depth )
539- self .emit ("pub mod fold {" , depth )
540- self .emit ("use super::*;" , depth + 1 )
541- self .emit ("use crate::fold_helpers::Foldable;" , depth + 1 )
542- FoldTraitDefVisitor (self .file , self .typeinfo ).visit (mod , depth + 1 )
543- FoldImplVisitor (self .file , self .typeinfo ).visit (mod , depth + 1 )
544- self .emit ("}" , depth )
538+ self .emit ("use crate::fold_helpers::Foldable;" , depth )
539+ FoldTraitDefVisitor (self .file , self .typeinfo ).visit (mod , depth )
540+ FoldImplVisitor (self .file , self .typeinfo ).visit (mod , depth )
545541
546542
547543class VisitorTraitDefVisitor (StructVisitor ):
@@ -577,7 +573,9 @@ def emit_visitor(self, nodename, depth, has_node=True):
577573 else :
578574 node_type = "()"
579575 node_value = "()"
580- self .emit (f"fn visit_{ typeinfo .sum_name } (&mut self, node: { node_type } ) {{" , depth )
576+ self .emit (
577+ f"fn visit_{ typeinfo .sum_name } (&mut self, node: { node_type } ) {{" , depth
578+ )
581579 self .emit (f"self.generic_visit_{ typeinfo .sum_name } ({ node_value } )" , depth + 1 )
582580 self .emit ("}" , depth )
583581
@@ -587,7 +585,10 @@ def emit_generic_visitor_signature(self, nodename, depth, has_node=True):
587585 node_type = typeinfo .rust_sum_name
588586 else :
589587 node_type = "()"
590- self .emit (f"fn generic_visit_{ typeinfo .sum_name } (&mut self, node: { node_type } ) {{" , depth )
588+ self .emit (
589+ f"fn generic_visit_{ typeinfo .sum_name } (&mut self, node: { node_type } ) {{" ,
590+ depth ,
591+ )
591592
592593 def emit_empty_generic_visitor (self , nodename , depth ):
593594 self .emit_generic_visitor_signature (nodename , depth )
@@ -665,13 +666,8 @@ def visitProduct(self, product, name, depth):
665666class VisitorModuleVisitor (EmitVisitor ):
666667 def visitModule (self , mod ):
667668 depth = 0
668- self .emit ('#[cfg(feature = "visitor")]' , depth )
669669 self .emit ("#[allow(unused_variables, non_snake_case)]" , depth )
670- self .emit ("pub mod visitor {" , depth )
671- self .emit ("use super::*;" , depth + 1 )
672- VisitorTraitDefVisitor (self .file , self .typeinfo ).visit (mod , depth + 1 )
673- self .emit ("}" , depth )
674- self .emit ("" , depth )
670+ VisitorTraitDefVisitor (self .file , self .typeinfo ).visit (mod , depth )
675671
676672
677673class ClassDefVisitor (EmitVisitor ):
@@ -930,27 +926,19 @@ def visit(self, object):
930926 v .emit ("" , 0 )
931927
932928
933- def write_generic_def (mod , typeinfo , f ):
934- f .write (
935- textwrap .dedent (
936- """
937- pub use crate::{Attributed, constant::*};
929+ def write_ast_def (mod , typeinfo , f ):
930+ StructVisitor (f , typeinfo ).visit (mod )
938931
939- type Ident = String;
940- \n
941- """
942- )
943- )
944932
945- c = ChainOfVisitors (
946- StructVisitor (f , typeinfo ),
947- FoldModuleVisitor ( f , typeinfo ),
948- VisitorModuleVisitor ( f , typeinfo ),
949- )
950- c .visit (mod )
933+ def write_fold_def ( mod , typeinfo , f ):
934+ FoldModuleVisitor (f , typeinfo ). visit ( mod )
935+
936+
937+ def write_visitor_def ( mod , typeinfo , f ):
938+ VisitorModuleVisitor ( f , typeinfo ) .visit (mod )
951939
952940
953- def write_located_def (typeinfo , f ):
941+ def write_located_def (mod , typeinfo , f ):
954942 f .write (
955943 textwrap .dedent (
956944 """
@@ -1000,8 +988,7 @@ def write_ast_mod(mod, typeinfo, f):
1000988
1001989def main (
1002990 input_filename ,
1003- generic_filename ,
1004- located_filename ,
991+ ast_dir ,
1005992 module_filename ,
1006993 dump_module = False ,
1007994):
@@ -1016,34 +1003,34 @@ def main(
10161003 typeinfo = {}
10171004 FindUserdataTypesVisitor (typeinfo ).visit (mod )
10181005
1019- with generic_filename .open ("w" ) as generic_file , located_filename .open (
1020- "w"
1021- ) as located_file :
1022- generic_file .write (auto_gen_msg )
1023- write_generic_def (mod , typeinfo , generic_file )
1024- located_file .write (auto_gen_msg )
1025- write_located_def (typeinfo , located_file )
1006+ for filename , write in [
1007+ ("generic" , write_ast_def ),
1008+ ("fold" , write_fold_def ),
1009+ ("located" , write_located_def ),
1010+ ("visitor" , write_visitor_def ),
1011+ ]:
1012+ with (ast_dir / f"{ filename } .rs" ).open ("w" ) as f :
1013+ f .write (auto_gen_msg )
1014+ write (mod , typeinfo , f )
10261015
10271016 with module_filename .open ("w" ) as module_file :
10281017 module_file .write (auto_gen_msg )
10291018 write_ast_mod (mod , typeinfo , module_file )
10301019
1031- print (f"{ generic_filename } , { located_filename } , { module_filename } regenerated." )
1020+ print (f"{ ast_dir } , { module_filename } regenerated." )
10321021
10331022
10341023if __name__ == "__main__" :
10351024 parser = ArgumentParser ()
10361025 parser .add_argument ("input_file" , type = Path )
1037- parser .add_argument ("-G" , "--generic-file" , type = Path , required = True )
1038- parser .add_argument ("-L" , "--located-file" , type = Path , required = True )
1026+ parser .add_argument ("-A" , "--ast-dir" , type = Path , required = True )
10391027 parser .add_argument ("-M" , "--module-file" , type = Path , required = True )
10401028 parser .add_argument ("-d" , "--dump-module" , action = "store_true" )
10411029
10421030 args = parser .parse_args ()
10431031 main (
10441032 args .input_file ,
1045- args .generic_file ,
1046- args .located_file ,
1033+ args .ast_dir ,
10471034 args .module_file ,
10481035 args .dump_module ,
10491036 )
0 commit comments