Skip to content

Commit 9141ad1

Browse files
committed
feat: symbol name lookup
1 parent 2d3aa0b commit 9141ad1

27 files changed

+2509
-353
lines changed

include/mrdocs/Metadata/Info.hpp

+17-31
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@
1313
#define MRDOCS_API_METADATA_INFO_HPP
1414

1515
#include <mrdocs/Platform.hpp>
16+
#include <mrdocs/Dom.hpp>
1617
#include <mrdocs/Metadata/Javadoc.hpp>
1718
#include <mrdocs/Metadata/Specifiers.hpp>
1819
#include <mrdocs/Metadata/Symbols.hpp>
19-
#include <mrdocs/Dom.hpp>
20-
#include <mrdocs/Support/TypeTraits.hpp>
20+
#include <mrdocs/Support/Visitor.hpp>
2121
#include <array>
2222
#include <memory>
2323
#include <string>
@@ -174,50 +174,36 @@ struct IsInfo : Info
174174
*/
175175
template<
176176
class InfoTy,
177-
class F,
177+
class Fn,
178178
class... Args>
179179
requires std::derived_from<InfoTy, Info>
180180
decltype(auto)
181181
visit(
182-
InfoTy& I,
183-
F&& f,
182+
InfoTy& info,
183+
Fn&& fn,
184184
Args&&... args)
185185
{
186-
add_cv_from_t<InfoTy, Info>& II = I;
187-
switch(I.Kind)
186+
auto visitor = makeVisitor<Info>(
187+
info, std::forward<Fn>(fn),
188+
std::forward<Args>(args)...);
189+
switch(info.Kind)
188190
{
189191
case InfoKind::Namespace:
190-
return f(static_cast<add_cv_from_t<
191-
InfoTy, NamespaceInfo>&>(II),
192-
std::forward<Args>(args)...);
192+
return visitor.template visit<NamespaceInfo>();
193193
case InfoKind::Record:
194-
return f(static_cast<add_cv_from_t<
195-
InfoTy, RecordInfo>&>(II),
196-
std::forward<Args>(args)...);
194+
return visitor.template visit<RecordInfo>();
197195
case InfoKind::Function:
198-
return f(static_cast<add_cv_from_t<
199-
InfoTy, FunctionInfo>&>(II),
200-
std::forward<Args>(args)...);
196+
return visitor.template visit<FunctionInfo>();
201197
case InfoKind::Enum:
202-
return f(static_cast<add_cv_from_t<
203-
InfoTy, EnumInfo>&>(II),
204-
std::forward<Args>(args)...);
198+
return visitor.template visit<EnumInfo>();
205199
case InfoKind::Typedef:
206-
return f(static_cast<add_cv_from_t<
207-
InfoTy, TypedefInfo>&>(II),
208-
std::forward<Args>(args)...);
200+
return visitor.template visit<TypedefInfo>();
209201
case InfoKind::Variable:
210-
return f(static_cast<add_cv_from_t<
211-
InfoTy, VariableInfo>&>(II),
212-
std::forward<Args>(args)...);
202+
return visitor.template visit<VariableInfo>();
213203
case InfoKind::Field:
214-
return f(static_cast<add_cv_from_t<
215-
InfoTy, FieldInfo>&>(II),
216-
std::forward<Args>(args)...);
204+
return visitor.template visit<FieldInfo>();
217205
case InfoKind::Specialization:
218-
return f(static_cast<add_cv_from_t<
219-
InfoTy, SpecializationInfo>&>(II),
220-
std::forward<Args>(args)...);
206+
return visitor.template visit<SpecializationInfo>();
221207
default:
222208
MRDOCS_UNREACHABLE();
223209
}

include/mrdocs/Metadata/Javadoc.hpp

+117-36
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,9 @@
1515

1616
#include <mrdocs/Platform.hpp>
1717
#include <mrdocs/Dom.hpp>
18+
#include <mrdocs/Metadata/Symbols.hpp>
1819
#include <mrdocs/Support/Error.hpp>
20+
#include <mrdocs/Support/Visitor.hpp>
1921
#include <memory>
2022
#include <string>
2123
#include <type_traits>
@@ -55,6 +57,8 @@ enum class Kind
5557
returns,
5658
styled,
5759
tparam,
60+
reference,
61+
copied
5862
};
5963

