Skip to content

Commit

Permalink
refactor function overloads
Browse files Browse the repository at this point in the history
  • Loading branch information
vinniefalco committed Apr 21, 2023
1 parent f5faf9e commit cea7b46
Show file tree
Hide file tree
Showing 15 changed files with 383 additions and 226 deletions.
20 changes: 20 additions & 0 deletions include/mrdox/Corpus.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,17 @@ class Corpus
}

public:
struct Visitor
{
virtual ~Visitor() = default;
virtual void visit(NamespaceInfo const&) {}
virtual void visit(RecordInfo const&) {}
virtual void visit(FunctionOverloads const&) {}
virtual void visit(FunctionInfo const&) {}
virtual void visit(EnumInfo const&) {}
virtual void visit(TypedefInfo const&) {}
};

//--------------------------------------------
//
// Observers
Expand Down Expand Up @@ -135,6 +146,15 @@ class Corpus
return allSymbols_;
}

/** Visit the specified symbol ID or node.
*/
/** @{ */
void visit(SymbolID id, Visitor& f) const;
void visit(Scope const& I, Visitor& f) const;
void visitWithOverloads(Scope const& I, Visitor& f) const;
void visit(Info const& I, Visitor& f) const;
/** @} */

//--------------------------------------------
//
// Modifiers
Expand Down
1 change: 1 addition & 0 deletions include/mrdox/Metadata.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <mrdox/meta/Enum.hpp>
#include <mrdox/meta/FieldType.hpp>
#include <mrdox/meta/Function.hpp>
#include <mrdox/meta/FunctionOverloads.hpp>
#include <mrdox/meta/Index.hpp>
#include <mrdox/meta/Info.hpp>
#include <mrdox/meta/Javadoc.hpp>
Expand Down
2 changes: 2 additions & 0 deletions include/mrdox/MetadataFwd.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ struct EnumValueInfo;
struct EnumInfo;
struct FieldTypeInfo;
struct FunctionInfo;
struct FunctionOverloads;
struct FunctionOverloadsSet;
struct Index;
struct Info;
struct Javadoc;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,30 +9,45 @@
// Official repository: https://github.com/cppalliance/mrdox
//

#ifndef MRDOX_META_OVERLOADSET_HPP
#define MRDOX_META_OVERLOADSET_HPP
#ifndef MRDOX_META_FUNCTIONOVERLOADS_HPP
#define MRDOX_META_FUNCTIONOVERLOADS_HPP

#include <mrdox/meta/Function.hpp>
#include <clang/Basic/Specifiers.h>
#include <llvm/ADT/StringRef.h>
#include <functional>

namespace clang {
namespace mrdox {

class Corpus;
struct Scope;

struct OverloadSet
/** A list of overloads for one function name.
*/
struct FunctionOverloads
{
llvm::StringRef name;
std::vector<FunctionInfo const*> list;
};

std::vector<OverloadSet>
makeOverloadSet(
/** A set of unique function names in a scope
*/
struct FunctionOverloadsSet
{
/** The access control of this scope.
*/
AccessSpecifier access;

/** The list of function overloads in the scope.
*/
std::vector<FunctionOverloads> list;
};

FunctionOverloadsSet
makeFunctionOverloadsSet(
Corpus const& corpus,
Scope const& scope,
std::function<bool(FunctionInfo const&)> filter);
AccessSpecifier access);

} // mrdox
} // clang
Expand Down
2 changes: 2 additions & 0 deletions include/mrdox/meta/Info.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,8 @@ struct Info
// generated file will be saved
llvm::SmallString<128> Path;

llvm::SmallString<128> mangledName;

//--------------------------------------------

virtual ~Info() = default;
Expand Down
14 changes: 12 additions & 2 deletions include/mrdox/meta/Scope.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@
#ifndef MRDOX_META_SCOPE_HPP
#define MRDOX_META_SCOPE_HPP

#include <mrdox/meta/Enum.hpp>
#include <mrdox/meta/Reference.hpp>
#include <mrdox/meta/Typedef.hpp>
#include <mrdox/meta/Enum.hpp>
#include <vector>

