conlang: Split assignment into plain Assign and assign-with-Modify
This commit is contained in:
@@ -234,14 +234,19 @@ pub trait Fold {
|
||||
or_fold_expr_kind(self, kind)
|
||||
}
|
||||
fn fold_assign(&mut self, a: Assign) -> Assign {
|
||||
let Assign { kind, parts } = a;
|
||||
let Assign { parts } = a;
|
||||
let (head, tail) = *parts;
|
||||
Assign {
|
||||
kind: self.fold_assign_kind(kind),
|
||||
Assign { parts: Box::new((self.fold_expr_kind(head), self.fold_expr_kind(tail))) }
|
||||
}
|
||||
fn fold_modify(&mut self, m: Modify) -> Modify {
|
||||
let Modify { kind, parts } = m;
|
||||
let (head, tail) = *parts;
|
||||
Modify {
|
||||
kind: self.fold_modify_kind(kind),
|
||||
parts: Box::new((self.fold_expr_kind(head), self.fold_expr_kind(tail))),
|
||||
}
|
||||
}
|
||||
fn fold_assign_kind(&mut self, kind: AssignKind) -> AssignKind {
|
||||
fn fold_modify_kind(&mut self, kind: ModifyKind) -> ModifyKind {
|
||||
kind
|
||||
}
|
||||
fn fold_binary(&mut self, b: Binary) -> Binary {
|
||||
@@ -522,6 +527,7 @@ pub fn or_fold_expr_kind<F: Fold + ?Sized>(folder: &mut F, kind: ExprKind) -> Ex
|
||||
match kind {
|
||||
ExprKind::Empty => ExprKind::Empty,
|
||||
ExprKind::Assign(a) => ExprKind::Assign(folder.fold_assign(a)),
|
||||
ExprKind::Modify(m) => ExprKind::Modify(folder.fold_modify(m)),
|
||||
ExprKind::Binary(b) => ExprKind::Binary(folder.fold_binary(b)),
|
||||
ExprKind::Unary(u) => ExprKind::Unary(folder.fold_unary(u)),
|
||||
ExprKind::Member(m) => ExprKind::Member(folder.fold_member(m)),
|
||||
|
||||
@@ -202,13 +202,19 @@ pub trait Visit<'a>: Sized {
|
||||
or_visit_expr_kind(self, e)
|
||||
}
|
||||
fn visit_assign(&mut self, a: &'a Assign) {
|
||||
let Assign { kind, parts } = a;
|
||||
let Assign { parts } = a;
|
||||
let (head, tail) = parts.as_ref();
|
||||
self.visit_assign_kind(kind);
|
||||
self.visit_expr_kind(head);
|
||||
self.visit_expr_kind(tail);
|
||||
}
|
||||
fn visit_assign_kind(&mut self, _kind: &'a AssignKind) {}
|
||||
fn visit_modify(&mut self, m: &'a Modify) {
|
||||
let Modify { kind, parts } = m;
|
||||
let (head, tail) = parts.as_ref();
|
||||
self.visit_modify_kind(kind);
|
||||
self.visit_expr_kind(head);
|
||||
self.visit_expr_kind(tail);
|
||||
}
|
||||
fn visit_modify_kind(&mut self, _kind: &'a ModifyKind) {}
|
||||
fn visit_binary(&mut self, b: &'a Binary) {
|
||||
let Binary { kind, parts } = b;
|
||||
let (head, tail) = parts.as_ref();
|
||||
@@ -437,6 +443,7 @@ pub fn or_visit_expr_kind<'a, V: Visit<'a>>(visitor: &mut V, e: &'a ExprKind) {
|
||||
match e {
|
||||
ExprKind::Empty => {}
|
||||
ExprKind::Assign(a) => visitor.visit_assign(a),
|
||||
ExprKind::Modify(m) => visitor.visit_modify(m),
|
||||
ExprKind::Binary(b) => visitor.visit_binary(b),
|
||||
ExprKind::Unary(u) => visitor.visit_unary(u),
|
||||
ExprKind::Member(m) => visitor.visit_member(m),
|
||||
|
||||
Reference in New Issue
Block a user