Skip to content

Commit b216c89

Browse files
committed
adoc work
1 parent a505a3d commit b216c89

File tree

2 files changed

+240
-62
lines changed

2 files changed

+240
-62
lines changed

source/lib/Asciidoc.cpp

Lines changed: 205 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@
1414
namespace clang {
1515
namespace mrdox {
1616

17-
namespace {
18-
1917
//------------------------------------------------
2018
//
2119
// AsciidocGenerator
@@ -101,7 +99,8 @@ buildOne(
10199
}
102100

103101
Writer w(corpus, config, R);
104-
return w.buildOne(os);
102+
w.writeOne(os);
103+
return ! os.has_error();
105104
}
106105

107106
bool
@@ -115,75 +114,238 @@ buildString(
115114
dest.clear();
116115
llvm::raw_string_ostream os(dest);
117116
Writer w(corpus, config, R);
118-
return w.buildOne(os);
117+
w.writeOne(os);
118+
return true;
119119
}
120120

121+
//------------------------------------------------
122+
//
123+
// Writer
124+
//
121125
//------------------------------------------------
122126

123-
#if 0
124-
llvm::Error
127+
void
128+
AsciidocGenerator::
129+
Writer::
130+
write(
131+
llvm::StringRef rootDir)
132+
{
133+
}
134+
135+
void
136+
AsciidocGenerator::
137+
Writer::
138+
writeOne(
139+
llvm::raw_ostream& os)
140+
{
141+
os_ = &os;
142+
openSection("Reference");
143+
writeAllSymbols();
144+
closeSection();
145+
}
146+
147+
//------------------------------------------------
148+
149+
void
125150
AsciidocGenerator::
126-
generateDocForInfo(
127-
Info* I,
128-
llvm::raw_ostream& os,
129-
const Config& config)
151+
Writer::
152+
writeAllSymbols()
130153
{
131-
switch (I->IT)
154+
for(auto const& id : corpus_.allSymbols)
132155
{
133-
case InfoType::IT_namespace:
134-
makeNamespacePage(config, *static_cast<clang::mrdox::NamespaceInfo*>(I), os);
135-
break;
136-
case InfoType::IT_record:
137-
genMarkdown(config, *static_cast<clang::mrdox::RecordInfo*>(I), os);
138-
break;
139-
case InfoType::IT_enum:
140-
genMarkdown(config, *static_cast<clang::mrdox::EnumInfo*>(I), os);
141-
break;
142-
case InfoType::IT_function:
143-
genMarkdown(config, *static_cast<clang::mrdox::FunctionInfo*>(I), os);
144-
break;
145-
case InfoType::IT_typedef:
146-
genMarkdown(config, *static_cast<clang::mrdox::TypedefInfo*>(I), os);
147-
break;
148-
case InfoType::IT_default:
149-
return llvm::createStringError(llvm::inconvertibleErrorCode(),
150-
"unexpected InfoType");
156+
auto const& I = corpus_.at(id);
157+
switch(I.IT)
158+
{
159+
case InfoType::IT_function:
160+
write(static_cast<FunctionInfo const&>(I));
161+
break;
162+
default:
163+
break;
164+
}
151165
}
152-
return llvm::Error::success();
153166
}
154-
#endif
155167

156168
//------------------------------------------------
157-
//
158-
// Writer
159-
//
169+
170+
struct AsciidocGenerator::Writer::
171+
FormalParam
172+
{
173+
FieldTypeInfo const& I;
174+
Writer& w;
175+
176+
friend
177+
llvm::raw_ostream&
178+
operator<<(
179+
llvm::raw_ostream& os,
180+
FormalParam const& t)
181+
{
182+
t.w.write(t, os);
183+
return os;
184+
}
185+
};
186+
187+
struct AsciidocGenerator::Writer::
188+
TypeName
189+
{
190+
TypeInfo const& I;
191+
Writer& w;
192+
193+
friend
194+
llvm::raw_ostream&
195+
operator<<(
196+
llvm::raw_ostream& os,
197+
TypeName const& t)
198+
{
199+
t.w.write(t, os);
200+
return os;
201+
}
202+
};
203+
160204
//------------------------------------------------
161205

162-
bool
206+
void
207+
AsciidocGenerator::
163208
Writer::
164-
build(
165-
llvm::StringRef rootDir)
209+
write(
210+
FunctionInfo const& I)
166211
{
167-
return true;
212+
openSection(I.Name);
213+
*os_ << I.javadoc.brief << "\n\n";
214+
215+
openSection("Synopsis");
216+
*os_ <<
217+
"Located in <" <<
218+
I.Loc[0].Filename << ">\n" <<
219+
"[,cpp]\n"
220+
"----\n";
221+
222+
// params
223+
if(! I.Params.empty())
224+
{
225+
*os_ <<
226+
typeName(I.ReturnType) << '\n' <<
227+
I.Name << "(\n"
228+
" " << formalParam(I.Params[0]);
229+
for(std::size_t i = 1; i < I.Params.size(); ++i)
230+
{
231+
*os_ << ",\n"
232+
" " << formalParam(I.Params[i]);
233+
}
234+
*os_ << ");\n";
235+
}
236+
else
237+
{
238+
*os_ << I.Name << "();" << "\n";
239+
}
240+
241+
*os_ <<
242+
"----\n";
243+
closeSection();
244+
245+
if(! I.javadoc.desc.empty())
246+
{
247+
*os_ << "\n";
248+
openSection("Description");
249+
*os_ << I.javadoc.desc << "\n";
250+
closeSection();
251+
}
252+
253+
closeSection();
168254
}
169255

170-
bool
256+
//------------------------------------------------
257+
258+
void
259+
AsciidocGenerator::
171260
Writer::
172-
buildOne(
261+
write(
262+
FormalParam const& t,
173263
llvm::raw_ostream& os)
174264
{
175-
return true;
265+
assert(&os == os_);
266+
auto const& I = t.I;
267+
*os_ << I.Type.Name << ' ' << I.Name;
268+
}
269+
270+
auto
271+
AsciidocGenerator::
272+
Writer::
273+
formalParam(
274+
FieldTypeInfo const& t) ->
275+
FormalParam
276+
{
277+
return FormalParam{ t, *this };
278+
}
279+
280+
//------------------------------------------------
281+
282+
void
283+
AsciidocGenerator::
284+
Writer::
285+
write(
286+
TypeName const& t,
287+
llvm::raw_ostream& os)
288+
{
289+
assert(&os == os_);
290+
if(t.I.Type.USR == EmptySID)
291+
{
292+
*os_ << t.I.Type.Name;
293+
return;
294+
}
295+
auto const& I = corpus_.get<RecordInfo>(t.I.Type.USR);
296+
// VFALCO add namespace qualifiers if I is in
297+
// a different namesapce
298+
*os_ << I.Name;
299+
}
300+
301+
auto
302+
AsciidocGenerator::
303+
Writer::
304+
typeName(
305+
TypeInfo const& t) ->
306+
TypeName
307+
{
308+
return TypeName{ t, *this };
309+
}
310+
311+
//------------------------------------------------
312+
313+
void
314+
AsciidocGenerator::
315+
Writer::
316+
openSection(
317+
llvm::StringRef name)
318+
{
319+
sect_.level++;
320+
if(sect_.level <= 6)
321+
sect_.markup.push_back('=');
322+
*os_ << sect_.markup << ' ' << name << "\n\n";
323+
}
324+
325+
void
326+
AsciidocGenerator::
327+
Writer::
328+
closeSection()
329+
{
330+
assert(sect_.level > 0);
331+
if(sect_.level <= 6)
332+
sect_.markup.pop_back();
333+
sect_.level--;
176334
}
177335

336+
//------------------------------------------------
337+
//------------------------------------------------
178338
//------------------------------------------------
179339

340+
#if 0
341+
180342
//
181343
// Asciidoc generation
182344
//
183345

184346
std::string
185347
genEmphasis(
186-
Twine const& t)
348+
llvm::Twine const& t)
187349
{
188350
return "*" + t.str() + "*";
189351
}
@@ -853,7 +1015,7 @@ genIndex(
8531015
return llvm::Error::success();
8541016
}
8551017

856-
} // (anon)
1018+
#endif
8571019

8581020
//------------------------------------------------
8591021

source/lib/Asciidoc.hpp

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,12 @@
2626
namespace clang {
2727
namespace mrdox {
2828

29-
namespace {
30-
31-
struct AsciidocGenerator : Generator
29+
class AsciidocGenerator
30+
: public Generator
3231
{
32+
public:
33+
class Writer;
34+
3335
llvm::StringRef
3436
name() const noexcept override
3537
{
@@ -64,23 +66,12 @@ struct AsciidocGenerator : Generator
6466
Corpus const& corpus,
6567
Config const& config,
6668
Reporter& R) const override;
67-
68-
bool
69-
build(
70-
llvm::raw_ostream& os,
71-
Corpus const& corpus,
72-
Config const& config,
73-
Reporter& R) const;
7469
};
7570

7671
//------------------------------------------------
7772

78-
class Writer
73+
class AsciidocGenerator::Writer
7974
{
80-
Corpus const& corpus_;
81-
Config const& config_;
82-
Reporter& R_;
83-
8475
public:
8576
Writer(
8677
Corpus const& corpus,
@@ -92,12 +83,37 @@ class Writer
9283
{
9384
}
9485

95-
bool build(llvm::StringRef rootDir);
86+
void write(llvm::StringRef rootDir);
87+
void writeOne(llvm::raw_ostream& os);
9688

97-
bool buildOne(llvm::raw_ostream& os);
98-
};
89+
void writeAllSymbols();
90+
91+
void write(FunctionInfo const& I);
92+
93+
struct FormalParam;
94+
void write(FormalParam const& p, llvm::raw_ostream& os);
95+
FormalParam formalParam(FieldTypeInfo const& ft);
9996

100-
} // (anon)
97+
struct TypeName;
98+
void write(TypeName const& tn, llvm::raw_ostream& os);
99+
TypeName typeName(TypeInfo const& ti);
100+
101+
void openSection(llvm::StringRef name);
102+
void closeSection();
103+
104+
private:
105+
struct Section
106+
{
107+
int level = 0;
108+
std::string markup;
109+
};
110+
111+
Corpus const& corpus_;
112+
Config const& config_;
113+
Reporter& R_;
114+
llvm::raw_ostream* os_ = nullptr;
115+
Section sect_;
116+
};
101117

102118
} // mrdox
103119
} // clang

0 commit comments

Comments
 (0)