From 5a22a5cc66e4ec75d2f8e72ad670e1260f0ee1f0 Mon Sep 17 00:00:00 2001 From: Fangrui Song Date: Mon, 25 Dec 2017 21:26:03 -0800 Subject: [PATCH] [hover] Return comments and hover as two MarkedString's Inspired by @romix's https://github.com/jacobdufault/cquery/pull/187 --- src/messages/text_document_hover.cc | 44 ++++++++++++++--------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/src/messages/text_document_hover.cc b/src/messages/text_document_hover.cc index e4d9f839..547a14fc 100644 --- a/src/messages/text_document_hover.cc +++ b/src/messages/text_document_hover.cc @@ -3,36 +3,29 @@ namespace { -static std::string getHoverString(const optional& hover, - const optional& comments, - const std::string& detailed_name) { - // TODO: Properly format multi-line comments. - std::string ret; - if (comments) { - ret += *comments; - ret += '\n'; - } - return ret + hover.value_or(detailed_name); -} - -std::string GetHoverForSymbol(QueryDatabase* db, const SymbolIdx& symbol) { +std::pair, std::string> GetHoverForSymbol( + QueryDatabase* db, + const SymbolIdx& symbol) { switch (symbol.kind) { case SymbolKind::Type: { QueryType& type = db->types[symbol.idx]; if (type.def) - return getHoverString(type.def->hover, type.def->comments, type.def->detailed_name); + return {type.def->comments, + type.def->hover.value_or(type.def->detailed_name)}; break; } case SymbolKind::Func: { QueryFunc& func = db->funcs[symbol.idx]; if (func.def) - return getHoverString(func.def->hover, func.def->comments, func.def->detailed_name); + return {func.def->comments, + func.def->hover.value_or(func.def->detailed_name)}; break; } case SymbolKind::Var: { QueryVar& var = db->vars[symbol.idx]; if (var.def) - return getHoverString(var.def->hover, var.def->comments, var.def->detailed_name); + return {var.def->comments, + var.def->hover.value_or(var.def->detailed_name)}; break; } case SymbolKind::File: @@ -41,7 +34,7 @@ std::string GetHoverForSymbol(QueryDatabase* db, const SymbolIdx& symbol) { break; } } - return ""; + return {nullopt, ""}; } struct Ipc_TextDocumentHover : public IpcMessage { @@ -55,7 +48,7 @@ REGISTER_IPC_MESSAGE(Ipc_TextDocumentHover); struct Out_TextDocumentHover : public lsOutMessage { struct Result { - lsMarkedString contents; + std::vector contents; optional range; }; @@ -100,11 +93,18 @@ struct TextDocumentHoverHandler : BaseMessageHandler { if (!ls_range) continue; - std::string hover = GetHoverForSymbol(db, ref.idx); - if (!hover.empty()) { + std::pair, std::string> comments_hover = + GetHoverForSymbol(db, ref.idx); + if (comments_hover.first || comments_hover.second.size()) { out.result = Out_TextDocumentHover::Result(); - out.result->contents.value = hover; - out.result->contents.language = file->def->language; + if (comments_hover.first) { + out.result->contents.emplace_back( + lsMarkedString{file->def->language, *comments_hover.first}); + } + if (comments_hover.second.size()) { + out.result->contents.emplace_back( + lsMarkedString{file->def->language, comments_hover.second}); + } out.result->range = *ls_range; break; }