From 7c5036878c6ee4833d29f7914d0cbe73a0298197 Mon Sep 17 00:00:00 2001
From: Stephane Del Pino <stephane.delpino44@gmail.com>
Date: Sat, 23 Apr 2022 17:17:47 +0200
Subject: [PATCH] Add --preamble(default),--no-preamble option

When `--no-preamble` is used, pugs do not print execution info. This
at least is useful for documentation generation.
---
 src/language/PugsParser.cpp                 | 14 +++++++++----
 src/language/ast/ASTModulesImporter.cpp     | 16 ++++++++++----
 src/language/ast/ASTNodeDataTypeBuilder.cpp |  5 ++++-
 src/language/ast/ASTNodeDataTypeChecker.cpp |  6 +++++-
 src/language/ast/ASTSymbolTableBuilder.cpp  |  6 +++++-
 src/utils/ConsoleManager.cpp                | 14 +++++++++++++
 src/utils/ConsoleManager.hpp                |  8 ++++++-
 src/utils/PugsUtils.cpp                     | 23 ++++++++++++++-------
 src/utils/RandomEngine.cpp                  | 12 +++++++----
 9 files changed, 80 insertions(+), 24 deletions(-)

diff --git a/src/language/PugsParser.cpp b/src/language/PugsParser.cpp
index 1c02a820a..368e86c83 100644
--- a/src/language/PugsParser.cpp
+++ b/src/language/PugsParser.cpp
@@ -18,6 +18,7 @@
 #include <language/utils/ASTPrinter.hpp>
 #include <language/utils/OperatorRepository.hpp>
 #include <language/utils/SymbolTable.hpp>
+#include <utils/ConsoleManager.hpp>
 #include <utils/PugsAssert.hpp>
 #include <utils/PugsUtils.hpp>
 #include <utils/SignalManager.hpp>
@@ -45,8 +46,10 @@ parser(const std::string& filename)
     throw UnexpectedError(os.str());
   }
 
-  std::cout << rang::style::bold << "Parsing file " << rang::style::reset << rang::style::underline << filename
-            << rang::style::reset << " ...\n";
+  if (ConsoleManager::showPreamble()) {
+    std::cout << rang::style::bold << "Parsing file " << rang::style::reset << rang::style::underline << filename
+              << rang::style::reset << " ...\n";
+  }
 
   auto parse_and_execute = [](auto& input) {
     OperatorRepository::create();
@@ -75,8 +78,11 @@ parser(const std::string& filename)
     ASTNodeEmptyBlockCleaner{*root_node};
 
     ASTNodeExpressionBuilder{*root_node};
-    std::cout << "-------------------------------------------------------\n";
-    std::cout << rang::style::bold << "Executing AST..." << rang::style::reset << '\n';
+
+    if (ConsoleManager::showPreamble()) {
+      std::cout << "-------------------------------------------------------\n";
+      std::cout << rang::style::bold << "Executing AST..." << rang::style::reset << '\n';
+    }
 
     ASTExecutionInfo execution_info{*root_node, module_importer.moduleRepository()};
 
diff --git a/src/language/ast/ASTModulesImporter.cpp b/src/language/ast/ASTModulesImporter.cpp
index fa3f479e3..4154a7d8c 100644
--- a/src/language/ast/ASTModulesImporter.cpp
+++ b/src/language/ast/ASTModulesImporter.cpp
@@ -2,6 +2,7 @@
 
 #include <language/PEGGrammar.hpp>
 #include <language/utils/OperatorRepository.hpp>
+#include <utils/ConsoleManager.hpp>
 
 void
 ASTModulesImporter::_importModule(ASTNode& import_node)
@@ -13,12 +14,16 @@ ASTModulesImporter::_importModule(ASTNode& import_node)
   const std::string module_name   = module_name_node.string();
 
   if (auto [i_module_name, success] = m_imported_modules.insert(module_name); not success) {
-    std::cout << " * ignoring  '" << rang::fgB::green << module_name << rang::style::reset
-              << "' module, already imported\n";
+    if (ConsoleManager::showPreamble()) {
+      std::cout << " * ignoring  '" << rang::fgB::green << module_name << rang::style::reset
+                << "' module, already imported\n";
+    }
     return;
   }
 
-  std::cout << " * importing '" << rang::fgB::green << module_name << rang::style::reset << "' module\n";
+  if (ConsoleManager::showPreamble()) {
+    std::cout << " * importing '" << rang::fgB::green << module_name << rang::style::reset << "' module\n";
+  }
 
   m_module_repository.populateSymbolTable(module_name_node, m_symbol_table);
   m_module_repository.registerOperators(module_name);
@@ -43,5 +48,8 @@ ASTModulesImporter::ASTModulesImporter(ASTNode& root_node) : m_symbol_table{*roo
   m_module_repository.populateMandatorySymbolTable(root_node, m_symbol_table);
 
   this->_importAllModules(root_node);
-  std::cout << " - loaded modules\n";
+
+  if (ConsoleManager::showPreamble()) {
+    std::cout << " - loaded modules\n";
+  }
 }
diff --git a/src/language/ast/ASTNodeDataTypeBuilder.cpp b/src/language/ast/ASTNodeDataTypeBuilder.cpp
index cb9e479df..ac1d36a54 100644
--- a/src/language/ast/ASTNodeDataTypeBuilder.cpp
+++ b/src/language/ast/ASTNodeDataTypeBuilder.cpp
@@ -7,6 +7,7 @@
 #include <language/utils/OperatorRepository.hpp>
 #include <language/utils/ParseError.hpp>
 #include <language/utils/SymbolTable.hpp>
+#include <utils/ConsoleManager.hpp>
 #include <utils/PugsAssert.hpp>
 
 void
@@ -635,5 +636,7 @@ ASTNodeDataTypeBuilder::ASTNodeDataTypeBuilder(ASTNode& node)
 
   this->_buildNodeDataTypes(node);
 
-  std::cout << " - build node data types\n";
+  if (ConsoleManager::showPreamble()) {
+    std::cout << " - build node data types\n";
+  }
 }
