From 01ad3bfa729c22801a57ed656467f7b2ad9fc212 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Wed, 9 Oct 2019 18:11:40 +0200
Subject: [PATCH] Add module importer structure

- add ASTModulesImporter, which imports all required modules. Yet, just an empty
  shell that lists the required modules
- change ASTNodeDeclarationCleaner to ASTNodeTypeCleaner<T>
  this allows to clean various kind of AST nodes which become useless for
  execution. Now one calls
  ``
    ASTNodeTypeCleaner<language::declaration>{*root_node};
    ASTNodeTypeCleaner<language::let_declaration>{*root_node};
  ``
  instead of
  ``
    ASTNodeDeclarationCleaner{*root_node};
  ``
  Also one remove `import` instructions by
  ``
    ASTNodeTypeCleaner<language::import_instruction>{*root_node};
  ``
---
 src/language/ASTBuilder.cpp                   | 16 ++++++-
 src/language/ASTModulesImporter.cpp           | 34 ++++++++++++++
 src/language/ASTModulesImporter.hpp           | 19 ++++++++
 src/language/ASTNodeDataTypeBuilder.cpp       |  7 ++-
 src/language/ASTNodeDeclarationCleaner.cpp    | 36 ---------------
 src/language/ASTNodeDeclarationCleaner.hpp    | 15 ------
 src/language/ASTNodeTypeCleaner.hpp           | 46 +++++++++++++++++++
 src/language/ASTSymbolTableBuilder.cpp        |  6 +--
 src/language/CMakeLists.txt                   |  2 +-
 src/language/PugsParser.cpp                   | 12 ++++-
 tests/CMakeLists.txt                          |  2 +-
 ...st_ASTNodeAffectationExpressionBuilder.cpp | 16 +++----
 ...ASTNodeBinaryOperatorExpressionBuilder.cpp |  6 +--
 tests/test_ASTNodeExpressionBuilder.cpp       |  4 +-
 tests/test_ASTNodeIncDecExpressionBuilder.cpp |  4 +-
 tests/test_ASTNodeListProcessor.cpp           |  4 +-
 ...leaner.cpp => test_ASTNodeTypeCleaner.cpp} |  6 +--
 ..._ASTNodeUnaryOperatorExpressionBuilder.cpp |  4 +-
 tests/test_AffectationProcessor.cpp           |  6 +--
 tests/test_AffectationToStringProcessor.cpp   |  4 +-
 .../test_BinaryExpressionProcessor_utils.hpp  |  4 +-
 tests/test_ConcatExpressionProcessor.cpp      |  4 +-
 tests/test_DoWhileProcessor.cpp               |  4 +-
 tests/test_ForProcessor.cpp                   |  4 +-
 tests/test_IfProcessor.cpp                    |  4 +-
 tests/test_IncDecExpressionProcessor.cpp      |  4 +-
 tests/test_NameProcessor.cpp                  |  4 +-
 tests/test_OStreamProcessor.cpp               |  4 +-
 tests/test_UnaryExpressionProcessor.cpp       |  4 +-
 tests/test_WhileProcessor.cpp                 |  4 +-
 30 files changed, 179 insertions(+), 110 deletions(-)
 create mode 100644 src/language/ASTModulesImporter.cpp
 create mode 100644 src/language/ASTModulesImporter.hpp
 delete mode 100644 src/language/ASTNodeDeclarationCleaner.cpp
 delete mode 100644 src/language/ASTNodeDeclarationCleaner.hpp
 create mode 100644 src/language/ASTNodeTypeCleaner.hpp
 rename tests/{test_ASTNodeDeclarationCleaner.cpp => test_ASTNodeTypeCleaner.cpp} (94%)

diff --git a/src/language/ASTBuilder.cpp b/src/language/ASTBuilder.cpp
index 9ab4cd7a6..9e187baf3 100644
--- a/src/language/ASTBuilder.cpp
+++ b/src/language/ASTBuilder.cpp
@@ -7,6 +7,8 @@ using namespace TAO_PEGTL_NAMESPACE;
 
 #include <pegtl/contrib/parse_tree.hpp>
 
