[clangd] Represent Hover result using FormattedString
Reviewers: sammccall, kadircet
Reviewed By: kadircet
Subscribers: MaskRay, jkorous, arphaman, kadircet, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D61601
llvm-svn: 361940
diff --git a/clang-tools-extra/clangd/Protocol.cpp b/clang-tools-extra/clangd/Protocol.cpp
index 04c2663..51316fe 100644
--- a/clang-tools-extra/clangd/Protocol.cpp
+++ b/clang-tools-extra/clangd/Protocol.cpp
@@ -303,6 +303,17 @@
DocumentSymbol->getBoolean("hierarchicalDocumentSymbolSupport"))
R.HierarchicalDocumentSymbol = *HierarchicalSupport;
}
+ if (auto *Hover = TextDocument->getObject("hover")) {
+ if (auto *ContentFormat = Hover->getArray("contentFormat")) {
+ for (const auto &Format : *ContentFormat) {
+ MarkupKind K = MarkupKind::PlainText;
+ if (fromJSON(Format, K)) {
+ R.HoverContentFormat = K;
+ break;
+ }
+ }
+ }
+ }
}
if (auto *Workspace = O->getObject("workspace")) {
if (auto *Symbol = Workspace->getObject("symbol")) {
@@ -684,6 +695,27 @@
llvm_unreachable("Invalid MarkupKind");
}
+bool fromJSON(const llvm::json::Value &V, MarkupKind &K) {
+ auto Str = V.getAsString();
+ if (!Str) {
+ elog("Failed to parse markup kind: expected a string");
+ return false;
+ }
+ if (*Str == "plaintext")
+ K = MarkupKind::PlainText;
+ else if (*Str == "markdown")
+ K = MarkupKind::Markdown;
+ else {
+ elog("Unknown markup kind: {0}", *Str);
+ return false;
+ }
+ return true;
+}
+
+llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, MarkupKind K) {
+ return OS << toTextKind(K);
+}
+
llvm::json::Value toJSON(const MarkupContent &MC) {
if (MC.value.empty())
return nullptr;