namespace clang {
Expand All @@ -23,6 +24,8 @@ namespace mrdox {
*/
struct Scope
{
bool isNamespaceScope = true;

// Namespaces and Records are references because they will be properly
// documented in their own info, while the entirety of Functions and Enums are
// included here because they should not have separate documentation from
Expand All @@ -33,8 +36,15 @@ struct Scope
std::vector<Reference> Namespaces;
std::vector<Reference> Records;
std::vector<Reference> Functions;
std::vector<EnumInfo> Enums;
std::vector<TypedefInfo> Typedefs;
std::vector<EnumInfo> Enums;

explicit
Scope(
bool isNamespaceScope_) noexcept
: isNamespaceScope(isNamespaceScope_)
{
}
};

} // mrdox
Expand Down
90 changes: 90 additions & 0 deletions source/lib/Corpus.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,96 @@ exists(SymbolID const& id) const noexcept
return find<Info>(id) != nullptr;
}

//------------------------------------------------

void
Corpus::
visit(SymbolID id, Visitor& f) const
{
visit(get<Info>(id), f);
}

void
Corpus::
visit(Scope const& I, Visitor& f) const
{
for(auto const& ref : I.Namespaces)
visit(get<NamespaceInfo>(ref.USR), f);
for(auto const& ref : I.Records)
visit(get<RecordInfo>(ref.USR), f);
for(auto const& ref : I.Functions)
visit(get<FunctionInfo>(ref.USR), f);
for(auto const& J : I.Typedefs)
visit(J, f);
for(auto const& J : I.Enums)
visit(J, f);
}

void
Corpus::
visitWithOverloads(
Scope const& I, Visitor& f) const
{
for(auto const& ref : I.Namespaces)
visit(get<NamespaceInfo>(ref.USR), f);
for(auto const& ref : I.Records)
visit(get<RecordInfo>(ref.USR), f);
if(I.isNamespaceScope)
{
// VFALCO Should this be AS_public
auto const set = makeFunctionOverloadsSet(
*this, I, AccessSpecifier::AS_none);
for(auto const& functionOverloads : set.list)
f.visit(functionOverloads);
}
else
{
{
auto const& set = makeFunctionOverloadsSet(
*this, I, AccessSpecifier::AS_public);
for(auto const& functionOverloads : set.list)
f.visit(functionOverloads);
}
{
auto const& set = makeFunctionOverloadsSet(
*this, I, AccessSpecifier::AS_protected);
for(auto const& functionOverloads : set.list)
f.visit(functionOverloads);
}
{
auto const& set = makeFunctionOverloadsSet(
*this, I, AccessSpecifier::AS_private);
for(auto const& functionOverloads : set.list)
f.visit(functionOverloads);
}
}
for(auto const& J : I.Typedefs)
visit(J, f);
for(auto const& J : I.Enums)
visit(J, f);
}

void
Corpus::
visit(Info const& I, Visitor& f) const
{
switch(I.IT)
{
case InfoType::IT_namespace:
return f.visit(static_cast<NamespaceInfo const&>(I));
case InfoType::IT_record:
return f.visit(static_cast<RecordInfo const&>(I));
case InfoType::IT_function:
return f.visit(static_cast<FunctionInfo const&>(I));
case InfoType::IT_typedef:
return f.visit(static_cast<TypedefInfo const&>(I));
case InfoType::IT_enum:
return f.visit(static_cast<EnumInfo const&>(I));
default:
llvm_unreachable("wrong InfoType for viist");
}
}

//------------------------------------------------
//
// Modifiers
Expand Down
7 changes: 0 additions & 7 deletions source/lib/ast/FrontendAction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,6 @@
#include <llvm/Support/Error.h>
#include <llvm/Support/Path.h>

#if 0
#include <mrdox/MetadataFwd.hpp>
#include <clang/AST/ASTConsumer.h>
#include <utility>
#include <unordered_map>
#endif

//
// This file implements the Mapper piece of the clang-doc tool. It implements
// a RecursiveASTVisitor to look at each declaration and populate the info
Expand Down
Loading

0 comments on commit cea7b46

Please sign in to comment.