#ifndef AST_EXECUTION_INFO_HPP
#define AST_EXECUTION_INFO_HPP

#include <string>

class ModuleRepository;
class ASTNode;
class ASTExecutionInfo
{
 private:
  static const ASTExecutionInfo* m_current_execution_info;

  const ASTNode& m_root_node;

  const ModuleRepository& m_module_repository;

  // The only place where the ASTExecutionInfo can be built
  friend void parser(const std::string& filename);
  // also allowed for testing
  friend void test_ASTExecutionInfo(const ASTNode&, const ModuleRepository&);

  ASTExecutionInfo(const ASTNode& root_node, const ModuleRepository& module_repository);

 public:
  const ASTNode&
  rootNode() const
  {
    return m_root_node;
  }

  const ModuleRepository&
  moduleRepository() const
  {
    return m_module_repository;
  }

  static const ASTExecutionInfo& current();

  ASTExecutionInfo() = delete;

  ~ASTExecutionInfo();
};

#endif   // AST_EXECUTION_INFO_HPP