Skip to content

Commit

Permalink
sort-members option
Browse files Browse the repository at this point in the history
#feat
  • Loading branch information
alandefreitas committed Feb 3, 2025
1 parent 83458af commit 548c750
Show file tree
Hide file tree
Showing 133 changed files with 11,168 additions and 6,963 deletions.
60 changes: 60 additions & 0 deletions docs/mrdocs.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,66 @@
"title": "Detect and reduce SFINAE expressions",
"type": "boolean"
},
"sort-members": {
"default": true,
"description": "When set to `true`, sort the members of a record or namespace by name and parameters. When set to `false`, the members are included in the declaration order they are extracted.",
"enum": [
true,
false
],
"title": "Sort the members of a record or namespace",
"type": "boolean"
},
"sort-members-assignment-1st": {
"default": true,
"description": "When set to `true`, assignment operators are sorted first in the list of members of a record.",
"enum": [
true,
false
],
"title": "Sort assignment operators first",
"type": "boolean"
},
"sort-members-conversion-last": {
"default": true,
"description": "When set to `true`, conversion operators are sorted last in the list of members of a record or namespace.",
"enum": [
true,
false
],
"title": "Sort conversion operators last",
"type": "boolean"
},
"sort-members-ctors-1st": {
"default": true,
"description": "When set to `true`, constructors are sorted first in the list of members of a record.",
"enum": [
true,
false
],
"title": "Sort constructors first",
"type": "boolean"
},
"sort-members-dtors-1st": {
"default": true,
"description": "When set to `true`, destructors are sorted first in the list of members of a record.",
"enum": [
true,
false
],
"title": "Sort destructors first",
"type": "boolean"
},
"sort-members-relational-last": {
"default": true,
"description": "When set to `true`, relational operators are sorted last in the list of members of a record or namespace.",
"enum": [
true,
false
],
"title": "Sort relational operators last",
"type": "boolean"
},
"source-root": {
"default": "<config-dir>",
"description": "Path to the root directory of the source code. This path is used as a default for input files and a base for relative paths formed from absolute paths. This should typically be the root directory of the git project, as relative paths formed from it can be used to create links to these source files in the repository. Templates use the `base-url` option to create links to the source code.",
Expand Down
33 changes: 33 additions & 0 deletions include/mrdocs/ADT/Polymorphic.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -876,6 +876,39 @@ CompareDerived(
: std::strong_ordering::greater;
}

/// @copydoc CompareDerived
template <class Base>
requires detail::CanVisitCompare<Base>
auto
CompareDerived(Base const& lhs, Base const& rhs)
{
if (lhs.Kind == rhs.Kind)
{
return visit(lhs, detail::VisitCompareFn<Base>(rhs));
}
return lhs.Kind <=> rhs.Kind;
}

template <class Base>
requires detail::CanVisitCompare<Base>
auto
operator<=>(
Polymorphic<Base> const& lhs,
Polymorphic<Base> const& rhs)
{
return CompareDerived(lhs, rhs);
}

template <class Base>
requires detail::CanVisitCompare<Base>
bool
operator==(
Polymorphic<Base> const& lhs,
Polymorphic<Base> const& rhs)
{
return lhs <=> rhs == std::strong_ordering::equal;
}

} // clang::mrdocs

