From 7c548f07f4865ba64f31f900a5059c7c3a7bfc0d Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Fri, 22 Nov 2019 19:07:32 +0100
Subject: [PATCH] Begin affectation to variable list from function

---
 ...STNodeListAffectationExpressionBuilder.cpp | 38 +++++++++++++------
 ...STNodeListAffectationExpressionBuilder.hpp |  6 +++
 2 files changed, 33 insertions(+), 11 deletions(-)

diff --git a/src/language/ASTNodeListAffectationExpressionBuilder.cpp b/src/language/ASTNodeListAffectationExpressionBuilder.cpp
index da3473367..7db25c42b 100644
--- a/src/language/ASTNodeListAffectationExpressionBuilder.cpp
+++ b/src/language/ASTNodeListAffectationExpressionBuilder.cpp
@@ -5,7 +5,7 @@
 
 template <typename OperatorT>
 void
-ASTNodeListAffectationExpressionBuilder::_buildListAffectationProcessor(ASTNode& node)
+ASTNodeListAffectationExpressionBuilder::_buildListAffectationProcessorFromExpressionList(ASTNode& node)
 {
   using ListAffectationProcessorT = ListAffectationProcessor<OperatorT>;
 
@@ -122,21 +122,37 @@ ASTNodeListAffectationExpressionBuilder::_buildListAffectationProcessor(ASTNode&
   node.m_node_processor = std::move(list_affectation_processor);
 }
 
-ASTNodeListAffectationExpressionBuilder::ASTNodeListAffectationExpressionBuilder(ASTNode& n)
+template <typename OperatorT>
+void
+ASTNodeListAffectationExpressionBuilder::_buildListAffectationProcessor(ASTNode& node)
+{
+  Assert(node.children[1]->is_type<language::expression_list>() or
+         node.children[1]->is_type<language::function_evaluation>());
+
+  if (node.children[1]->is_type<language::expression_list>()) {
+    this->_buildListAffectationProcessorFromExpressionList<OperatorT>(node);
+  } else {
+    throw parse_error("list expression affectation from function is NIY", std::vector{node.begin()});
+    //    this->_buildListAffectationProcessorFromFunction<OperatorT>(node);
+  }
+}
+
+ASTNodeListAffectationExpressionBuilder::ASTNodeListAffectationExpressionBuilder(ASTNode& node)
 {
-  if (n.children[1]->is_type<language::expression_list>()) {
-    if (n.is_type<language::eq_op>()) {
-      this->_buildListAffectationProcessor<language::eq_op>(n);
-    } else if (n.is_type<language::pluseq_op>()) {
-      this->_buildListAffectationProcessor<language::pluseq_op>(n);
-    } else if (n.is_type<language::minuseq_op>()) {
-      this->_buildListAffectationProcessor<language::minuseq_op>(n);
+  if (node.children[1]->is_type<language::expression_list>() or
+      node.children[1]->is_type<language::function_evaluation>()) {
+    if (node.is_type<language::eq_op>()) {
+      this->_buildListAffectationProcessor<language::eq_op>(node);
+    } else if (node.is_type<language::pluseq_op>()) {
+      this->_buildListAffectationProcessor<language::pluseq_op>(node);
+    } else if (node.is_type<language::minuseq_op>()) {
+      this->_buildListAffectationProcessor<language::minuseq_op>(node);
 
     } else {
-      throw parse_error("undefined affectation operator for tuples", std::vector{n.begin()});
+      throw parse_error("undefined affectation operator for tuples", std::vector{node.begin()});
     }
   } else {
     throw parse_error("unexpected error: invalid right hand side in tuple affectation",
-                      std::vector{n.children[1]->begin()});
+                      std::vector{node.children[1]->begin()});
   }
 }
diff --git a/src/language/ASTNodeListAffectationExpressionBuilder.hpp b/src/language/ASTNodeListAffectationExpressionBuilder.hpp
index d195b141c..5546a841b 100644
--- a/src/language/ASTNodeListAffectationExpressionBuilder.hpp
+++ b/src/language/ASTNodeListAffectationExpressionBuilder.hpp
@@ -6,6 +6,12 @@
 class ASTNodeListAffectationExpressionBuilder
 {
  private:
+  template <typename OperatorT>
+  void _buildListAffectationProcessorFromExpressionList(ASTNode& node);
+
+  template <typename OperatorT>
+  void _buildListAffectationProcessorFromFunction(ASTNode& node);
+
   template <typename OperatorT>
   void _buildListAffectationProcessor(ASTNode& node);
 
-- 
GitLab