From 145e2d9e015c26f23a567d4a8a42467108dda0af Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Tue, 2 Jul 2019 15:25:47 +0200
Subject: [PATCH] Improve output of AST

now one can select some details (useful for unit tests)
---
 src/language/ASTPrinter.cpp | 52 +++++++++++++++++++++++++------------
 src/language/ASTPrinter.hpp | 16 +++++++++++-
 src/language/PugsParser.cpp |  2 +-
 3 files changed, 52 insertions(+), 18 deletions(-)

diff --git a/src/language/ASTPrinter.cpp b/src/language/ASTPrinter.cpp
index 572a97a11..bfb526cc7 100644
--- a/src/language/ASTPrinter.cpp
+++ b/src/language/ASTPrinter.cpp
@@ -1,6 +1,8 @@
 #include <ASTPrinter.hpp>
 #include <EscapedString.hpp>
 
+#include <PEGGrammar.hpp>
+
 namespace language
 {
 void
@@ -12,22 +14,34 @@ ASTPrinter::_print(std::ostream& os, const Node& node) const
   } else {
     os << node.name();
   }
-  os << rang::fg::reset << ':';
-  os << dataTypeName(node.m_data_type) << ':';
+  os << rang::fg::reset;
 
-  os << rang::fgB::cyan;
-  std::visit(
-    [&](const auto& value) {
-      using T = std::decay_t<decltype(value)>;
-      if constexpr (std::is_same_v<T, std::monostate>) {
-        os << "--";
-      } else if constexpr (std::is_same_v<T, std::string>) {
-        os << '\"' << escapeString(value) << '\"';
-      } else {
-        os << value;
-      }
-    },
-    node.m_value);
+  if (node.is<language::name>() or node.is<language::literal>() or node.is<language::integer>() or
+      node.is<language::real>()) {
+    os << ':' << rang::fgB::green << node.string() << rang::fg::reset;
+  }
+
+  if (m_info & static_cast<InfoBaseType>(Info::data_type)) {
+    os << ':';
+    os << dataTypeName(node.m_data_type) << rang::fg::reset;
+  }
+
+  if (m_info & static_cast<InfoBaseType>(Info::data_value)) {
+    os << ':';
+    os << rang::fgB::cyan;
+    std::visit(
+      [&](const auto& value) {
+        using T = std::decay_t<decltype(value)>;
+        if constexpr (std::is_same_v<T, std::monostate>) {
+          os << "--";
+        } else if constexpr (std::is_same_v<T, std::string>) {
+          os << '\"' << escapeString(value) << '\"';
+        } else {
+          os << value;
+        }
+      },
+      node.m_value);
+  }
   os << rang::fg::reset << ")\n";
 
   if (not node.children.empty()) {
@@ -71,7 +85,8 @@ operator<<(std::ostream& os, const ASTPrinter& ast_printer)
   return os;
 }
 
-ASTPrinter::ASTPrinter(const language::Node& node, Format format) : m_node{node}
+ASTPrinter::ASTPrinter(const language::Node& node, Format format, std::initializer_list<Info> initializer_list)
+  : m_node{node}
 {
   if (format == Format::pretty) {
     T_junction  = " \u251c\u2500\u2500";
@@ -85,5 +100,10 @@ ASTPrinter::ASTPrinter(const language::Node& node, Format format) : m_node{node}
     pipe_space  = " |  ";
     space_space = "    ";
   }
+
+  m_info = 0;
+  for (auto i : initializer_list) {
+    m_info |= static_cast<InfoBaseType>(i);
+  }
 }
 }   // namespace language
diff --git a/src/language/ASTPrinter.hpp b/src/language/ASTPrinter.hpp
index a4715fba2..ec6c8b93b 100644
--- a/src/language/ASTPrinter.hpp
+++ b/src/language/ASTPrinter.hpp
@@ -14,9 +14,21 @@ class ASTPrinter
     pretty
   };
 
+  using InfoBaseType = uint32_t;
+
+  enum class Info : InfoBaseType
+  {
+    none       = 0,
+    data_type  = 1 << 0,
+    data_value = 1 << 1,
+    all        = std::numeric_limits<InfoBaseType>::max()
+  };
+
  private:
   const Node& m_node;
 
+  InfoBaseType m_info;
+
   mutable std::string prefix;
   mutable std::vector<int> last_prefix_size;
 
@@ -34,7 +46,9 @@ class ASTPrinter
  public:
   friend std::ostream& operator<<(std::ostream& os, const ASTPrinter& ast_printer);
 
-  ASTPrinter(const Node& node, Format format = Format::pretty);
+  ASTPrinter(const Node& node,
+             Format format                                = Format::pretty,
+             std::initializer_list<Info> initializer_list = {Info::all});
 
   ASTPrinter(const ASTPrinter&) = delete;
 
diff --git a/src/language/PugsParser.cpp b/src/language/PugsParser.cpp
index 2edd84b3b..db2f4f593 100644
--- a/src/language/PugsParser.cpp
+++ b/src/language/PugsParser.cpp
@@ -484,7 +484,7 @@ parser(const std::string& filename)
 
     language::build_node_type(*root_node);
 
-    std::cout << language::ASTPrinter{*root_node, language::ASTPrinter::Format::raw} << '\n';
+    std::cout << language::ASTPrinter{*root_node} << '\n';
 
     language::ExecUntilBreakOrContinue exec_all;
     root_node->execute(exec_all);
-- 
GitLab