#endif
23 changes: 14 additions & 9 deletions include/mrdocs/Corpus.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ class MRDOCS_VISIBLE
*/
template <range_of<SymbolID> R, class F, class... Args>
void
traverseIDs(R&& range, F&& f, Args&&... args) const
visitIDs(R&& range, F&& f, Args&&... args) const
{
for (SymbolID const& id : range)
{
Expand Down Expand Up @@ -200,7 +200,7 @@ class MRDOCS_VISIBLE
if (!opts.skipInherited)
{
auto MS = allMembers(I);
traverseIDs(MS,
visitIDs(MS,
std::forward<F>(f),
std::forward<Args>(args)...);
for (SymbolID const& id : MS)
Expand All @@ -210,7 +210,7 @@ class MRDOCS_VISIBLE
traverse(opts, *MI, std::forward<F>(f), std::forward<Args>(args)...);
}
}
else
else /* skipInherited */
{
auto nonInherited =
allMembers(I) |
Expand All @@ -219,7 +219,7 @@ class MRDOCS_VISIBLE
MRDOCS_CHECK_OR(MI, false);
return MI->Parent == I.id;
});
traverseIDs(nonInherited,
visitIDs(nonInherited,
std::forward<F>(f),
std::forward<Args>(args)...);
if (opts.recursive)
Expand All @@ -233,7 +233,7 @@ class MRDOCS_VISIBLE
}
}
}
else
else /* ordered */
{
auto members0 = allMembers(I);
static_assert(range_of<decltype(members0), SymbolID>);
Expand All @@ -245,11 +245,16 @@ class MRDOCS_VISIBLE
{
auto const& lhsInfo = get(lhs);
auto const& rhsInfo = get(rhs);
return lhsInfo < rhsInfo;
if (auto const cmp = lhsInfo.Name <=> rhsInfo.Name;
!std::is_eq(cmp))
{
return std::is_lt(cmp);
}
return std::is_lt(CompareDerived(lhsInfo, rhsInfo));
});
if (!opts.skipInherited)
{
traverseIDs(members,
visitIDs(members,
std::forward<F>(f),
std::forward<Args>(args)...);
if (opts.recursive)
Expand All @@ -262,7 +267,7 @@ class MRDOCS_VISIBLE
}
}
}
else
else /* skipInherited */
{
auto nonInherited =
members |
Expand All @@ -271,7 +276,7 @@ class MRDOCS_VISIBLE
MRDOCS_CHECK_OR(MI, false);
return MI->Parent == I.id;
});
traverseIDs(nonInherited,
visitIDs(nonInherited,
std::forward<F>(f),
std::forward<Args>(args)...);
if (opts.recursive)
Expand Down
12 changes: 4 additions & 8 deletions include/mrdocs/Metadata/Info.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,8 @@ struct MRDOCS_VISIBLE Info

#define INFO(Type) constexpr bool is##Type() const noexcept { return Kind == InfoKind::Type; }
#include <mrdocs/Metadata/InfoNodesPascal.inc>

auto operator<=>(const Info&) const = default;
};

//------------------------------------------------
Expand All @@ -162,6 +164,8 @@ struct InfoCommonBase : Info
static constexpr bool is##Kind() noexcept { return K == InfoKind::Kind; }
#include <mrdocs/Metadata/InfoNodesPascal.inc>

auto operator<=>(const InfoCommonBase&) const = default;

protected:
constexpr explicit InfoCommonBase(SymbolID const& ID)
: Info(K, ID)
Expand Down Expand Up @@ -351,14 +355,6 @@ tag_invoke(
});
}

/** Compare two Info objects
*/
MRDOCS_DECL
bool
operator<(
Info const& lhs,
Info const& rhs) noexcept;

} // clang::mrdocs

#endif
4 changes: 4 additions & 0 deletions include/mrdocs/Metadata/Info/Concept.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include <mrdocs/Metadata/Expression.hpp>
#include <mrdocs/Metadata/Source.hpp>
#include <mrdocs/Metadata/Template.hpp>
#include <mrdocs/ADT/Polymorphic.hpp>

namespace clang::mrdocs {

Expand All @@ -37,6 +38,9 @@ struct ConceptInfo final
: InfoCommonBase(ID)
{
}

std::strong_ordering
operator<=>(ConceptInfo const& other) const;
};

MRDOCS_DECL
Expand Down
3 changes: 3 additions & 0 deletions include/mrdocs/Metadata/Info/Function.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,9 @@ struct FunctionInfo final
: InfoCommonBase(ID)
{
}

