Skip to content

Commit 8fadd8d

Browse files
committed
[clangd] Improve Markup Rendering
1 parent a12744f commit 8fadd8d

File tree

7 files changed

+410
-256
lines changed

7 files changed

+410
-256
lines changed

clang-tools-extra/clangd/Hover.cpp

Lines changed: 13 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -960,42 +960,6 @@ std::optional<HoverInfo> getHoverContents(const Attr *A, ParsedAST &AST) {
960960
return HI;
961961
}
962962

963-
bool isParagraphBreak(llvm::StringRef Rest) {
964-
return Rest.ltrim(" \t").starts_with("\n");
965-
}
966-
967-
bool punctuationIndicatesLineBreak(llvm::StringRef Line) {
968-
constexpr llvm::StringLiteral Punctuation = R"txt(.:,;!?)txt";
969-
970-
Line = Line.rtrim();
971-
return !Line.empty() && Punctuation.contains(Line.back());
972-
}
973-
974-
bool isHardLineBreakIndicator(llvm::StringRef Rest) {
975-
// '-'/'*' md list, '@'/'\' documentation command, '>' md blockquote,
976-
// '#' headings, '`' code blocks
977-
constexpr llvm::StringLiteral LinebreakIndicators = R"txt(-*@\>#`)txt";
978-
979-
Rest = Rest.ltrim(" \t");
980-
if (Rest.empty())
981-
return false;
982-
983-
if (LinebreakIndicators.contains(Rest.front()))
984-
return true;
985-
986-
if (llvm::isDigit(Rest.front())) {
987-
llvm::StringRef AfterDigit = Rest.drop_while(llvm::isDigit);
988-
if (AfterDigit.starts_with(".") || AfterDigit.starts_with(")"))
989-
return true;
990-
}
991-
return false;
992-
}
993-
994-
bool isHardLineBreakAfter(llvm::StringRef Line, llvm::StringRef Rest) {
995-
// Should we also consider whether Line is short?
996-
return punctuationIndicatesLineBreak(Line) || isHardLineBreakIndicator(Rest);
997-
}
998-
999963
void addLayoutInfo(const NamedDecl &ND, HoverInfo &HI) {
1000964
if (ND.isInvalidDecl())
1001965
return;
@@ -1601,51 +1565,32 @@ std::optional<llvm::StringRef> getBacktickQuoteRange(llvm::StringRef Line,
16011565
return Line.slice(Offset, Next + 1);
16021566
}
16031567

1604-
void parseDocumentationLine(llvm::StringRef Line, markup::Paragraph &Out) {
1568+
void parseDocumentationParagraph(llvm::StringRef Text, markup::Paragraph &Out) {
16051569
// Probably this is appendText(Line), but scan for something interesting.
1606-
for (unsigned I = 0; I < Line.size(); ++I) {
1607-
switch (Line[I]) {
1570+
for (unsigned I = 0; I < Text.size(); ++I) {
1571+
switch (Text[I]) {
16081572
case '`':
1609-
if (auto Range = getBacktickQuoteRange(Line, I)) {
1610-
Out.appendText(Line.substr(0, I));
1573+
if (auto Range = getBacktickQuoteRange(Text, I)) {
1574+
Out.appendText(Text.substr(0, I));
16111575
Out.appendCode(Range->trim("`"), /*Preserve=*/true);
1612-
return parseDocumentationLine(Line.substr(I + Range->size()), Out);
1576+
return parseDocumentationParagraph(Text.substr(I + Range->size()), Out);
16131577
}
16141578
break;
16151579
}
16161580
}
1617-
Out.appendText(Line).appendSpace();
1581+
Out.appendText(Text);
16181582
}
16191583

16201584
void parseDocumentation(llvm::StringRef Input, markup::Document &Output) {
1621-
std::vector<llvm::StringRef> ParagraphLines;
1622-
auto FlushParagraph = [&] {
1623-
if (ParagraphLines.empty())
1624-
return;
1625-
auto &P = Output.addParagraph();
1626-
for (llvm::StringRef Line : ParagraphLines)
1627-
parseDocumentationLine(Line, P);
1628-
ParagraphLines.clear();
1629-
};
1585+
llvm::StringRef Paragraph, Rest;
1586+
for (std::tie(Paragraph, Rest) = Input.split("\n\n");
1587+
!(Paragraph.empty() && Rest.empty());
1588+
std::tie(Paragraph, Rest) = Rest.split("\n\n")) {
16301589

1631-
llvm::StringRef Line, Rest;
1632-
for (std::tie(Line, Rest) = Input.split('\n');
1633-
!(Line.empty() && Rest.empty());
1634-
std::tie(Line, Rest) = Rest.split('\n')) {
1635-
1636-
// After a linebreak remove spaces to avoid 4 space markdown code blocks.
1637-
// FIXME: make FlushParagraph handle this.
1638-
Line = Line.ltrim();
1639-
if (!Line.empty())
1640-
ParagraphLines.push_back(Line);
1641-
1642-
if (isParagraphBreak(Rest) || isHardLineBreakAfter(Line, Rest)) {
1643-
FlushParagraph();
1644-
}
1590+
if (!Paragraph.empty())
1591+
parseDocumentationParagraph(Paragraph, Output.addParagraph());
16451592
}
1646-
FlushParagraph();
16471593
}
1648-
16491594
llvm::raw_ostream &operator<<(llvm::raw_ostream &OS,
16501595
const HoverInfo::PrintedType &T) {
16511596
OS << T.Type;

0 commit comments

Comments
 (0)