6064
/** A text style.
@@ -81,14 +85,27 @@ enum class Admonish
8185

8286
/** Parameter pass direction.
8387
*/
84-
enum class ParamDirection : int
88+
enum class ParamDirection
8589
{
8690
none,
8791
in,
8892
out,
8993
inout
9094
};
9195

96+
/** Which parts of the documentation to copy.
97+
98+
@li `all`: copy the brief and the description.
99+
@li `brief`: only copy the brief.
100+
@li `description`: only copy the description.
101+
*/
102+
enum class Parts
103+
{
104+
all = 1, // needed by bitstream
105+
brief,
106+
description
107+
};
108+
92109
//--------------------------------------------
93110

94111
/** This is a variant-like list element.
@@ -208,6 +225,61 @@ struct Link : Text
208225
}
209226
};
210227

228+
/** A reference to a symbol.
229+
*/
230+
struct Reference : Text
231+
{
232+
SymbolID id = SymbolID::zero;
233+
234+
static constexpr Kind static_kind = Kind::reference;
235+
236+
explicit
237+
Reference(
238+
String string_ = String()) noexcept
239+
: Text(std::move(string_), Kind::reference)
240+
{
241+
}
242+
243+
bool operator==(const Reference&) const noexcept = default;
244+
bool equals(const Node& other) const noexcept override
245+
{
246+
return kind == other.kind &&
247+
*this == static_cast<const Reference&>(other);
248+
}
249+
250+
protected:
251+
Reference(
252+
String string_,
253+
Kind kind_) noexcept
254+
: Text(std::move(string_), kind_)
255+
{
256+
}
257+
};
258+
259+
/** Documentation copied from another symbol.
260+
*/
261+
struct Copied : Reference
262+
{
263+
Parts parts;
264+
265+
static constexpr Kind static_kind = Kind::copied;
266+
267+
Copied(
268+
String string_ = String(),
269+
Parts parts_ = Parts::all) noexcept
270+
: Reference(std::move(string_), Kind::copied)
271+
, parts(parts_)
272+
{
273+
}
274+
275+
bool operator==(Copied const&) const noexcept = default;
276+
bool equals(Node const& other) const noexcept override
277+
{
278+
return kind == other.kind &&
279+
*this == static_cast<const Copied&>(other);
280+
}
281+
};
282+
211283
//------------------------------------------------
212284
//
213285
// Block nodes
@@ -247,9 +319,10 @@ struct MRDOCS_DECL
247319
}
248320

249321
template<std::derived_from<Text> T>
250-
void emplace_back(T&& text)
322+
T& emplace_back(T&& text)
251323
{
252-
emplace_back(std::make_unique<T>(std::move(text)));
324+
return static_cast<T&>(emplace_back(
325+
std::make_unique<T>(std::move(text))));
253326
}
254327

255328
void append(List<Node>&& blocks);
@@ -265,7 +338,7 @@ struct MRDOCS_DECL
265338
}
266339

267340
private:
268-
void emplace_back(std::unique_ptr<Text> text);
341+
Text& emplace_back(std::unique_ptr<Text> text);
269342
};
270343

