Skip to content

Commit f372be6

Browse files
committed
refine briefs
1 parent f450458 commit f372be6

File tree

5 files changed

+64
-57
lines changed

5 files changed

+64
-57
lines changed

include/mrdox/meta/Javadoc.hpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,10 @@ struct Javadoc
259259
//---
260260

261261
Paragraph const*
262-
getBrief() const noexcept;
262+
getBrief() const noexcept
263+
{
264+
return brief_.get();
265+
}
263266

264267
List<Block> const&
265268
getBlocks() const noexcept
@@ -287,7 +290,7 @@ struct Javadoc
287290

288291
//---
289292

290-
Javadoc() noexcept;
293+
Javadoc() = default;
291294

292295
/** Constructor
293296
*/
@@ -324,12 +327,11 @@ struct Javadoc
324327
}
325328

326329
void merge(Javadoc& other);
330+
void calculateBrief();
327331

328332
//private:
329333
public: // VFALCO sigh...
330-
static Paragraph const s_empty_;
331-
332-
Paragraph const* brief_;
334+
std::shared_ptr<Paragraph const> brief_;
333335
List<Block> blocks_;
334336
List<Param> params_;
335337
List<TParam> tparams_;

include/mrdox/meta/List.hpp

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <algorithm>
1717
#include <cstdint>
1818
#include <iterator>
19+
#include <memory>
1920
#include <typeinfo>
2021
#include <utility>
2122

@@ -161,8 +162,9 @@ class List : public ListBase
161162
std::strong_ordering
162163
operator<=>(List const& other) const noexcept;
163164

164-
template<class Pred>
165-
bool erase_first_of_if(Pred&& pred) noexcept;
165+
template<class U = T, class Pred>
166+
std::shared_ptr<U const>
167+
extract_first_of(Pred&& pred) noexcept;
166168

167169
template<class U>
168170
U& emplace_back(U&& u);
@@ -271,7 +273,7 @@ class List<T>::iterator_impl
271273

272274
pointer operator->() const noexcept
273275
{
274-
return reinterpret_cast<T const*>(it_->get());
276+
return reinterpret_cast<pointer>(it_->get());
275277
}
276278

277279
reference operator*() const noexcept
@@ -524,40 +526,42 @@ operator<=>(
524526
}
525527

