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; }
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; }