From 49baed3d32a287bdba73522609063af71136f8f9 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Tue, 3 Mar 2020 18:56:25 +0100
Subject: [PATCH] Add argument-less builtin-functions management

---
 ...STNodeBuiltinFunctionExpressionBuilder.cpp |  8 +---
 src/language/BuiltinFunctionEmbedder.hpp      | 43 +++++++++++++++++++
 src/language/PEGGrammar.hpp                   |  2 +-
 3 files changed, 46 insertions(+), 7 deletions(-)

diff --git a/src/language/ASTNodeBuiltinFunctionExpressionBuilder.cpp b/src/language/ASTNodeBuiltinFunctionExpressionBuilder.cpp
index 4bb46ce18..532644d68 100644
--- a/src/language/ASTNodeBuiltinFunctionExpressionBuilder.cpp
+++ b/src/language/ASTNodeBuiltinFunctionExpressionBuilder.cpp
@@ -147,12 +147,8 @@ ASTNodeBuiltinFunctionExpressionBuilder::_buildArgumentProcessors(
     throw parse_error(error_message.str(), argument_nodes.begin());
   }
 
-  if (arguments_number > 1) {
-    for (size_t i = 0; i < arguments_number; ++i) {
-      this->_storeArgumentProcessor(parameter_type_list, flattened_datatype_list, i, _processor);
-    }
-  } else {
-    this->_storeArgumentProcessor(parameter_type_list, flattened_datatype_list, 0, _processor);
+  for (size_t i = 0; i < arguments_number; ++i) {
+    this->_storeArgumentProcessor(parameter_type_list, flattened_datatype_list, i, _processor);
   }
 }
 
diff --git a/src/language/BuiltinFunctionEmbedder.hpp b/src/language/BuiltinFunctionEmbedder.hpp
index c0de88489..643bfc7e0 100644
--- a/src/language/BuiltinFunctionEmbedder.hpp
+++ b/src/language/BuiltinFunctionEmbedder.hpp
@@ -167,4 +167,47 @@ class BuiltinFunctionEmbedder : public IBuiltinFunctionEmbedder
   }
 };
 
+template <typename FX>
+class BuiltinFunctionEmbedder<FX, void> : public IBuiltinFunctionEmbedder
+{
+ private:
+  std::function<FX(void)> m_f;
+
+ public:
+  PUGS_INLINE ASTNodeDataType
+  getReturnDataType() const final
+  {
+    return ast_node_data_type_from<FX>;
+  }
+
+  PUGS_INLINE std::vector<ASTNodeDataType>
+  getParameterDataTypes() const final
+  {
+    return {};
+  }
+
+  PUGS_INLINE size_t
+  numberOfParameters() const final
+  {
+    return 0;
+  }
+
+ public:
+  PUGS_INLINE
+  DataVariant
+  apply(const std::vector<DataVariant>&) const final
+  {
+    if constexpr (std::is_arithmetic_v<FX>) {
+      return {m_f()};
+    } else if constexpr (std::is_same_v<FX, void>) {
+      m_f();
+      return {};
+    } else {
+      return EmbeddedData(_createHandler(m_f()));
+    }
+  }
+
+  BuiltinFunctionEmbedder(std::function<void(void)> f) : m_f(f) {}
+};
+
 #endif   //  BUILTIN_FUNCTION_EMBEDDER_HPP
diff --git a/src/language/PEGGrammar.hpp b/src/language/PEGGrammar.hpp
index 12f3bcd49..b68a1dd76 100644
--- a/src/language/PEGGrammar.hpp
+++ b/src/language/PEGGrammar.hpp
@@ -149,7 +149,7 @@ struct expression;
 struct parented_expression : if_must< open_parent, expression, close_parent >{};
 
 struct tuple_expression;
-struct function_argument_list : if_must< open_parent, list_must< sor< tuple_expression, expression >, COMMA >, close_parent >{};
+struct function_argument_list : if_must< open_parent, opt< list_must< sor< tuple_expression, expression >, COMMA > >, close_parent >{};
 struct function_evaluation : seq< NAME, function_argument_list > {};
 
 struct primary_expression : sor< BOOL, REAL, INTEGER, LITERAL, function_evaluation, NAME, parented_expression > {};
-- 
GitLab