Skip to content

Commit 5780eca

Browse files
committed
Visitor can be aborted
1 parent 3139781 commit 5780eca

File tree

6 files changed

+173
-57
lines changed

6 files changed

+173
-57
lines changed

include/mrdox/Corpus.hpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -86,21 +86,21 @@ class Corpus
8686
struct Visitor
8787
{
8888
virtual ~Visitor() = default;
89-
virtual void visit(NamespaceInfo const&) {}
90-
virtual void visit(RecordInfo const&) {}
91-
virtual void visit(Overloads const&) {}
92-
virtual void visit(FunctionInfo const&) {}
93-
virtual void visit(EnumInfo const&) {}
94-
virtual void visit(TypedefInfo const&) {}
89+
virtual bool visit(NamespaceInfo const&);
90+
virtual bool visit(RecordInfo const&);
91+
virtual bool visit(Overloads const&);
92+
virtual bool visit(FunctionInfo const&);
93+
virtual bool visit(EnumInfo const&);
94+
virtual bool visit(TypedefInfo const&);
9595
};
9696

9797
/** Visit the specified symbol ID or node.
9898
*/
9999
/** @{ */
100-
void visit(SymbolID id, Visitor& f) const;
101-
void visit(Scope const& I, Visitor& f) const;
102-
void visitWithOverloads(Scope const& I, Visitor& f) const;
103-
void visit(Info const& I, Visitor& f) const;
100+
[[nodiscard]] bool visit(SymbolID id, Visitor& f) const;
101+
[[nodiscard]] bool visit(Scope const& I, Visitor& f) const;
102+
[[nodiscard]] bool visitWithOverloads(Scope const& I, Visitor& f) const;
103+
[[nodiscard]] bool visit(Info const& I, Visitor& f) const;
104104
/** @} */
105105

106106
//--------------------------------------------

source/lib/Corpus.cpp

Lines changed: 89 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -68,74 +68,145 @@ globalNamespace() const noexcept
6868

6969
//------------------------------------------------
7070

71-
void
71+
bool
72+
Corpus::
73+
Visitor::
74+
visit(
75+
NamespaceInfo const&)
76+
{
77+
return true;
78+
}
79+
80+
bool
81+
Corpus::
82+
Visitor::
83+
visit(
84+
RecordInfo const&)
85+
{
86+
return true;
87+
}
88+
89+
bool
90+
Corpus::
91+
Visitor::
92+
visit(
93+
Overloads const&)
94+
{
95+
return true;
96+
}
97+
98+
bool
99+
Corpus::
100+
Visitor::
101+
visit(
102+
FunctionInfo const&)
103+
{
104+
return true;
105+
}
106+
107+
bool
108+
Corpus::
109+
Visitor::
110+
visit(
111+
EnumInfo const&)
112+
{
113+
return true;
114+
}
115+
116+
bool
117+
Corpus::
118+
Visitor::
119+
visit(
120+
TypedefInfo const&)
121+
{
122+
return true;
123+
}
124+
125+
//------------------------------------------------
126+
127+
bool
72128
Corpus::
73129
visit(SymbolID id, Visitor& f) const
74130
{
75-
visit(get<Info>(id), f);
131+
return visit(get<Info>(id), f);
76132
}
77133

78-
void
134+
bool
79135
Corpus::
80136
visit(Scope const& I, Visitor& f) const
81137
{
82138
for(auto const& ref : I.Namespaces)
83-
visit(get<NamespaceInfo>(ref.id), f);
139+
if(! visit(get<NamespaceInfo>(ref.id), f))
140+
return false;
84141
for(auto const& ref : I.Records)
85-
visit(get<RecordInfo>(ref.id), f);
142+
if(! visit(get<RecordInfo>(ref.id), f))
143+
return false;
86144
for(auto const& ref : I.Functions)
87-
visit(get<FunctionInfo>(ref.id), f);
145+
if(! visit(get<FunctionInfo>(ref.id), f))
146+
return false;
88147
for(auto const& J : I.Typedefs)
89-
visit(J, f);
148+
if(! visit(J, f))
149+
return false;
90150
for(auto const& J : I.Enums)
91-
visit(J, f);
151+
if(! visit(J, f))
152+
return false;
153+
return true;
92154
}
93155