+#include <SymbolTable.hpp>
+
 using namespace language;
 
 struct ASTBuilder::rearrange : parse_tree::apply<ASTBuilder::rearrange>
@@ -203,7 +205,9 @@ struct ASTBuilder::simplify_stream_statement : parse_tree::apply<ASTBuilder::sim
 template <typename Rule>
 using selector =
   parse_tree::selector<Rule,
-                       parse_tree::store_content::on<true_kw,
+                       parse_tree::store_content::on<import_instruction,
+                                                     module_name,
+                                                     true_kw,
                                                      false_kw,
                                                      integer,
                                                      real,
@@ -266,7 +270,15 @@ template <typename InputT>
 std::unique_ptr<ASTNode>
 ASTBuilder::build(InputT& input)
 {
-  return parse_tree::parse<language::grammar, ASTNode, selector, nothing, language::errors>(input);
+  std::unique_ptr root_node = parse_tree::parse<language::grammar, ASTNode, selector, nothing, language::errors>(input);
+
+  // build initial symbol tables
+  std::shared_ptr function_table = std::make_shared<FunctionTable>();
+  std::shared_ptr symbol_table   = std::make_shared<SymbolTable>(function_table);
+
+  root_node->m_symbol_table = symbol_table;
+
+  return root_node;
 }
 
 template std::unique_ptr<ASTNode> ASTBuilder::build(read_input<>& input);
