// 维护对象符号的注册与按作用域查找。

#include "sem/SymbolTable.h"

#include <stdexcept>

SymbolTable::SymbolTable() : scopes_(1) {}

void SymbolTable::EnterScope() { scopes_.emplace_back(); }

void SymbolTable::ExitScope() {
  if (scopes_.size() <= 1) {
    throw std::runtime_error("symbol table scope underflow");
  }
  scopes_.pop_back();
}

bool SymbolTable::Add(const ObjectBinding& symbol) {
  auto& scope = scopes_.back();
  return scope.emplace(symbol.name, symbol).second;
}

bool SymbolTable::ContainsInCurrentScope(std::string_view name) const {
  const auto& scope = scopes_.back();
  return scope.find(std::string(name)) != scope.end();
}

const ObjectBinding* SymbolTable::Lookup(std::string_view name) const {
  const std::string key(name);
  for (auto it = scopes_.rbegin(); it != scopes_.rend(); ++it) {
    auto found = it->find(key);
    if (found != it->end()) {
      return &found->second;
    }
  }
  return nullptr;
}

size_t SymbolTable::Depth() const { return scopes_.size(); }
