From 8b3805d0038f531a51d0b211a9a843365b813ee3 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Thu, 26 Sep 2019 19:04:59 +0200
Subject: [PATCH] Continue preparation of function evaluation

Function table is now populated and FunctionDescriptor is no more an inner class
of FunctionTable.

BTW fixed few warnings
---
 src/language/ASTSymbolTableBuilder.cpp |  4 ++++
 src/language/FunctionTable.hpp         | 27 ++++++++++++++------------
 src/language/SymbolTable.hpp           | 10 +++++++++-
 3 files changed, 28 insertions(+), 13 deletions(-)

diff --git a/src/language/ASTSymbolTableBuilder.cpp b/src/language/ASTSymbolTableBuilder.cpp
index e078f079f..aaab7c141 100644
--- a/src/language/ASTSymbolTableBuilder.cpp
+++ b/src/language/ASTSymbolTableBuilder.cpp
@@ -29,6 +29,10 @@ ASTSymbolTableBuilder::buildSymbolTable(ASTNode& n, std::shared_ptr<SymbolTable>
     for (auto& child : n.children) {
       this->buildSymbolTable(*child, local_symbol_table);
     }
+
+    size_t function_id             = symbol_table->functionTable()->add(FunctionDescriptor{});
+    i_symbol->attributes().value() = function_id;
+
   } else {
     n.m_symbol_table = symbol_table;
     if (n.has_content()) {
diff --git a/src/language/FunctionTable.hpp b/src/language/FunctionTable.hpp
index 0471969b4..a5dae9c85 100644
--- a/src/language/FunctionTable.hpp
+++ b/src/language/FunctionTable.hpp
@@ -12,22 +12,25 @@
 
 #include <iostream>
 
-class FunctionTable
+class FunctionDescriptor
 {
-  class FunctionDescriptor
-  {
-    std::unique_ptr<ASTNode> m_domain_mapping_node;
-    std::unique_ptr<ASTNode> m_expression_node;
+  std::unique_ptr<ASTNode> m_domain_mapping_node;
+  std::unique_ptr<ASTNode> m_expression_node;
 
-   public:
-    FunctionDescriptor& operator=(const FunctionDescriptor&) = default;
-    FunctionDescriptor& operator=(FunctionDescriptor&&) = default;
+ public:
+  FunctionDescriptor& operator=(FunctionDescriptor&&) = default;
 
-    FunctionDescriptor(FunctionDescriptor&&) = default;
-    FunctionDescriptor()                     = default;
-    ~FunctionDescriptor()                    = default;
-  };
+  FunctionDescriptor(std::unique_ptr<ASTNode>&& domain_mapping_node, std::unique_ptr<ASTNode>&& expression_node)
+    : m_domain_mapping_node(std::move(domain_mapping_node)), m_expression_node(std::move(expression_node))
+  {}
 
+  FunctionDescriptor(FunctionDescriptor&&) = default;
+  FunctionDescriptor()                     = default;
+  ~FunctionDescriptor()                    = default;
+};
+
+class FunctionTable
+{
  private:
   std::vector<FunctionDescriptor> m_function_descriptor_list;
 
diff --git a/src/language/SymbolTable.hpp b/src/language/SymbolTable.hpp
index 193dac31f..af700706f 100644
--- a/src/language/SymbolTable.hpp
+++ b/src/language/SymbolTable.hpp
@@ -70,6 +70,9 @@ class SymbolTable
     friend std::ostream&
     operator<<(std::ostream& os, const Attributes& attributes)
     {
+      if (attributes.m_data_type == ASTNodeDataType::function_t) {
+        os << "function_id:";
+      }
       std::visit(
         [&](const auto& value) {
           using T = std::decay_t<decltype(value)>;
@@ -124,7 +127,6 @@ class SymbolTable
 
     Symbol(const Symbol&) = default;
     Symbol(Symbol&&)      = default;
-    Symbol()              = default;
     ~Symbol()             = default;
   };
 
@@ -134,6 +136,12 @@ class SymbolTable
   std::shared_ptr<FunctionTable> m_function_table;
 
  public:
+  auto
+  functionTable() const
+  {
+    return m_function_table;
+  }
+
   friend std::ostream&
   operator<<(std::ostream& os, const SymbolTable& symbol_table)
   {
-- 
GitLab