@@ -496,15 +496,29 @@ def visitModule(self, mod, depth):
496
496
self .emit ("pub trait Fold<U> {" , depth )
497
497
self .emit ("type TargetU;" , depth + 1 )
498
498
self .emit ("type Error;" , depth + 1 )
499
+ self .emit ("type UserContext;" , depth + 1 )
499
500
self .emit (
500
501
"""
501
- fn map_user (&mut self, user: U) -> Result< Self::TargetU, Self::Error> ;
502
+ fn will_map_user (&mut self, user: & U) -> Self::UserContext ;
502
503
#[cfg(feature = "all-nodes-with-ranges")]
503
- fn map_user_cfg(&mut self, user: U) -> Result<Self::TargetU, Self::Error> {
504
+ fn will_map_user_cfg(&mut self, user: &U) -> Self::UserContext {
505
+ self.will_map_user(user)
506
+ }
507
+ #[cfg(not(feature = "all-nodes-with-ranges"))]
508
+ fn will_map_user_cfg(&mut self, user: &crate::EmptyRange<U>) -> crate::EmptyRange<Self::TargetU> {
509
+ crate::EmptyRange::default()
510
+ }
511
+ fn map_user(&mut self, user: U, context: Self::UserContext) -> Result<Self::TargetU, Self::Error>;
512
+ #[cfg(feature = "all-nodes-with-ranges")]
513
+ fn map_user_cfg(&mut self, user: U, context: Self::UserContext) -> Result<Self::TargetU, Self::Error> {
504
514
self.map_user(user)
505
515
}
506
516
#[cfg(not(feature = "all-nodes-with-ranges"))]
507
- fn map_user_cfg(&mut self, _user: crate::EmptyRange<U>) -> Result<crate::EmptyRange<Self::TargetU>, Self::Error> {
517
+ fn map_user_cfg(
518
+ &mut self,
519
+ _user: crate::EmptyRange<U>,
520
+ _context: crate::EmptyRange<Self::TargetU>,
521
+ ) -> Result<crate::EmptyRange<Self::TargetU>, Self::Error> {
508
522
Ok(crate::EmptyRange::default())
509
523
}
510
524
""" ,
@@ -578,10 +592,17 @@ def visitSum(self, sum, name, depth):
578
592
579
593
map_user_suffix = "" if type_info .has_attributes else "_cfg"
580
594
self .emit (
581
- f"let range = folder.map_user{ map_user_suffix } (range)?;" , depth + 3
595
+ f"let context = folder.will_map_user{ map_user_suffix } (&range);" ,
596
+ depth + 3 ,
582
597
)
583
-
584
- self .gen_construction (
598
+ self .fold_fields (
599
+ fields_pattern [0 ], cons .fields , fields_pattern [2 ], depth + 3
600
+ )
601
+ self .emit (
602
+ f"let range = folder.map_user{ map_user_suffix } (range, context)?;" ,
603
+ depth + 3 ,
604
+ )
605
+ self .composite_fields (
585
606
fields_pattern [0 ], cons .fields , fields_pattern [2 ], depth + 3
586
607
)
587
608
self .emit ("}" , depth + 2 )
@@ -614,9 +635,15 @@ def visitProduct(self, product, name, depth):
614
635
self .emit (f"let { struct_name } {{ { fields_pattern [1 ]} }} = node;" , depth + 1 )
615
636
616
637
map_user_suffix = "" if has_attributes else "_cfg"
617
- self .emit (f"let range = folder.map_user{ map_user_suffix } (range)?;" , depth + 3 )
618
638
619
- self .gen_construction (struct_name , product .fields , "" , depth + 1 )
639
+ self .emit (
640
+ f"let context = folder.will_map_user{ map_user_suffix } (&range);" , depth + 3
641
+ )
642
+ self .fold_fields (struct_name , product .fields , "" , depth + 1 )
643
+ self .emit (
644
+ f"let range = folder.map_user{ map_user_suffix } (range, context)?;" , depth + 3
645
+ )
646
+ self .composite_fields (struct_name , product .fields , "" , depth + 1 )
620
647
621
648
self .emit ("}" , depth )
622
649
@@ -631,13 +658,17 @@ def make_pattern(self, rust_name, fieldname: str, fields):
631
658
632
659
return header , body , footer
633
660
634
- def gen_construction (self , header , fields , footer , depth ):
661
+ def fold_fields (self , header , fields , footer , depth ):
662
+ for field in fields :
663
+ name = rust_field (field .name )
664
+ self .emit (f"let { name } = Foldable::fold({ name } , folder)?;" , depth + 1 )
665
+
666
+ def composite_fields (self , header , fields , footer , depth ):
635
667
self .emit (f"Ok({ header } {{" , depth )
636
668
for field in fields :
637
669
name = rust_field (field .name )
638
- self .emit (f"{ name } : Foldable::fold( { name } , folder)? ," , depth + 1 )
670
+ self .emit (f"{ name } ," , depth + 1 )
639
671
self .emit ("range," , depth + 1 )
640
-
641
672
self .emit (f"}}{ footer } )" , depth )
642
673
643
674
0 commit comments