526528
template<class T>
527-
template<class Pred>
528-
bool
529+
template<class U, class Pred>
530+
std::shared_ptr<U const>
529531
List<T>::
530-
erase_first_of_if(
532+
extract_first_of(
531533
Pred&& pred) noexcept
532534
{
533535
if(empty())
534-
return false;
535-
if(pred(*(reinterpret_cast<
536-
T const*>(head_->get()))))
536+
return nullptr;
537+
if(pred(*reinterpret_cast<pointer>(head_->get())))
537538
{
539+
auto result = std::make_shared<U>(std::move(
540+
*reinterpret_cast<U*>(head_->get())));
538541
head_ = head_->next;
539542
if(head_ == &end_)
540543
tail_ = &end_;
541544
--size_;
542-
return true;
545+
return result;
543546
}
544547
auto prev = head_;
545548
auto it = head_->next;
546549
while(it != &end_)
547550
{
548-
if(pred(*reinterpret_cast<
549-
T const*>(it->get())))
551+
if(pred(*reinterpret_cast<pointer>(it->get())))
550552
{
553+
auto result = std::make_shared<U>(std::move(
554+
*reinterpret_cast<U*>(it->get())));
551555
prev->next = it->next;
552556
if(it == tail_)
553557
tail_ = prev;
554558
--size_;
555-
return true;
559+
return result;
556560
}
557561
prev = it;
558562
it = it->next;
559563
}
560-
return false;
564+
return nullptr;
561565
}
562566

563567
template<class T>

source/lib/Corpus.cpp

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -309,18 +309,21 @@ insert(std::unique_ptr<Info> Ip)
309309
{
310310
assert(! isCanonical_);
311311

312-
auto const& I = *Ip;
312+
auto& I = *Ip;
313313

314+
// Clean up the javadoc
315+
I.javadoc.calculateBrief();
316+
317+
// Add a reference to this Info in the Index
318+
insertIntoIndex(I);
319+
320+
// This has to come last because we move Ip.
314321
// Store the Info in the result map
315322
{
316323
std::lock_guard<llvm::sys::Mutex> Guard(infoMutex);
317324
InfoMap[llvm::toStringRef(I.USR)] = std::move(Ip);
318325
}
319-
320-
// Add a reference to this Info in the Index
321-
insertIntoIndex(I);
322-
323-
// Visit children
326+
// CANNOT touch I or Ip here!
324327
}
325328

326329
// A function to add a reference to Info in Idx.

source/lib/format/XML.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -222,7 +222,6 @@ Writer::
222222
writeNamespace(
223223
NamespaceInfo const& I)
224224
{
225-
writeInfo(I);
226225
}
227226

228227
void
@@ -462,7 +461,7 @@ XMLGenerator::
462461
Writer::
463462
writeJavadoc(Javadoc const& jd)
464463
{
465-
openTag("javadoc");
464+
openTag("doc");
466465
adjustNesting(1);
467466
if(auto brief = jd.getBrief())
468467
writeBrief(*brief);
@@ -471,7 +470,7 @@ writeJavadoc(Javadoc const& jd)
471470
writeNodes(jd.getParams());
472471
writeNodes(jd.getTParams());
473472
adjustNesting(-1);
474-
closeTag("javadoc");
473+
closeTag("doc");
475474
}
476475

477476
template<class T>
@@ -546,7 +545,7 @@ writeText(
546545
"<text";
547546
writeAttrs({
548547
{ "class", tag, ! tag.empty() } });
549-
os_ << '>' << text.text << "&#13" << "</text>\n";
548+
os_ << '>' << text.text << "</text>\n";
550549
}
551550

552551
void
@@ -582,7 +581,9 @@ writeParagraph(
582581
{
583582
openTag("para", {
584583
{ "class", tag, ! tag.empty() }});
584+
adjustNesting(1);
585585
writeNodes(para.list);
586+
adjustNesting(-1);
586587
closeTag("para");
587588
}
588589

source/lib/meta/Javadoc.cpp

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -38,46 +38,19 @@ static_assert(std::is_move_constructible_v<Javadoc::Code>);
3838

3939
//------------------------------------------------
4040

41-
Javadoc::Paragraph const Javadoc::s_empty_;
42-
43-
Javadoc::
44-
Javadoc() noexcept
45-
: brief_(&s_empty_)
46-
{
47-
}
48-
4941
Javadoc::
5042
Javadoc(
5143
List<Block> blocks,
5244
List<Param> params,
5345
List<TParam> tparams,
5446
Returns returns)
55-
: brief_(&s_empty_)
56-
, blocks_(std::move(blocks))
47+
: blocks_(std::move(blocks))
5748
, params_(std::move(params))
5849
, tparams_(std::move(tparams))
5950
, returns_(std::move(returns))
6051
{
6152
}
6253

63-
auto
64-
Javadoc::
65-
getBrief() const noexcept ->
66-
Paragraph const*
67-
{
68-
Paragraph const* first = nullptr;
69-
for(auto const& block : blocks_)
70-
{
71-
if(block.kind == Kind::brief)
72-
return static_cast<Paragraph const*>(&block);
73-
if( block.kind == Kind::paragraph && ! first)
74-
first = static_cast<Paragraph const*>(&block);
75-
}
76-
if(first == nullptr)
77-
first = &s_empty_;
78-
return first;
79-
}
80-
8154
void
8255
Javadoc::
8356
merge(Javadoc& other)
@@ -89,6 +62,30 @@ merge(Javadoc& other)
8962
returns_ = std::move(other.returns_);
9063
}
9164

65+
void
66+
Javadoc::
67+
calculateBrief()
68+
{
69+
Paragraph* brief = nullptr;
70+
for(auto& block : blocks_)
71+
{
72+
if(block.kind == Kind::brief)
73+
{
74+
brief = static_cast<Paragraph*>(&block);
75+
break;
76+
}
77+
if(block.kind == Kind::paragraph && ! brief)
78+
brief = static_cast<Paragraph*>(&block);
79+
}
80+
if(brief != nullptr)
81+
{
82+
brief_ = blocks_.extract_first_of<Paragraph>(
83+
[this, brief](Block& block)
84+
{
85+
return brief == &block;
86+
});
87+
}
88+
}
9289

9390
} // mrdox
9491
} // clang

0 commit comments

Comments
 (0)