Skip to content

Commit a460c17

Browse files
oppiliappandarichey
authored andcommitted
handle operator associavity
port of @oberblastmeister's changes from nix-community#35
1 parent b0775b2 commit a460c17

File tree

1 file changed

+30
-11
lines changed

1 file changed

+30
-11
lines changed

src/parser.rs

+30-11
Original file line numberDiff line numberDiff line change
@@ -666,7 +666,7 @@ where
666666
self.parse_fn()
667667
}
668668
}
669-
fn handle_operation(
669+
fn handle_operation_left(
670670
&mut self,
671671
once: bool,
672672
next: fn(&mut Self) -> Checkpoint,
@@ -684,17 +684,36 @@ where
684684
}
685685
checkpoint
686686
}
687+
fn handle_operation_right(
688+
&mut self,
689+
once: bool,
690+
next: fn(&mut Self) -> Checkpoint,
691+
ops: &[SyntaxKind],
692+
) -> Checkpoint {
693+
let checkpoint = next(self);
694+
if self.peek().map(|t| ops.contains(&t)).unwrap_or(false) {
695+
self.start_node_at(checkpoint, NODE_BIN_OP);
696+
self.bump();
697+
if once {
698+
next(self);
699+
} else {
700+
self.handle_operation_right(once, next, ops);
701+
}
702+
self.finish_node();
703+
}
704+
checkpoint
705+
}
687706
fn parse_isset(&mut self) -> Checkpoint {
688-
self.handle_operation(false, Self::parse_negate, &[TOKEN_QUESTION])
707+
self.handle_operation_left(false, Self::parse_negate, &[TOKEN_QUESTION])
689708
}
690709
fn parse_concat(&mut self) -> Checkpoint {
691-
self.handle_operation(false, Self::parse_isset, &[TOKEN_CONCAT])
710+
self.handle_operation_right(false, Self::parse_isset, &[TOKEN_CONCAT])
692711
}
693712
fn parse_mul(&mut self) -> Checkpoint {
694-
self.handle_operation(false, Self::parse_concat, &[TOKEN_MUL, TOKEN_DIV])
713+
self.handle_operation_left(false, Self::parse_concat, &[TOKEN_MUL, TOKEN_DIV])
695714
}
696715
fn parse_add(&mut self) -> Checkpoint {
697-
self.handle_operation(false, Self::parse_mul, &[TOKEN_ADD, TOKEN_SUB])
716+
self.handle_operation_left(false, Self::parse_mul, &[TOKEN_ADD, TOKEN_SUB])
698717
}
699718
fn parse_invert(&mut self) -> Checkpoint {
700719
if self.peek() == Some(TOKEN_INVERT) {
@@ -709,26 +728,26 @@ where
709728
}
710729
}
711730
fn parse_merge(&mut self) -> Checkpoint {
712-
self.handle_operation(false, Self::parse_invert, &[TOKEN_UPDATE])
731+
self.handle_operation_right(false, Self::parse_invert, &[TOKEN_UPDATE])
713732
}
714733
fn parse_compare(&mut self) -> Checkpoint {
715-
self.handle_operation(
734+
self.handle_operation_left(
716735
true,
717736
Self::parse_merge,
718737
&[TOKEN_LESS, TOKEN_LESS_OR_EQ, TOKEN_MORE, TOKEN_MORE_OR_EQ],
719738
)
720739
}
721740
fn parse_equal(&mut self) -> Checkpoint {
722-
self.handle_operation(true, Self::parse_compare, &[TOKEN_EQUAL, TOKEN_NOT_EQUAL])
741+
self.handle_operation_left(true, Self::parse_compare, &[TOKEN_EQUAL, TOKEN_NOT_EQUAL])
723742
}
724743
fn parse_and(&mut self) -> Checkpoint {
725-
self.handle_operation(false, Self::parse_equal, &[TOKEN_AND])
744+
self.handle_operation_left(false, Self::parse_equal, &[TOKEN_AND])
726745
}
727746
fn parse_or(&mut self) -> Checkpoint {
728-
self.handle_operation(false, Self::parse_and, &[TOKEN_OR])
747+
self.handle_operation_left(false, Self::parse_and, &[TOKEN_OR])
729748
}
730749
fn parse_implication(&mut self) -> Checkpoint {
731-
self.handle_operation(false, Self::parse_or, &[TOKEN_IMPLICATION])
750+
self.handle_operation_right(false, Self::parse_or, &[TOKEN_IMPLICATION])
732751
}
733752
#[inline(always)]
734753
fn parse_math(&mut self) -> Checkpoint {

0 commit comments

Comments
 (0)