From f2bb8697d6531b7ce1d9ad7846e9b6362012bf92 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Mon, 21 Oct 2019 12:31:31 +0200
Subject: [PATCH] Add simplification of language::expression_list

If a `language::expression_list` contains only one `language::expression`, it is
replaced by the `language::expression` itself during AST simplification.
---
 src/language/ASTBuilder.cpp | 18 +++++++++++++++++-
 src/language/ASTBuilder.hpp |  1 +
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/src/language/ASTBuilder.cpp b/src/language/ASTBuilder.cpp
index 0583dcffd..8cbd519d1 100644
--- a/src/language/ASTBuilder.cpp
+++ b/src/language/ASTBuilder.cpp
@@ -139,6 +139,22 @@ struct ASTBuilder::simplify_name_list : parse_tree::apply<ASTBuilder::simplify_n
   }
 };
 
+struct ASTBuilder::simplify_expression_list : parse_tree::apply<ASTBuilder::simplify_expression_list>
+{
+  template <typename... States>
+  static void
+  transform(std::unique_ptr<ASTNode>& n, States&&... st)
+  {
+    if (n->is_type<language::expression_list>()) {
+      if (n->children.size() == 1) {
+        n->remove_content();
+        n = std::move(n->children.back());
+        transform(n, st...);
+      }
+    }
+  }
+};
+
 struct ASTBuilder::simplify_statement_block : parse_tree::apply<ASTBuilder::simplify_statement_block>
 {
   template <typename... States>
@@ -238,7 +254,6 @@ using selector = parse_tree::selector<
                                 real,
                                 literal,
                                 name,
-                                expression_list,
                                 B_set,
                                 N_set,
                                 Z_set,
@@ -286,6 +301,7 @@ using selector = parse_tree::selector<
   ASTBuilder::simplify_for_statement_block::on<for_statement_block>,
   parse_tree::discard_empty::on<ignored, semicol, block>,
   ASTBuilder::simplify_name_list::on<name_list>,
+  ASTBuilder::simplify_expression_list::on<expression_list>,
   ASTBuilder::simplify_statement_block::on<statement_block>,
   ASTBuilder::simplify_for_init::on<for_init>,
   ASTBuilder::simplify_for_test::on<for_test>,
diff --git a/src/language/ASTBuilder.hpp b/src/language/ASTBuilder.hpp
index 703f46bc1..bae52ea95 100644
--- a/src/language/ASTBuilder.hpp
+++ b/src/language/ASTBuilder.hpp
@@ -10,6 +10,7 @@ struct ASTBuilder
   struct rearrange;
   struct simplify_unary;
   struct simplify_name_list;
+  struct simplify_expression_list;
   struct simplify_statement_block;
   struct simplify_for_statement_block;
   struct simplify_for_init;
-- 
GitLab