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