diff --git a/src/language/ASTModulesImporter.cpp b/src/language/ASTModulesImporter.cpp
new file mode 100644
index 000000000..0b4b07cd9
--- /dev/null
+++ b/src/language/ASTModulesImporter.cpp
@@ -0,0 +1,34 @@
+#include <ASTModulesImporter.hpp>
+
+#include <ASTSymbolTableBuilder.hpp>
+#include <SymbolTable.hpp>
+
+#include <PEGGrammar.hpp>
+
+void
+ASTModulesImporter::_importModule(ASTNode& import_node)
+{
+  Assert(import_node.is<language::import_instruction>());
+
+  std::cout << " * importing '" << rang::fgB::green << import_node.children[0]->string() << rang::style::reset
+            << "' module\n";
+}
+
+void
+ASTModulesImporter::_importAllModules(ASTNode& node)
+{
+  if (node.is<language::import_instruction>()) {
+    this->_importModule(node);
+  } else {
+    for (auto& child : node.children) {
+      this->_importAllModules(*child);
+    }
+  }
+}
+
+ASTModulesImporter::ASTModulesImporter(ASTNode& root_node)
+{
+  Assert(root_node.is_root());
+  this->_importAllModules(root_node);
+  std::cout << " - loaded modules\n";
+}
diff --git a/src/language/ASTModulesImporter.hpp b/src/language/ASTModulesImporter.hpp
new file mode 100644
index 000000000..1d9c49c73
--- /dev/null
+++ b/src/language/ASTModulesImporter.hpp
@@ -0,0 +1,19 @@
+#ifndef AST_MODULES_IMPORTER_HPP
+#define AST_MODULES_IMPORTER_HPP
+
+#include <ASTNode.hpp>
+
+class ASTModulesImporter
+{
+  void _importModule(ASTNode& import_node);
+  void _importAllModules(ASTNode& node);
+
+ public:
+  ASTModulesImporter(ASTNode& root_node);
+
+  ASTModulesImporter(const ASTModulesImporter&) = delete;
+
+  ~ASTModulesImporter() = default;
+};
+
+#endif   // AST_MODULES_IMPORTER_HPP
diff --git a/src/language/ASTNodeDataTypeBuilder.cpp b/src/language/ASTNodeDataTypeBuilder.cpp
index 035eb5c02..b90b5b005 100644
--- a/src/language/ASTNodeDataTypeBuilder.cpp
+++ b/src/language/ASTNodeDataTypeBuilder.cpp
@@ -14,7 +14,12 @@ ASTNodeDataTypeBuilder::_buildNodeDataTypes(ASTNode& n)
     n.m_data_type = ASTNodeDataType::void_t;
   } else {
     if (n.has_content()) {
-      if (n.is<language::true_kw>() or n.is<language::false_kw>()) {
+      if (n.is<language::import_instruction>()) {
+        n.m_data_type = ASTNodeDataType::void_t;
+      } else if (n.is<language::module_name>()) {
+        n.m_data_type = ASTNodeDataType::string_t;
+
+      } else if (n.is<language::true_kw>() or n.is<language::false_kw>()) {
         n.m_data_type = ASTNodeDataType::bool_t;
       } else if (n.is<language::real>()) {
         n.m_data_type = ASTNodeDataType::double_t;
diff --git a/src/language/ASTNodeDeclarationCleaner.cpp b/src/language/ASTNodeDeclarationCleaner.cpp
deleted file mode 100644
index 7e2f139f9..000000000
--- a/src/language/ASTNodeDeclarationCleaner.cpp
+++ /dev/null
@@ -1,36 +0,0 @@
-#include <ASTNodeDeclarationCleaner.hpp>
-
-#include <PEGGrammar.hpp>
-#include <PugsAssert.hpp>
-
-#include <stack>
-
-void
-ASTNodeDeclarationCleaner::_removeDeclarationNode(ASTNode& n)
-{
-  std::stack<size_t> declaration_ids;
-  for (size_t i_child = 0; i_child < n.children.size(); ++i_child) {
-    if (n.children[i_child]->is<language::declaration>() or n.children[i_child]->is<language::let_declaration>()) {
-      declaration_ids.push(i_child);
-    }
-  }
-
-  while (declaration_ids.size() > 0) {
-    size_t i_removed = declaration_ids.top();
-    declaration_ids.pop();
-    for (size_t i = i_removed; i + 1 < n.children.size(); ++i) {
-      n.children[i] = std::move(n.children[i + 1]);
-    }
-    n.children.pop_back();
-  }
-
-  for (auto& child : n.children) {
-    this->_removeDeclarationNode(*child);
-  }
-}
-
-ASTNodeDeclarationCleaner::ASTNodeDeclarationCleaner(ASTNode& n)
-{
-  Assert(n.is_root());
-  this->_removeDeclarationNode(n);
-}
diff --git a/src/language/ASTNodeDeclarationCleaner.hpp b/src/language/ASTNodeDeclarationCleaner.hpp
deleted file mode 100644
index 422f1e910..000000000
--- a/src/language/ASTNodeDeclarationCleaner.hpp
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef AST_NODE_DECLARATION_CLEANER_HPP
-#define AST_NODE_DECLARATION_CLEANER_HPP
-
-#include <ASTNode.hpp>
-
-class ASTNodeDeclarationCleaner
-{
- private:
-  void _removeDeclarationNode(ASTNode& node);
-
- public:
-  ASTNodeDeclarationCleaner(ASTNode& root_node);
-};
-
-#endif   // AST_NODE_DECLARATION_CLEANER_HPP
diff --git a/src/language/ASTNodeTypeCleaner.hpp b/src/language/ASTNodeTypeCleaner.hpp
new file mode 100644
index 000000000..8521baa2f
--- /dev/null
+++ b/src/language/ASTNodeTypeCleaner.hpp
@@ -0,0 +1,46 @@
+#ifndef AST_NODE_DECLARATION_CLEANER_HPP
+#define AST_NODE_DECLARATION_CLEANER_HPP
+
+#include <ASTNode.hpp>
+#include <PEGGrammar.hpp>
+#include <PugsAssert.hpp>
+
+#include <stack>
+
+template <typename NodeType>
+class ASTNodeTypeCleaner
+{
+ private:
+  void
+  _removeDeclarationNode(ASTNode& node)
+  {
+    std::stack<size_t> declaration_ids;
+    for (size_t i_child = 0; i_child < node.children.size(); ++i_child) {
+      if (node.children[i_child]->is<NodeType>()) {
+        declaration_ids.push(i_child);
+      }
+    }
+
+    while (declaration_ids.size() > 0) {
+      size_t i_removed = declaration_ids.top();
+      declaration_ids.pop();
+      for (size_t i = i_removed; i + 1 < node.children.size(); ++i) {
+        node.children[i] = std::move(node.children[i + 1]);
+      }
+      node.children.pop_back();
+    }
+
+    for (auto& child : node.children) {
+      this->_removeDeclarationNode(*child);
+    }
+  }
+
+ public:
+  ASTNodeTypeCleaner(ASTNode& root_node)
+  {
+    Assert(root_node.is_root());
+    this->_removeDeclarationNode(root_node);
+  }
+};
+
+#endif   // AST_NODE_DECLARATION_CLEANER_HPP
diff --git a/src/language/ASTSymbolTableBuilder.cpp b/src/language/ASTSymbolTableBuilder.cpp
index 9220c6622..67fb348c2 100644
--- a/src/language/ASTSymbolTableBuilder.cpp
+++ b/src/language/ASTSymbolTableBuilder.cpp
@@ -84,11 +84,7 @@ ASTSymbolTableBuilder::buildSymbolTable(ASTNode& n, std::shared_ptr<SymbolTable>
 ASTSymbolTableBuilder::ASTSymbolTableBuilder(ASTNode& node)
 {
   Assert(node.is_root());
-  std::shared_ptr function_table = std::make_shared<FunctionTable>();
-  std::shared_ptr symbol_table   = std::make_shared<SymbolTable>(function_table);
 
-  node.m_symbol_table = symbol_table;
-
-  this->buildSymbolTable(node, symbol_table);
+  this->buildSymbolTable(node, node.m_symbol_table);
   std::cout << " - checked symbols declaration\n";
 }
diff --git a/src/language/CMakeLists.txt b/src/language/CMakeLists.txt
index 1e6777998..5c6cc784b 100644
--- a/src/language/CMakeLists.txt
+++ b/src/language/CMakeLists.txt
@@ -9,13 +9,13 @@ add_library(
   PugsLanguage
   ASTBuilder.cpp
   ASTDotPrinter.cpp
+  ASTModulesImporter.cpp
   ASTNodeAffectationExpressionBuilder.cpp
   ASTNodeBinaryOperatorExpressionBuilder.cpp
   ASTNodeDataType.cpp
   ASTNodeDataTypeBuilder.cpp
   ASTNodeDataTypeChecker.cpp
   ASTNodeDeclarationToAffectationConverter.cpp
-  ASTNodeDeclarationCleaner.cpp
   ASTNodeEmptyBlockCleaner.cpp
   ASTNodeExpressionBuilder.cpp
   ASTNodeFunctionExpressionBuilder.cpp
diff --git a/src/language/PugsParser.cpp b/src/language/PugsParser.cpp
index d59d53210..5603fa424 100644
--- a/src/language/PugsParser.cpp
+++ b/src/language/PugsParser.cpp
@@ -19,6 +19,8 @@
 #include <PEGGrammar.hpp>
 #include <SymbolTable.hpp>
 
+#include <ASTModulesImporter.hpp>
+
 #include <ASTNodeDataTypeBuilder.hpp>
 #include <ASTNodeDataTypeChecker.hpp>
 
@@ -31,8 +33,8 @@
 
 #include <ASTNodeEmptyBlockCleaner.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTDotPrinter.hpp>
 #include <ASTPrinter.hpp>
@@ -54,6 +56,9 @@ parser(const std::string& filename)
   try {
     root_node = ASTBuilder::build(input);
 
+    ASTModulesImporter{*root_node};
+    ASTNodeTypeCleaner<language::import_instruction>{*root_node};
+
     ASTSymbolTableBuilder{*root_node};
 
     ASTSymbolInitializationChecker{*root_node};
@@ -76,7 +81,10 @@ parser(const std::string& filename)
 
     // optimizations
     ASTNodeDeclarationToAffectationConverter{*root_node};
-    ASTNodeDeclarationCleaner{*root_node};
+
+    ASTNodeTypeCleaner<language::declaration>{*root_node};
+    ASTNodeTypeCleaner<language::let_declaration>{*root_node};
+
     ASTNodeEmptyBlockCleaner{*root_node};
 
     ASTNodeExpressionBuilder{*root_node};
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index e3cdf5ea9..4199526b7 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -15,12 +15,12 @@ add_executable (unit_tests
   test_ASTNodeDataType.cpp
   test_ASTNodeDataTypeBuilder.cpp
   test_ASTNodeDataTypeChecker.cpp
-  test_ASTNodeDeclarationCleaner.cpp
   test_ASTNodeDeclarationToAffectationConverter.cpp
   test_ASTNodeExpressionBuilder.cpp
   test_ASTNodeIncDecExpressionBuilder.cpp
   test_ASTNodeJumpPlacementChecker.cpp
   test_ASTNodeListProcessor.cpp
+  test_ASTNodeTypeCleaner.cpp
   test_ASTNodeUnaryOperatorExpressionBuilder.cpp
   test_ASTNodeValueBuilder.cpp
   test_ASTPrinter.cpp
diff --git a/tests/test_ASTNodeAffectationExpressionBuilder.cpp b/tests/test_ASTNodeAffectationExpressionBuilder.cpp
index 4a1be1371..ea531b67a 100644
--- a/tests/test_ASTNodeAffectationExpressionBuilder.cpp
+++ b/tests/test_ASTNodeAffectationExpressionBuilder.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -34,7 +34,7 @@
     ASTNodeValueBuilder{*ast};                                                                      \
                                                                                                     \
     ASTNodeDeclarationToAffectationConverter{*ast};                                                 \
-    ASTNodeDeclarationCleaner{*ast};                                                                \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                                                \
                                                                                                     \
     ASTNodeExpressionBuilder{*ast};                                                                 \
                                                                                                     \
@@ -195,7 +195,7 @@ N n="foo";
         ASTNodeValueBuilder{*ast};
 
         ASTNodeDeclarationToAffectationConverter{*ast};
-        ASTNodeDeclarationCleaner{*ast};
+        ASTNodeTypeCleaner<language::declaration>{*ast};
 
         REQUIRE_THROWS_AS(ASTNodeExpressionBuilder{*ast}, parse_error);
       }
@@ -281,7 +281,7 @@ Z z="foo";
         ASTNodeValueBuilder{*ast};
 
         ASTNodeDeclarationToAffectationConverter{*ast};
-        ASTNodeDeclarationCleaner{*ast};
+        ASTNodeTypeCleaner<language::declaration>{*ast};
 
         REQUIRE_THROWS_AS(ASTNodeExpressionBuilder{*ast}, parse_error);
       }
@@ -367,7 +367,7 @@ R r="foo";
         ASTNodeValueBuilder{*ast};
 
         ASTNodeDeclarationToAffectationConverter{*ast};
-        ASTNodeDeclarationCleaner{*ast};
+        ASTNodeTypeCleaner<language::declaration>{*ast};
 
         REQUIRE_THROWS_AS(ASTNodeExpressionBuilder{*ast}, parse_error);
       }
@@ -579,7 +579,7 @@ string s="foo"; s-="bar";
       ASTNodeValueBuilder{*ast};
 
       ASTNodeDeclarationToAffectationConverter{*ast};
-      ASTNodeDeclarationCleaner{*ast};
+      ASTNodeTypeCleaner<language::declaration>{*ast};
 
       REQUIRE_THROWS_AS(ASTNodeExpressionBuilder{*ast}, parse_error);
     }
@@ -641,7 +641,7 @@ string s="foo"; s*=2;
       ASTNodeValueBuilder{*ast};
 
       ASTNodeDeclarationToAffectationConverter{*ast};
-      ASTNodeDeclarationCleaner{*ast};
+      ASTNodeTypeCleaner<language::declaration>{*ast};
 
       REQUIRE_THROWS_AS(ASTNodeExpressionBuilder{*ast}, parse_error);
     }
@@ -703,7 +703,7 @@ string s="foo"; s/="bar";
       ASTNodeValueBuilder{*ast};
 
       ASTNodeDeclarationToAffectationConverter{*ast};
-      ASTNodeDeclarationCleaner{*ast};
+      ASTNodeTypeCleaner<language::declaration>{*ast};
 
       REQUIRE_THROWS_AS(ASTNodeExpressionBuilder{*ast}, parse_error);
     }
diff --git a/tests/test_ASTNodeBinaryOperatorExpressionBuilder.cpp b/tests/test_ASTNodeBinaryOperatorExpressionBuilder.cpp
index 6e886f450..0aa28cbe6 100644
--- a/tests/test_ASTNodeBinaryOperatorExpressionBuilder.cpp
+++ b/tests/test_ASTNodeBinaryOperatorExpressionBuilder.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -34,7 +34,7 @@
     ASTNodeValueBuilder{*ast};                                                                      \
                                                                                                     \
     ASTNodeDeclarationToAffectationConverter{*ast};                                                 \
-    ASTNodeDeclarationCleaner{*ast};                                                                \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                                                \
                                                                                                     \
     ASTNodeExpressionBuilder{*ast};                                                                 \
                                                                                                     \
@@ -57,7 +57,7 @@
     ASTNodeValueBuilder{*ast};                                                                  \
                                                                                                 \
     ASTNodeDeclarationToAffectationConverter{*ast};                                             \
-    ASTNodeDeclarationCleaner{*ast};                                                            \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                                            \
                                                                                                 \
     REQUIRE_THROWS(ASTNodeExpressionBuilder{*ast}, Catch::Matchers::Contains(expected_output)); \
   }
diff --git a/tests/test_ASTNodeExpressionBuilder.cpp b/tests/test_ASTNodeExpressionBuilder.cpp
index d27c09272..017f3f397 100644
--- a/tests/test_ASTNodeExpressionBuilder.cpp
+++ b/tests/test_ASTNodeExpressionBuilder.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -32,7 +32,7 @@
     ASTNodeValueBuilder{*ast};                                                                      \
                                                                                                     \
     ASTNodeDeclarationToAffectationConverter{*ast};                                                 \
-    ASTNodeDeclarationCleaner{*ast};                                                                \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                                                \
                                                                                                     \
     ASTNodeExpressionBuilder{*ast};                                                                 \
     std::stringstream ast_output;                                                                   \
diff --git a/tests/test_ASTNodeIncDecExpressionBuilder.cpp b/tests/test_ASTNodeIncDecExpressionBuilder.cpp
index 87ee58b84..11e270b86 100644
--- a/tests/test_ASTNodeIncDecExpressionBuilder.cpp
+++ b/tests/test_ASTNodeIncDecExpressionBuilder.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -34,7 +34,7 @@
     ASTNodeValueBuilder{*ast};                                                                      \
                                                                                                     \
     ASTNodeDeclarationToAffectationConverter{*ast};                                                 \
-    ASTNodeDeclarationCleaner{*ast};                                                                \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                                                \
                                                                                                     \
     ASTNodeExpressionBuilder{*ast};                                                                 \
                                                                                                     \
diff --git a/tests/test_ASTNodeListProcessor.cpp b/tests/test_ASTNodeListProcessor.cpp
index c5f36f506..ed0748188 100644
--- a/tests/test_ASTNodeListProcessor.cpp
+++ b/tests/test_ASTNodeListProcessor.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTSymbolTableBuilder.hpp>
 
@@ -36,7 +36,7 @@ true;
   ASTNodeValueBuilder{*ast};
 
   ASTNodeDeclarationToAffectationConverter{*ast};
-  ASTNodeDeclarationCleaner{*ast};
+  ASTNodeTypeCleaner<language::declaration>{*ast};
 
   ASTNodeExpressionBuilder{*ast};
   ExecUntilBreakOrContinue exec_policy;
diff --git a/tests/test_ASTNodeDeclarationCleaner.cpp b/tests/test_ASTNodeTypeCleaner.cpp
similarity index 94%
rename from tests/test_ASTNodeDeclarationCleaner.cpp
rename to tests/test_ASTNodeTypeCleaner.cpp
index b92864235..02da34b90 100644
--- a/tests/test_ASTNodeDeclarationCleaner.cpp
+++ b/tests/test_ASTNodeTypeCleaner.cpp
@@ -5,7 +5,7 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTSymbolTableBuilder.hpp>
 
@@ -23,7 +23,7 @@
     ASTNodeDataTypeBuilder{*ast};                                                              \
     ASTNodeValueBuilder{*ast};                                                                 \
                                                                                                \
-    ASTNodeDeclarationCleaner{*ast};                                                           \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                                           \
                                                                                                \
     std::stringstream ast_output;                                                              \
     ast_output << '\n' << ASTPrinter{*ast, ASTPrinter::Format::raw, {ASTPrinter::Info::none}}; \
@@ -31,7 +31,7 @@
     REQUIRE(ast_output.str() == expected_output);                                              \
   }
 