94-
void
156+
bool
95157
Corpus::
96158
visitWithOverloads(
97159
Scope const& I, Visitor& f) const
98160
{
99161
for(auto const& ref : I.Namespaces)
100-
visit(get<NamespaceInfo>(ref.id), f);
162+
if(! visit(get<NamespaceInfo>(ref.id), f))
163+
return false;
101164
for(auto const& ref : I.Records)
102-
visit(get<RecordInfo>(ref.id), f);
165+
if(! visit(get<RecordInfo>(ref.id), f))
166+
return false;
103167
if(I.isNamespaceScope)
104168
{
105169
// VFALCO Should this be AS_public
106170
auto const set = makeOverloadsSet(
107171
*this, I, AccessSpecifier::AS_none);
108172
for(auto const& functionOverloads : set.list)
109-
f.visit(functionOverloads);
173+
if(! f.visit(functionOverloads))
174+
return false;
110175
}
111176
else
112177
{
113178
{
114179
auto const& set = makeOverloadsSet(
115180
*this, I, AccessSpecifier::AS_public);
116181
for(auto const& functionOverloads : set.list)
117-
f.visit(functionOverloads);
182+
if(! f.visit(functionOverloads))
183+
return false;
118184
}
119185
{
120186
auto const& set = makeOverloadsSet(
121187
*this, I, AccessSpecifier::AS_protected);
122188
for(auto const& functionOverloads : set.list)
123-
f.visit(functionOverloads);
189+
if(! f.visit(functionOverloads))
190+
return false;
124191
}
125192
{
126193
auto const& set = makeOverloadsSet(
127194
*this, I, AccessSpecifier::AS_private);
128195
for(auto const& functionOverloads : set.list)
129-
f.visit(functionOverloads);
196+
if(! f.visit(functionOverloads))
197+
return false;
130198
}
131199
}
132200
for(auto const& J : I.Typedefs)
133-
visit(J, f);
201+
if(! visit(J, f))
202+
return false;
134203
for(auto const& J : I.Enums)
135-
visit(J, f);
204+
if(! visit(J, f))
205+
return false;
206+
return true;
136207
}
137208

138-
void
209+
bool
139210
Corpus::
140211
visit(Info const& I, Visitor& f) const
141212
{

source/lib/format/asciidoc/PagesBuilder.cpp

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,9 @@ PagesBuilder::
4141
scan()
4242
{
4343
// visit the children not the namespace
44-
corpus_.visitWithOverloads(corpus_.globalNamespace().Children, *this);
44+
if(! corpus_.visitWithOverloads(
45+
corpus_.globalNamespace().Children, *this))
46+
return;
4547

4648
llvm::sort(pages,
4749
[](Page& p0, Page& p1)
@@ -51,19 +53,21 @@ scan()
5153
});
5254
}
5355

54-
void
56+
bool
5557
PagesBuilder::
5658
visit(
5759
NamespaceInfo const& I)
5860
{
5961
namespace path = llvm::sys::path;
6062

6163
auto saved = filePrefix_;
62-
corpus_.visit(I.Children, *this);
64+
if(! corpus_.visit(I.Children, *this))
65+
return false;
6366
filePrefix_ = saved;
67+
return true;
6468
}
6569

66-
void
70+
bool
6771
PagesBuilder::
6872
visit(
6973
RecordInfo const& I)
@@ -78,12 +82,13 @@ visit(
7882

7983
auto saved = filePrefix_;
8084
path::append(filePrefix_, I.Name);
81-
corpus_.visitWithOverloads(I.Children, *this);
85+
if(! corpus_.visitWithOverloads(I.Children, *this))
86+
return false;
8287
filePrefix_ = saved;
83-
88+
return true;
8489
}
8590

86-
void
91+
bool
8792
PagesBuilder::
8893
visit(
8994
Overloads const& I)
@@ -94,16 +99,19 @@ visit(
9499
path::append(filePath, I.name);
95100
path::replace_extension(filePath, "adoc");
96101
pages.emplace_back(Page(filePath));
102+
103+
return true;
97104
}
98105

99-
void
106+
bool
100107
PagesBuilder::
101108
visit(
102109
FunctionInfo const& I)
103110
{
111+
return true;
104112
}
105113

106-
void
114+
bool
107115
PagesBuilder::
108116
visit(
109117
TypedefInfo const& I)
@@ -115,9 +123,11 @@ visit(
115123
path::append(filePath, toBaseFN(temp, I.id));
116124
path::replace_extension(filePath, "adoc");
117125
pages.emplace_back(std::move(filePath));
126+
127+
return true;
118128
}
119129

120-
void
130+
bool
121131
PagesBuilder::
122132
visit(
123133
EnumInfo const& I)
@@ -129,6 +139,8 @@ visit(
129139
path::append(filePath, toBaseFN(temp, I.id));
130140
path::replace_extension(filePath, "adoc");
131141
pages.emplace_back(std::move(filePath));
142+
143+
return true;
132144
}
133145

134146
} // mrdox

source/lib/format/asciidoc/PagesBuilder.hpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,12 @@ class PagesBuilder : Corpus::Visitor
4545

4646
void scan();
4747

48-
void visit(NamespaceInfo const&) override;
49-
void visit(RecordInfo const&) override;
50-
void visit(Overloads const&) override;
51-
void visit(FunctionInfo const&) override;
52-
void visit(TypedefInfo const&) override;
53-
void visit(EnumInfo const&) override;
48+
bool visit(NamespaceInfo const&) override;
49+
bool visit(RecordInfo const&) override;
50+
bool visit(Overloads const&) override;
51+
bool visit(FunctionInfo const&) override;
52+
bool visit(TypedefInfo const&) override;
53+
bool visit(EnumInfo const&) override;
5454

5555
private:
5656
llvm::SmallString<0> filePrefix_;

0 commit comments

Comments
 (0)