Example #1
0
bool Namespace::Build(const CursorWrapper *cursor)
{
  bool result = true;

  for (auto &ch : cursor->Children)
  {
    switch (ch->Kind)
    {
      case CXCursor_Namespace:
      {
        if (m_Parent == nullptr && !strcmp(ch->Spelling, "std"))
          break;

        Namespace *ns = GetOrCreateNamespace(ch->Spelling);
        result = result && ns->Build(ch.get());
      }
      break;

      case CXCursor_ClassDecl:
      case CXCursor_StructDecl:
      {
        Class *c = GetOrCreateClass(ch->Spelling);
        if (c)
          result = result && c->Build(ch.get());
        else
          result = false;
      }
      break;

      case CXCursor_EnumDecl:
      {
        bool isScoped = ch->IsScopedEnum();
        Namespace *scope = this;

        if (isScoped)
          scope = GetOrCreateNamespace(ch->Spelling);

        if (scope)
          result = result && scope->Build(ch.get());
        else
          result = false;
      }
      break;

      case CXCursor_EnumConstantDecl:
      {
        EnumConstant *ec = GetOrCreateEnumConstant(ch->Spelling);
        if (ec)
          result = result && ec->Build(ch.get());
        else
          result = false;
      }
      break;

      default:
        break;
    }
  }

  return result;
}
Example #2
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;
}