From bae8267f18daa21336096c77536d08e8b9c3a84a Mon Sep 17 00:00:00 2001 From: KtorZ Date: Wed, 28 Dec 2022 17:51:00 +0100 Subject: [PATCH] Fix formatter for unary operation Was wrongly converting any unary operation into '!' --- crates/aiken-lang/src/format.rs | 11 +++++++---- crates/aiken-lang/src/tests/format.rs | 19 ++++++++++++++++++- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/crates/aiken-lang/src/format.rs b/crates/aiken-lang/src/format.rs index e6b73f90..0145ff9e 100644 --- a/crates/aiken-lang/src/format.rs +++ b/crates/aiken-lang/src/format.rs @@ -7,7 +7,7 @@ use crate::{ ast::{ Annotation, Arg, ArgName, AssignmentKind, BinOp, CallArg, ClauseGuard, Constant, DataType, Definition, Function, IfBranch, ModuleConstant, Pattern, RecordConstructor, - RecordConstructorArg, RecordUpdateSpread, Span, TypeAlias, TypedArg, TypedConstant, + RecordConstructorArg, RecordUpdateSpread, Span, TypeAlias, TypedArg, TypedConstant, UnOp, UnqualifiedImport, UntypedArg, UntypedClause, UntypedClauseGuard, UntypedDefinition, UntypedModule, UntypedPattern, UntypedRecordUpdateArg, Use, CAPTURE_VARIABLE, }, @@ -695,7 +695,7 @@ impl<'comments> Formatter<'comments> { UntypedExpr::Var { name, .. } => name.to_doc(), - UntypedExpr::UnOp { value, .. } => self.negate(value), + UntypedExpr::UnOp { value, op, .. } => self.un_op(value, op), UntypedExpr::Fn { is_capture: true, @@ -1603,8 +1603,11 @@ impl<'comments> Formatter<'comments> { } } - fn negate<'a>(&mut self, value: &'a UntypedExpr) -> Document<'a> { - docvec!["!", self.wrap_expr(value)] + fn un_op<'a>(&mut self, value: &'a UntypedExpr, op: &'a UnOp) -> Document<'a> { + match op { + UnOp::Not => docvec!["!", self.wrap_expr(value)], + UnOp::Negate => docvec!["-", self.wrap_expr(value)], + } } } diff --git a/crates/aiken-lang/src/tests/format.rs b/crates/aiken-lang/src/tests/format.rs index 822c64c0..1dce2d41 100644 --- a/crates/aiken-lang/src/tests/format.rs +++ b/crates/aiken-lang/src/tests/format.rs @@ -14,7 +14,7 @@ fn assert_fmt(src: &str, expected: &str) { let (module2, extra2) = parser::module(&out, ModuleKind::Lib).unwrap(); let mut out2 = String::new(); format::pretty(&mut out2, module2, extra2, &out); - assert_eq!(out, out2); + assert!(out == out2, "formatting isn't idempotent"); } #[test] @@ -197,3 +197,20 @@ fn test_format_imports() { assert_fmt(src, expected) } + +#[test] +fn test_negate() { + let src = indoc! {r#" + fn foo() { + - 42 + } + "#}; + + let expected = indoc! {r#" + fn foo() { + -42 + } + "#}; + + assert_fmt(src, expected) +}