diff --git a/src/language/ast/ASTNodeDataTypeChecker.cpp b/src/language/ast/ASTNodeDataTypeChecker.cpp
index 3e6774849..76a153f22 100644
--- a/src/language/ast/ASTNodeDataTypeChecker.cpp
+++ b/src/language/ast/ASTNodeDataTypeChecker.cpp
@@ -1,6 +1,7 @@
 #include <language/ast/ASTNodeDataTypeChecker.hpp>
 
 #include <language/utils/ParseError.hpp>
+#include <utils/ConsoleManager.hpp>
 
 void
 ASTNodeDataTypeChecker::_checkNodeDataTypes(const ASTNode& n)
@@ -18,5 +19,8 @@ ASTNodeDataTypeChecker::ASTNodeDataTypeChecker(const ASTNode& node)
 {
   Assert(node.is_root());
   this->_checkNodeDataTypes(node);
-  std::cout << " - checked node data types\n";
+
+  if (ConsoleManager::showPreamble()) {
+    std::cout << " - checked node data types\n";
+  }
 }
diff --git a/src/language/ast/ASTSymbolTableBuilder.cpp b/src/language/ast/ASTSymbolTableBuilder.cpp
index 2e019d8db..d2eb7d77c 100644
--- a/src/language/ast/ASTSymbolTableBuilder.cpp
+++ b/src/language/ast/ASTSymbolTableBuilder.cpp
@@ -3,6 +3,7 @@
 #include <language/PEGGrammar.hpp>
 #include <language/utils/ParseError.hpp>
 #include <language/utils/SymbolTable.hpp>
+#include <utils/ConsoleManager.hpp>
 
 void
 ASTSymbolTableBuilder::buildSymbolTable(ASTNode& n, std::shared_ptr<SymbolTable>& symbol_table)
@@ -124,5 +125,8 @@ ASTSymbolTableBuilder::ASTSymbolTableBuilder(ASTNode& node)
   Assert(node.is_root());
 
   this->buildSymbolTable(node, node.m_symbol_table);
-  std::cout << " - checked symbols declaration\n";
+
+  if (ConsoleManager::showPreamble()) {
+    std::cout << " - checked symbols declaration\n";
+  }
 }
diff --git a/src/utils/ConsoleManager.cpp b/src/utils/ConsoleManager.cpp
index f55004ac7..7006d373f 100644
--- a/src/utils/ConsoleManager.cpp
+++ b/src/utils/ConsoleManager.cpp
@@ -2,6 +2,20 @@
 
 #include <rang.hpp>
 