std::strong_ordering
operator<=>(const FunctionInfo& other) const;
};

MRDOCS_DECL
Expand Down
4 changes: 4 additions & 0 deletions include/mrdocs/Metadata/Info/Guide.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
#include <mrdocs/Metadata/Template.hpp>
#include <mrdocs/Metadata/Info/Function.hpp>
#include <mrdocs/Metadata/Type.hpp>
#include <mrdocs/ADT/Polymorphic.hpp>
#include <vector>

namespace clang::mrdocs {
Expand Down Expand Up @@ -49,6 +50,9 @@ struct GuideInfo final
explicit GuideInfo(SymbolID ID) noexcept
: InfoCommonBase(ID)
{}

std::strong_ordering
operator<=>(GuideInfo const& other) const;
};

MRDOCS_DECL
Expand Down
4 changes: 4 additions & 0 deletions include/mrdocs/Metadata/Info/Namespace.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,8 @@ struct NamespaceTranche {
std::vector<SymbolID> Concepts;
std::vector<SymbolID> Guides;
std::vector<SymbolID> Usings;

auto operator<=>(NamespaceTranche const&) const = default;
};

MRDOCS_DECL
Expand Down Expand Up @@ -118,6 +120,8 @@ struct NamespaceInfo final
: InfoCommonBase(ID)
{
}

auto operator<=>(NamespaceInfo const&) const = default;
};

MRDOCS_DECL
Expand Down
6 changes: 4 additions & 2 deletions include/mrdocs/Metadata/Info/Record.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,17 +12,16 @@
#ifndef MRDOCS_API_METADATA_RECORD_HPP
#define MRDOCS_API_METADATA_RECORD_HPP

#include <mrdocs/ADT/Polymorphic.hpp>
#include <mrdocs/Metadata/Type.hpp>
#include <mrdocs/Metadata/Info.hpp>
#include <mrdocs/Metadata/Source.hpp>
#include <mrdocs/Metadata/Template.hpp>
#include <mrdocs/Dom.hpp>
#include <mrdocs/Dom/LazyObject.hpp>
#include <mrdocs/Dom/LazyArray.hpp>
#include <mrdocs/ADT/Polymorphic.hpp>
#include <vector>
#include <ranges>
#include <string_view>

namespace clang::mrdocs {

Expand Down Expand Up @@ -300,6 +299,9 @@ struct RecordInfo final
: InfoCommonBase(ID)
{
}

std::strong_ordering
operator<=>(const RecordInfo& other) const;
};

constexpr
Expand Down
6 changes: 6 additions & 0 deletions include/mrdocs/Metadata/Info/Typedef.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@
#include <mrdocs/Metadata/Info.hpp>
#include <mrdocs/Metadata/Template.hpp>
#include <mrdocs/Metadata/Type.hpp>
#include <mrdocs/Metadata/Name.hpp>
#include <mrdocs/ADT/Polymorphic.hpp>

namespace clang::mrdocs {

Expand Down Expand Up @@ -47,6 +49,10 @@ struct TypedefInfo final
: InfoCommonBase(ID)
{
}

std::strong_ordering
operator<=>(TypedefInfo const& other) const;

};

MRDOCS_DECL
Expand Down
4 changes: 4 additions & 0 deletions include/mrdocs/Metadata/Info/Variable.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <mrdocs/Metadata/Info.hpp>
#include <mrdocs/Metadata/Type.hpp>
#include <mrdocs/Dom/LazyArray.hpp>
#include <mrdocs/ADT/Polymorphic.hpp>

namespace clang::mrdocs {

Expand Down Expand Up @@ -54,6 +55,9 @@ struct VariableInfo final
: InfoCommonBase(ID)
{
}

std::strong_ordering
operator<=>(VariableInfo const& other) const;
};

MRDOCS_DECL
Expand Down
Loading

0 comments on commit 548c750

Please sign in to comment.