-TEST_CASE("ASTNodeDeclarationCleaner", "[language]")
+TEST_CASE("ASTNodeTypeCleaner", "[language]")
 {
   SECTION("no declaration")
   {
diff --git a/tests/test_ASTNodeUnaryOperatorExpressionBuilder.cpp b/tests/test_ASTNodeUnaryOperatorExpressionBuilder.cpp
index b05998e6b..5ea6a3461 100644
--- a/tests/test_ASTNodeUnaryOperatorExpressionBuilder.cpp
+++ b/tests/test_ASTNodeUnaryOperatorExpressionBuilder.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -34,7 +34,7 @@
     ASTNodeValueBuilder{*ast};                                                                      \
                                                                                                     \
     ASTNodeDeclarationToAffectationConverter{*ast};                                                 \
-    ASTNodeDeclarationCleaner{*ast};                                                                \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                                                \
                                                                                                     \
     ASTNodeExpressionBuilder{*ast};                                                                 \
                                                                                                     \
diff --git a/tests/test_AffectationProcessor.cpp b/tests/test_AffectationProcessor.cpp
index 2ce8f79be..b9c2a033c 100644
--- a/tests/test_AffectationProcessor.cpp
+++ b/tests/test_AffectationProcessor.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -32,7 +32,7 @@
     ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
-    ASTNodeDeclarationCleaner{*ast};                                          \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
     ExecUntilBreakOrContinue exec_policy;                                     \
@@ -61,7 +61,7 @@
     ASTNodeValueBuilder{*ast};                                                               \
                                                                                              \
     ASTNodeDeclarationToAffectationConverter{*ast};                                          \
-    ASTNodeDeclarationCleaner{*ast};                                                         \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                                         \
                                                                                              \
     REQUIRE_THROWS(ASTNodeExpressionBuilder{*ast},                                           \
                    Catch::Matchers::Contains("invalid operands to affectation expression")); \
diff --git a/tests/test_AffectationToStringProcessor.cpp b/tests/test_AffectationToStringProcessor.cpp
index 18831ae21..bdd384762 100644
--- a/tests/test_AffectationToStringProcessor.cpp
+++ b/tests/test_AffectationToStringProcessor.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -32,7 +32,7 @@
     ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
-    ASTNodeDeclarationCleaner{*ast};                                          \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
     ExecUntilBreakOrContinue exec_policy;                                     \
diff --git a/tests/test_BinaryExpressionProcessor_utils.hpp b/tests/test_BinaryExpressionProcessor_utils.hpp
index c6d7a8bd6..d442a6763 100644
--- a/tests/test_BinaryExpressionProcessor_utils.hpp
+++ b/tests/test_BinaryExpressionProcessor_utils.hpp
@@ -6,8 +6,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -33,7 +33,7 @@
     ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
-    ASTNodeDeclarationCleaner{*ast};                                          \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
     ExecUntilBreakOrContinue exec_policy;                                     \
diff --git a/tests/test_ConcatExpressionProcessor.cpp b/tests/test_ConcatExpressionProcessor.cpp
index 3baa9c59f..7bcfc0a1d 100644
--- a/tests/test_ConcatExpressionProcessor.cpp
+++ b/tests/test_ConcatExpressionProcessor.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -32,7 +32,7 @@
     ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
-    ASTNodeDeclarationCleaner{*ast};                                          \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
     ExecUntilBreakOrContinue exec_policy;                                     \
diff --git a/tests/test_DoWhileProcessor.cpp b/tests/test_DoWhileProcessor.cpp
index 8cbc13823..9ccf21e37 100644
--- a/tests/test_DoWhileProcessor.cpp
+++ b/tests/test_DoWhileProcessor.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -32,7 +32,7 @@
     ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
-    ASTNodeDeclarationCleaner{*ast};                                          \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
     ExecUntilBreakOrContinue exec_policy;                                     \
diff --git a/tests/test_ForProcessor.cpp b/tests/test_ForProcessor.cpp
index 9f0371d06..4261a8193 100644
--- a/tests/test_ForProcessor.cpp
+++ b/tests/test_ForProcessor.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -32,7 +32,7 @@
     ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
-    ASTNodeDeclarationCleaner{*ast};                                          \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
     ExecUntilBreakOrContinue exec_policy;                                     \
diff --git a/tests/test_IfProcessor.cpp b/tests/test_IfProcessor.cpp
index 5e6014b75..4ec597352 100644
--- a/tests/test_IfProcessor.cpp
+++ b/tests/test_IfProcessor.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -32,7 +32,7 @@
     ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
-    ASTNodeDeclarationCleaner{*ast};                                          \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
     ExecUntilBreakOrContinue exec_policy;                                     \
diff --git a/tests/test_IncDecExpressionProcessor.cpp b/tests/test_IncDecExpressionProcessor.cpp
index 3cba4f901..0562c3f31 100644
--- a/tests/test_IncDecExpressionProcessor.cpp
+++ b/tests/test_IncDecExpressionProcessor.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -32,7 +32,7 @@
     ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
-    ASTNodeDeclarationCleaner{*ast};                                          \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
     ExecUntilBreakOrContinue exec_policy;                                     \
diff --git a/tests/test_NameProcessor.cpp b/tests/test_NameProcessor.cpp
index 4152b3ae0..cd7374ae7 100644
--- a/tests/test_NameProcessor.cpp
+++ b/tests/test_NameProcessor.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -40,7 +40,7 @@ n = 2;
   ASTNodeValueBuilder{*ast};
 
   ASTNodeDeclarationToAffectationConverter{*ast};
-  ASTNodeDeclarationCleaner{*ast};
+  ASTNodeTypeCleaner<language::declaration>{*ast};
 
   ASTNodeExpressionBuilder{*ast};
   ExecUntilBreakOrContinue exec_policy;
diff --git a/tests/test_OStreamProcessor.cpp b/tests/test_OStreamProcessor.cpp
index be958502a..1f1358312 100644
--- a/tests/test_OStreamProcessor.cpp
+++ b/tests/test_OStreamProcessor.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -46,7 +46,7 @@ _replaceOStream(ASTNode& node, std::ostringstream& sout)
     ASTNodeValueBuilder{*ast};                                \
                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};           \
-    ASTNodeDeclarationCleaner{*ast};                          \
+    ASTNodeTypeCleaner<language::declaration>{*ast};          \
                                                               \
     ASTNodeExpressionBuilder{*ast};                           \
     ExecUntilBreakOrContinue exec_policy;                     \
diff --git a/tests/test_UnaryExpressionProcessor.cpp b/tests/test_UnaryExpressionProcessor.cpp
index 7947f3f60..5c6a69436 100644
--- a/tests/test_UnaryExpressionProcessor.cpp
+++ b/tests/test_UnaryExpressionProcessor.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -32,7 +32,7 @@
     ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
-    ASTNodeDeclarationCleaner{*ast};                                          \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
     ExecUntilBreakOrContinue exec_policy;                                     \
diff --git a/tests/test_WhileProcessor.cpp b/tests/test_WhileProcessor.cpp
index 9d58d96e0..b94cd9738 100644
--- a/tests/test_WhileProcessor.cpp
+++ b/tests/test_WhileProcessor.cpp
@@ -5,8 +5,8 @@
 #include <ASTBuilder.hpp>
 #include <ASTNodeDataTypeBuilder.hpp>
 
-#include <ASTNodeDeclarationCleaner.hpp>
 #include <ASTNodeDeclarationToAffectationConverter.hpp>
+#include <ASTNodeTypeCleaner.hpp>
 
 #include <ASTNodeExpressionBuilder.hpp>
 
@@ -32,7 +32,7 @@
     ASTNodeValueBuilder{*ast};                                                \
                                                                               \
     ASTNodeDeclarationToAffectationConverter{*ast};                           \
-    ASTNodeDeclarationCleaner{*ast};                                          \
+    ASTNodeTypeCleaner<language::declaration>{*ast};                          \
                                                                               \
     ASTNodeExpressionBuilder{*ast};                                           \
     ExecUntilBreakOrContinue exec_policy;                                     \
-- 
GitLab