diff --git a/crates/aiken-lang/src/format.rs b/crates/aiken-lang/src/format.rs index 22401e1d..3d7d18cb 100644 --- a/crates/aiken-lang/src/format.rs +++ b/crates/aiken-lang/src/format.rs @@ -1219,11 +1219,27 @@ impl<'comments> Formatter<'comments> { let left = self.expr(left, false); let right = self.expr(right, false); - self.operator_side(left, precedence, left_precedence) - .append(" ") - .append(name) - .append(" ") - .append(self.operator_side(right, precedence, right_precedence.saturating_sub(1))) + self.operator_side( + left, + precedence, + if matches!(name, BinOp::Or | BinOp::And) { + left_precedence.saturating_sub(1) + } else { + left_precedence + }, + ) + .append(" ") + .append(name) + .append(" ") + .append(self.operator_side( + right, + precedence, + if matches!(name, BinOp::Or | BinOp::And) { + right_precedence + } else { + right_precedence.saturating_sub(1) + }, + )) } pub fn operator_side<'a>(&mut self, doc: Document<'a>, op: u8, side: u8) -> Document<'a> { diff --git a/crates/aiken-lang/src/tests/format.rs b/crates/aiken-lang/src/tests/format.rs index 0baaf22b..d6290c25 100644 --- a/crates/aiken-lang/src/tests/format.rs +++ b/crates/aiken-lang/src/tests/format.rs @@ -755,3 +755,25 @@ fn fuzzer_annotations() { "# ); } + +#[test] +fn preserve_associativity_parens_in_binop() { + assert_format!( + r#" + pub fn bar() { + ( a || b ) || c + } + "# + ); +} + +#[test] +fn superfluous_parens_in_binop() { + assert_format!( + r#" + pub fn bar() { + a && ( b && c ) + } + "# + ); +} diff --git a/crates/aiken-lang/src/tests/snapshots/format_block_logical_expr.snap b/crates/aiken-lang/src/tests/snapshots/format_block_logical_expr.snap index 3c67519a..1729b72e 100644 --- a/crates/aiken-lang/src/tests/snapshots/format_block_logical_expr.snap +++ b/crates/aiken-lang/src/tests/snapshots/format_block_logical_expr.snap @@ -11,5 +11,5 @@ fn bar() { } fn baz() { - a || ( b && c || d ) + a || b && c || d } diff --git a/crates/aiken-lang/src/tests/snapshots/preserve_associativity_parens_in_binop.snap b/crates/aiken-lang/src/tests/snapshots/preserve_associativity_parens_in_binop.snap new file mode 100644 index 00000000..538a4d83 --- /dev/null +++ b/crates/aiken-lang/src/tests/snapshots/preserve_associativity_parens_in_binop.snap @@ -0,0 +1,7 @@ +--- +source: crates/aiken-lang/src/tests/format.rs +description: "Code:\n\npub fn bar() {\n ( a || b ) || c\n}\n" +--- +pub fn bar() { + ( a || b ) || c +} diff --git a/crates/aiken-lang/src/tests/snapshots/superfluous_parens_in_binop.snap b/crates/aiken-lang/src/tests/snapshots/superfluous_parens_in_binop.snap new file mode 100644 index 00000000..28f3013f --- /dev/null +++ b/crates/aiken-lang/src/tests/snapshots/superfluous_parens_in_binop.snap @@ -0,0 +1,7 @@ +--- +source: crates/aiken-lang/src/tests/format.rs +description: "Code:\n\npub fn bar() {\n a && ( b && c )\n}\n" +--- +pub fn bar() { + a && b && c +}