#ifndef NIX_IRC_IR_GEN_H
#define NIX_IRC_IR_GEN_H

#include "types.h"
#include <memory>
#include <string>
#include <unordered_map>
#include <vector>

namespace nix_irc {

class IRGenerator {
public:
  IRGenerator();
  ~IRGenerator();

  void set_string_table(const std::unordered_map<std::string, uint32_t>& table);
  uint32_t add_string(const std::string& str);

  std::shared_ptr<Node> generate(const std::shared_ptr<Node>& ast);

private:
  struct Impl;
  std::unique_ptr<Impl> pImpl;
};

class NameResolver {
public:
  NameResolver();
  ~NameResolver();

  void enter_scope();
  void exit_scope();
  void bind(const std::string& name);
  uint32_t resolve(const std::string& name);
  bool is_bound(const std::string& name) const;

private:
  struct Impl;
  std::unique_ptr<Impl> pImpl;
};

} // namespace nix_irc

#endif