summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKadir Cetinkaya <kadircet@google.com>2020-01-13 17:50:23 +0100
committerKadir Cetinkaya <kadircet@google.com>2020-01-13 20:24:09 +0100
commit15078d7202b410fd15eedc49d2ab2e4fe9a9f177 (patch)
treeaa94388008a6bd7a7c690a45db083ad0b8fd408b
parent2b530053e9d696ada9269e7396180fc6262d2861 (diff)
downloadbcm5719-llvm-15078d7202b410fd15eedc49d2ab2e4fe9a9f177.tar.gz
bcm5719-llvm-15078d7202b410fd15eedc49d2ab2e4fe9a9f177.zip
[clangd] Render header of hover card as a heading
Reviewers: sammccall Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, usaxena95, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D72625
-rw-r--r--clang-tools-extra/clangd/FormattedString.cpp19
-rw-r--r--clang-tools-extra/clangd/FormattedString.h4
-rw-r--r--clang-tools-extra/clangd/Hover.cpp5
-rw-r--r--clang-tools-extra/clangd/unittests/FormattedStringTests.cpp9
-rw-r--r--clang-tools-extra/clangd/unittests/HoverTests.cpp12
5 files changed, 48 insertions, 1 deletions
diff --git a/clang-tools-extra/clangd/FormattedString.cpp b/clang-tools-extra/clangd/FormattedString.cpp
index 1e61b8b5fb1..881c34e0071 100644
--- a/clang-tools-extra/clangd/FormattedString.cpp
+++ b/clang-tools-extra/clangd/FormattedString.cpp
@@ -164,6 +164,19 @@ std::string indentLines(llvm::StringRef Input) {
}
return IndentedR;
}
+
+class Heading : public Paragraph {
+public:
+ Heading(size_t Level) : Level(Level) {}
+ void renderMarkdown(llvm::raw_ostream &OS) const override {
+ OS << std::string(Level, '#') << ' ';
+ Paragraph::renderMarkdown(OS);
+ }
+
+private:
+ size_t Level;
+};
+
} // namespace
std::string Block::asMarkdown() const {
@@ -278,6 +291,12 @@ BulletList &Document::addBulletList() {
Children.emplace_back(std::make_unique<BulletList>());
return *static_cast<BulletList *>(Children.back().get());
}
+
+Paragraph &Document::addHeading(size_t Level) {
+ assert(Level > 0);
+ Children.emplace_back(std::make_unique<Heading>(Level));
+ return *static_cast<Paragraph *>(Children.back().get());
+}
} // namespace markup
} // namespace clangd
} // namespace clang
diff --git a/clang-tools-extra/clangd/FormattedString.h b/clang-tools-extra/clangd/FormattedString.h
index 2d1f681e7eb..1b7e9fc7521 100644
--- a/clang-tools-extra/clangd/FormattedString.h
+++ b/clang-tools-extra/clangd/FormattedString.h
@@ -14,6 +14,7 @@
#define LLVM_CLANG_TOOLS_EXTRA_CLANGD_FORMATTEDSTRING_H
#include "llvm/Support/raw_ostream.h"
+#include <cstddef>
#include <memory>
#include <string>
#include <vector>
@@ -86,6 +87,9 @@ public:
/// Adds a block of code. This translates to a ``` block in markdown. In plain
/// text representation, the code block will be surrounded by newlines.
void addCodeBlock(std::string Code, std::string Language = "cpp");
+ /// Heading is a special type of paragraph that will be prepended with \p
+ /// Level many '#'s in markdown.
+ Paragraph &addHeading(size_t Level);
BulletList &addBulletList();
diff --git a/clang-tools-extra/clangd/Hover.cpp b/clang-tools-extra/clangd/Hover.cpp
index a9fa6443b19..526f2220efa 100644
--- a/clang-tools-extra/clangd/Hover.cpp
+++ b/clang-tools-extra/clangd/Hover.cpp
@@ -469,7 +469,10 @@ markup::Document HoverInfo::present() const {
// class `X`
//
// function `foo` → `int`
- markup::Paragraph &Header = Output.addParagraph();
+ // Note that we are making use of a level-3 heading because VSCode renders
+ // level 1 and 2 headers in a huge font, see
+ // https://github.com/microsoft/vscode/issues/88417 for details.
+ markup::Paragraph &Header = Output.addHeading(3);
Header.appendText(index::getSymbolKindString(Kind));
assert(!Name.empty() && "hover triggered on a nameless symbol");
Header.appendCode(Name);
diff --git a/clang-tools-extra/clangd/unittests/FormattedStringTests.cpp b/clang-tools-extra/clangd/unittests/FormattedStringTests.cpp
index 80d0934bed3..0a85a4cb27d 100644
--- a/clang-tools-extra/clangd/unittests/FormattedStringTests.cpp
+++ b/clang-tools-extra/clangd/unittests/FormattedStringTests.cpp
@@ -145,6 +145,15 @@ TEST(Document, Spacer) {
EXPECT_EQ(D.asPlainText(), "foo\n\nbar");
}
+TEST(Document, Heading) {
+ Document D;
+ D.addHeading(1).appendText("foo");
+ D.addHeading(2).appendText("bar");
+ D.addParagraph().appendText("baz");
+ EXPECT_EQ(D.asMarkdown(), "# foo \n## bar \nbaz");
+ EXPECT_EQ(D.asPlainText(), "foo\nbar\nbaz");
+}
+
TEST(CodeBlock, Render) {
Document D;
// Code blocks preserves any extra spaces.
diff --git a/clang-tools-extra/clangd/unittests/HoverTests.cpp b/clang-tools-extra/clangd/unittests/HoverTests.cpp
index 91eb5a083dd..866ff975429 100644
--- a/clang-tools-extra/clangd/unittests/HoverTests.cpp
+++ b/clang-tools-extra/clangd/unittests/HoverTests.cpp
@@ -1631,6 +1631,7 @@ TEST(Hover, DocsFromMostSpecial) {
}
}
}
+
TEST(Hover, Present) {
struct {
const std::function<void(HoverInfo &)> Builder;
@@ -1720,6 +1721,17 @@ def)",
}
}
+// This is a separate test as headings don't create any differences in plaintext
+// mode.
+TEST(Hover, PresentHeadings) {
+ HoverInfo HI;
+ HI.Kind = index::SymbolKind::Variable;
+ HI.Name = "foo";
+ HI.Type = "type";
+
+ EXPECT_EQ(HI.present().asMarkdown(), "### variable `foo` \\: `type`");
+}
+
} // namespace
} // namespace clangd
} // namespace clang
OpenPOWER on IntegriCloud