+bool ConsoleManager::s_show_preamble = true;
+
+bool
+ConsoleManager::showPreamble()
+{
+  return s_show_preamble;
+}
+
+void
+ConsoleManager::setShowPreamble(bool show_preamble)
+{
+  s_show_preamble = show_preamble;
+}
+
 bool
 ConsoleManager::isTerminal(std::ostream& os)
 {
diff --git a/src/utils/ConsoleManager.hpp b/src/utils/ConsoleManager.hpp
index b9ee7cbfb..a2afe46fb 100644
--- a/src/utils/ConsoleManager.hpp
+++ b/src/utils/ConsoleManager.hpp
@@ -3,8 +3,14 @@
 
 #include <string>
 
-struct ConsoleManager
+class ConsoleManager
 {
+ private:
+  static bool s_show_preamble;
+
+ public:
+  static bool showPreamble();
+  static void setShowPreamble(bool show_preamble);
   static bool isTerminal(std::ostream& os);
   static void init(bool colorize);
 };
diff --git a/src/utils/PugsUtils.cpp b/src/utils/PugsUtils.cpp
index 3214ba653..705fbd5e0 100644
--- a/src/utils/PugsUtils.cpp
+++ b/src/utils/PugsUtils.cpp
@@ -105,6 +105,9 @@ initialize(int& argc, char* argv[])
 
     app.add_flag("--fpe,!--no-fpe", enable_fpe, "Trap floating point exceptions [default: true]");
 
+    bool show_preamble = true;
+    app.add_flag("--preamble,!--no-preamble", show_preamble, "Show execution info preamble [default: true]");
+
     bool show_backtrace = false;
     app.add_flag("-b,--backtrace,!--no-backtrace", show_backtrace, "Show backtrace on failure [default: false]");
 
@@ -123,6 +126,7 @@ initialize(int& argc, char* argv[])
     }
 
     BacktraceManager::setShow(show_backtrace);
+    ConsoleManager::setShowPreamble(show_preamble);
     ConsoleManager::init(enable_color);
     SignalManager::setPauseForDebug(pause_on_error);
   }
@@ -135,18 +139,21 @@ initialize(int& argc, char* argv[])
 
   setDefaultOMPEnvironment();
   Kokkos::initialize(argc, argv);
-  std::cout << "----------------- " << rang::fg::green << "pugs exec info" << rang::fg::reset
-            << " ----------------------" << '\n';
 
-  std::cout << rang::style::bold;
+  if (ConsoleManager::showPreamble()) {
+    std::cout << "----------------- " << rang::fg::green << "pugs exec info" << rang::fg::reset
+              << " ----------------------" << '\n';
+
+    std::cout << rang::style::bold;
 #ifdef PUGS_HAS_MPI
-  std::cout << "MPI number of ranks " << parallel::size() << '\n';
+    std::cout << "MPI number of ranks " << parallel::size() << '\n';
 #else    // PUGS_HAS_MPI
-  std::cout << "Sequential build\n";
+    std::cout << "Sequential build\n";
 #endif   // PUGS_HAS_MPI
-  Kokkos::DefaultExecutionSpace::print_configuration(std::cout);
-  std::cout << rang::style::reset;
-  std::cout << "-------------------------------------------------------\n";
+    Kokkos::DefaultExecutionSpace::print_configuration(std::cout);
+    std::cout << rang::style::reset;
+    std::cout << "-------------------------------------------------------\n";
+  }
 
   return filename;
 }
diff --git a/src/utils/RandomEngine.cpp b/src/utils/RandomEngine.cpp
index 9b7efc162..dd463af53 100644
--- a/src/utils/RandomEngine.cpp
+++ b/src/utils/RandomEngine.cpp
@@ -1,4 +1,5 @@
 
+#include <utils/ConsoleManager.hpp>
 #include <utils/Messenger.hpp>
 #include <utils/RandomEngine.hpp>
 
@@ -47,10 +48,13 @@ RandomEngine::RandomEngine()
 void
 RandomEngine::setRandomSeed(const uint64_t random_seed)
 {
-  m_random_engine = std::default_random_engine(random_seed);
-
-  std::cout << " * setting " << rang::fgB::green << "random seed" << rang::style::reset << " to " << rang::fgB::yellow
-            << random_seed << rang::style::reset << '\n';
+  m_random_engine  = std::default_random_engine(random_seed);
+  static bool init = true;
+  if (ConsoleManager::showPreamble() or not init) {
+    std::cout << " * setting " << rang::fgB::green << "random seed" << rang::style::reset << " to " << rang::fgB::yellow
+              << random_seed << rang::style::reset << '\n';
+  }
+  init = false;
 }
 
 void
-- 
GitLab