271344
/** A manually specified section heading.
@@ -497,6 +570,10 @@ visit(
497570
return f.template operator()<Heading>(std::forward<Args>(args)...);
498571
case Kind::link:
499572
return f.template operator()<Link>(std::forward<Args>(args)...);
573+
case Kind::reference:
574+
return f.template operator()<Reference>(std::forward<Args>(args)...);
575+
case Kind::copied:
576+
return f.template operator()<Copied>(std::forward<Args>(args)...);
500577
case Kind::list_item:
501578
return f.template operator()<ListItem>(std::forward<Args>(args)...);
502579
case Kind::paragraph:
@@ -516,51 +593,50 @@ visit(
516593
}
517594
}
518595

519-
template<class F, class... Args>
520-
constexpr
521-
auto
596+
template<
597+
class NodeTy,
598+
class Fn,
599+
class... Args>
600+
requires std::derived_from<NodeTy, Node>
601+
decltype(auto)
522602
visit(
523-
Node const& node,
524-
F&& f, Args&&... args)
603+
NodeTy& node,
604+
Fn&& fn,
605+
Args&&... args)
525606
{
607+
auto visitor = makeVisitor<Node>(
608+
node, std::forward<Fn>(fn),
609+
std::forward<Args>(args)...);
526610
switch(node.kind)
527611
{
528612
case Kind::admonition:
529-
return f(static_cast<Admonition const&>(node),
530-
std::forward<Args>(args)...);
613+
return visitor.template visit<Admonition>();
531614
case Kind::brief:
532-
return f(static_cast<Brief const&>(node),
533-
std::forward<Args>(args)...);
615+
return visitor.template visit<Brief>();
534616
case Kind::code:
535-
return f(static_cast<Code const&>(node),
536-
std::forward<Args>(args)...);
617+
return visitor.template visit<Code>();
537618
case Kind::heading:
538-
return f(static_cast<Heading const&>(node),
539-
std::forward<Args>(args)...);
619+
return visitor.template visit<Heading>();
540620
case Kind::paragraph:
541-
return f(static_cast<Paragraph const&>(node),
542-
std::forward<Args>(args)...);
621+
return visitor.template visit<Paragraph>();
543622
case Kind::link:
544-
return f(static_cast<Link const&>(node),
545-
std::forward<Args>(args)...);
623+
return visitor.template visit<Link>();
624+
case Kind::reference:
625+
return visitor.template visit<Reference>();
626+
case Kind::copied:
627+
return visitor.template visit<Copied>();
546628
case Kind::list_item:
547-
return f(static_cast<ListItem const&>(node),
548-
std::forward<Args>(args)...);
629+
return visitor.template visit<ListItem>();
549630
case Kind::param:
550-
return f(static_cast<Param const&>(node),
551-
std::forward<Args>(args)...);
631+
return visitor.template visit<Param>();
552632
case Kind::returns:
553-
return f(static_cast<Returns const&>(node),
554-
std::forward<Args>(args)...);
633+
return visitor.template visit<Returns>();
555634
case Kind::styled:
556-
return f(static_cast<Styled const&>(node),
557-
std::forward<Args>(args)...);
635+
return visitor.template visit<Styled>();
558636
case Kind::text:
559-
return f(static_cast<Text const&>(node),
560-
std::forward<Args>(args)...);
637+
return visitor.template visit<Text>();
561638
case Kind::tparam:
562-
return f(static_cast<TParam const&>(node),
563-
std::forward<Args>(args)...);
639+
return visitor.template visit<TParam>();
564640
default:
565641
MRDOCS_UNREACHABLE();
566642
}
@@ -593,6 +669,8 @@ MRDOCS_DECL dom::String toString(Style style) noexcept;
593669

594670
//------------------------------------------------
595671

672+
class Corpus;
673+
596674
/** A processed Doxygen-style comment attached to a declaration.
597675
*/
598676
class MRDOCS_DECL
@@ -621,7 +699,10 @@ class MRDOCS_DECL
621699
/** Return the brief, or nullptr if there is none.
622700
*/
623701
doc::Paragraph const*
624-
brief() const noexcept;
702+
getBrief(Corpus const& corpus) const noexcept;
703+
704+
doc::List<doc::Block> const&
705+
getDescription(Corpus const& corpus) const noexcept;
625706

626707
/** Return the list of top level blocks.
627708
*/
@@ -665,7 +746,8 @@ class MRDOCS_DECL
665746
the returend overview is invalidated if the
666747
javadoc object is destroyed.
667748
*/
668-
doc::Overview makeOverview() const;
749+
doc::Overview
750+
makeOverview(const Corpus& corpus) const;
669751

670752
//--------------------------------------------
671753

@@ -692,7 +774,6 @@ class MRDOCS_DECL
692774
private:
693775
std::string emplace_back(std::unique_ptr<doc::Block>);
694776

695-
doc::Paragraph const* brief_ = nullptr;
696777
doc::List<doc::Block> blocks_;
697778
};
698779

0 commit comments

Comments
 (0)