Skip to content

Commit cddf30d

Browse files
committed
Split user_map steps
1 parent 9f834b4 commit cddf30d

File tree

3 files changed

+572
-351
lines changed

3 files changed

+572
-351
lines changed

ast/asdl_rs.py

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -496,15 +496,29 @@ def visitModule(self, mod, depth):
496496
self.emit("pub trait Fold<U> {", depth)
497497
self.emit("type TargetU;", depth + 1)
498498
self.emit("type Error;", depth + 1)
499+
self.emit("type UserContext;", depth + 1)
499500
self.emit(
500501
"""
501-
fn map_user(&mut self, user: U) -> Result<Self::TargetU, Self::Error>;
502+
fn will_map_user(&mut self, user: &U) -> Self::UserContext;
502503
#[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> {
504514
self.map_user(user)
505515
}
506516
#[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> {
508522
Ok(crate::EmptyRange::default())
509523
}
510524
""",
@@ -578,10 +592,17 @@ def visitSum(self, sum, name, depth):
578592

579593
map_user_suffix = "" if type_info.has_attributes else "_cfg"
580594
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,
582597
)
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(
585606
fields_pattern[0], cons.fields, fields_pattern[2], depth + 3
586607
)
587608
self.emit("}", depth + 2)
@@ -614,9 +635,15 @@ def visitProduct(self, product, name, depth):
614635
self.emit(f"let {struct_name} {{ {fields_pattern[1]} }} = node;", depth + 1)
615636

616637
map_user_suffix = "" if has_attributes else "_cfg"
617-
self.emit(f"let range = folder.map_user{map_user_suffix}(range)?;", depth + 3)
618638

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)
620647

621648
self.emit("}", depth)
622649

@@ -631,13 +658,17 @@ def make_pattern(self, rust_name, fieldname: str, fields):
631658

632659
return header, body, footer
633660

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):
635667
self.emit(f"Ok({header} {{", depth)
636668
for field in fields:
637669
name = rust_field(field.name)
638-
self.emit(f"{name}: Foldable::fold({name}, folder)?,", depth + 1)
670+
self.emit(f"{name},", depth + 1)
639671
self.emit("range,", depth + 1)
640-
641672
self.emit(f"}}{footer})", depth)
642673

643674

0 commit comments

Comments
 (0)