From dd48fc5b366397039291256d66f7dfcc569a15b1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Fri, 17 Sep 2021 11:20:01 +0200
Subject: [PATCH] Fix issue #25 (simplification of unary expressions)

Also add a few related tests
---
 src/language/ast/ASTBuilder.cpp               |  2 +-
 tests/test_ASTBuilder.cpp                     | 21 ++++++++++++++++---
 ...t_BinaryExpressionProcessor_arithmetic.cpp |  6 +++---
 3 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/src/language/ast/ASTBuilder.cpp b/src/language/ast/ASTBuilder.cpp
index a4dc8c822..109ce527c 100644
--- a/src/language/ast/ASTBuilder.cpp
+++ b/src/language/ast/ASTBuilder.cpp
@@ -74,7 +74,7 @@ struct ASTBuilder::simplify_unary : TAO_PEGTL_NAMESPACE::parse_tree::apply<ASTBu
           transform(n, st...);
         }
       }
-    } else if (n->children.size() == 2) {
+    } else if ((n->children.size() == 2) and (n->is_type<language::unary_expression>())) {
       if (n->children[0]->is_type<language::unary_plus>()) {
         n = std::move(n->children[1]);
         transform(n, st...);
diff --git a/tests/test_ASTBuilder.cpp b/tests/test_ASTBuilder.cpp
index 3ce2855ef..fdcf13315 100644
--- a/tests/test_ASTBuilder.cpp
+++ b/tests/test_ASTBuilder.cpp
@@ -159,15 +159,30 @@ let s:string; s = "foo";
       SECTION("parented expression")
       {
         std::string_view data = R"(
-(2+3)*6;
+(-2)*6;
+(-2+3)*6;
+(-2+3+5)*6;
 )";
 
         std::string_view result = R"(
 (root)
+ +-(language::multiply_op)
+ |   +-(language::unary_minus)
+ |   |   `-(language::integer:2)
+ |   `-(language::integer:6)
+ +-(language::multiply_op)
+ |   +-(language::plus_op)
+ |   |   +-(language::unary_minus)
+ |   |   |   `-(language::integer:2)
+ |   |   `-(language::integer:3)
+ |   `-(language::integer:6)
  `-(language::multiply_op)
      +-(language::plus_op)
-     |   +-(language::integer:2)
-     |   `-(language::integer:3)
+     |   +-(language::plus_op)
+     |   |   +-(language::unary_minus)
+     |   |   |   `-(language::integer:2)
+     |   |   `-(language::integer:3)
+     |   `-(language::integer:5)
      `-(language::integer:6)
 )";
         CHECK_AST(data, result);
diff --git a/tests/test_BinaryExpressionProcessor_arithmetic.cpp b/tests/test_BinaryExpressionProcessor_arithmetic.cpp
index 6ded2c991..10699f3c0 100644
--- a/tests/test_BinaryExpressionProcessor_arithmetic.cpp
+++ b/tests/test_BinaryExpressionProcessor_arithmetic.cpp
@@ -184,7 +184,7 @@ TEST_CASE("BinaryExpressionProcessor arithmetic", "[language]")
     {
       CHECK_BINARY_EXPRESSION_RESULT(R"(let z:Z, z = -1 + true;)", "z", 0l);
       CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let z:Z, z = -3 + n;)", "z", 1l);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let z:Z, z = -3 + n;)", "z", -1l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let z:Z, z = (-3 + n);)", "z", -1l);
       CHECK_BINARY_EXPRESSION_RESULT(R"(let z:Z, z = 1 + 2;)", "z", 3l);
       CHECK_BINARY_EXPRESSION_RESULT(R"(let x:R, x = 3 + 2.5;)", "x", 5.5);
     }
@@ -192,7 +192,7 @@ TEST_CASE("BinaryExpressionProcessor arithmetic", "[language]")
     SECTION("lhs is R")
     {
       CHECK_BINARY_EXPRESSION_RESULT(R"(let r:R, r = -1.2 + true;)", "r", (-1.2 + true));
-      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let r:R, r = -1.2 + n;)", "r", (-1.2 + uint64_t{2}));
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 2; let r:R, r = (-1.2 + n);)", "r", (-1.2 + uint64_t{2}));
       CHECK_BINARY_EXPRESSION_RESULT(R"(let r:R, r = -1.2 + 1;)", "r", (-1.2 + 1));
       CHECK_BINARY_EXPRESSION_RESULT(R"(let r:R, r = -1.2 + 2.3;)", "r", (-1.2 + 2.3));
     }
@@ -219,7 +219,7 @@ TEST_CASE("BinaryExpressionProcessor arithmetic", "[language]")
     SECTION("lhs is Z")
     {
       CHECK_BINARY_EXPRESSION_RESULT(R"(let z:Z, z = -1 - true;)", "z", -2l);
-      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let z:Z, z = 3 - n;)", "z", -1l);
+      CHECK_BINARY_EXPRESSION_RESULT(R"(let n:N, n = 4; let z:Z, z = (-3 - n + 6);)", "z", -1l);
       CHECK_BINARY_EXPRESSION_RESULT(R"(let z:Z, z = 7 - 2;)", "z", 5l);
       CHECK_BINARY_EXPRESSION_RESULT(R"(let x:R, x = 4 - 2.5;)", "x", 1.5);
     }
-- 
GitLab