Example #1
0
bool Namespace::Build(const Node* node)
{
  Node::Build(node);

  auto ns = static_cast<const Namespace *>(node);

  bool result = true;

  for (auto &kvp : ns->m_Children)
  {
    Namespace *ch = nullptr;

    if (kvp.second->GetNodeType() == NodeType::Namespace)
      ch = GetOrCreateNamespace(kvp.first);
    else if (kvp.second->GetNodeType() == NodeType::Class)
      ch = GetOrCreateClass(kvp.first);

    ch->Build(kvp.second.get());
  }

  for (auto &kvp : ns->m_Functions)
  {
    auto &overloads = GetOrCreateOverloads(kvp.first);

    for (auto &f : kvp.second)
    {
      auto iter = overloads.find(f.second->GetFullSignature());
      if (iter == overloads.end())
      {
        Function *newF = new Function(this, kvp.first, f.second->GetFunctionType());
        newF->Build(f.second.get());

        overloads[newF->GetFullSignature()] = std::unique_ptr<Function>(newF);
      }
    }
  }

  for (auto &kvp : ns->m_Types)
  {
    auto iter = m_Types.find(kvp.first);
    if (iter == m_Types.end())
    {
      Type *t = new Type(this, kvp.second->GetPrimitive(), kvp.second->GetName());
      t->Build(kvp.second.get());
      m_Types[kvp.first] = std::unique_ptr<Type>(t);
    }
  }

  for (auto &kvp : ns->m_Variables)
  {
    auto iter = m_Variables.find(kvp.first);
    if (iter == m_Variables.end())
    {
      Variable *v = new Variable(this, kvp.first);
      v->Build(kvp.second.get());
      m_Variables[kvp.first] = std::unique_ptr<Variable>(v);
    }
  }

  for (auto &kvp : ns->m_EnumConstants)
  {
    auto iter = m_EnumConstants.find(kvp.first);
    if (iter == m_EnumConstants.end())
    {
      EnumConstant *ec = new EnumConstant(this, kvp.second->GetName());
      ec->Build(kvp.second.get());
      m_EnumConstants[kvp.first] = std::unique_ptr<EnumConstant>(ec);
    }
  }

  return result;
}