diff --git a/src/messages/ccls_inheritanceHierarchy.cc b/src/messages/ccls_inheritanceHierarchy.cc index 7955b7a4..dd087c2e 100644 --- a/src/messages/ccls_inheritanceHierarchy.cc +++ b/src/messages/ccls_inheritanceHierarchy.cc @@ -187,6 +187,9 @@ struct Handler_CclsInheritanceHierarchy for (auto &entry1 : entry->children) q.push(&entry1); } + std::sort(out1.result.begin(), out1.result.end()); + out1.result.erase(std::unique(out1.result.begin(), out1.result.end()), + out1.result.end()); } pipeline::WriteStdout(kMethodType, out1); } diff --git a/src/messages/ccls_memberHierarchy.cc b/src/messages/ccls_memberHierarchy.cc index cfc61d45..7264b1a5 100644 --- a/src/messages/ccls_memberHierarchy.cc +++ b/src/messages/ccls_memberHierarchy.cc @@ -9,6 +9,7 @@ using namespace ccls; #include using namespace clang; +#include #include namespace { @@ -29,12 +30,12 @@ struct In_CclsMemberHierarchy : public RequestInMessage { bool qualified = false; int levels = 1; - }; - Params params; + bool flat = false; + } params; }; MAKE_REFLECT_STRUCT(In_CclsMemberHierarchy::Params, textDocument, position, id, - qualified, levels); + qualified, levels, flat); MAKE_REFLECT_STRUCT(In_CclsMemberHierarchy, id, params); REGISTER_IN_MESSAGE(In_CclsMemberHierarchy); @@ -264,7 +265,29 @@ struct Handler_CclsMemberHierarchy } } - pipeline::WriteStdout(kMethodType, out); + if (!params.flat) { + pipeline::WriteStdout(kMethodType, out); + return; + } + Out_LocationList out1; + out1.id = request->id; + if (out.result) { + std::queue q; + for (auto &entry1 : out.result->children) + q.push(&entry1); + while (q.size()) { + auto *entry = q.front(); + q.pop(); + if (entry->location.uri.raw_uri.size()) + out1.result.push_back({entry->location}); + for (auto &entry1 : entry->children) + q.push(&entry1); + } + std::sort(out1.result.begin(), out1.result.end()); + out1.result.erase(std::unique(out1.result.begin(), out1.result.end()), + out1.result.end()); + } + pipeline::WriteStdout(kMethodType, out1); } }; REGISTER_MESSAGE_HANDLER(Handler_CclsMemberHierarchy); diff --git a/src/messages/initialize.cc b/src/messages/initialize.cc index 6eaa223e..eee79787 100644 --- a/src/messages/initialize.cc +++ b/src/messages/initialize.cc @@ -142,6 +142,8 @@ struct lsServerCapabilities { bool definitionProvider = true; // The server provides Goto Type Definition support. bool typeDefinitionProvider = true; + // The server provides Goto Implementation support. + bool implementationProvider = true; // The server provides find references support. bool referencesProvider = true; // The server provides document highlight support. @@ -170,11 +172,12 @@ struct lsServerCapabilities { }; MAKE_REFLECT_STRUCT(lsServerCapabilities, textDocumentSync, hoverProvider, completionProvider, signatureHelpProvider, - definitionProvider, typeDefinitionProvider, - referencesProvider, documentHighlightProvider, - documentSymbolProvider, workspaceSymbolProvider, - codeActionProvider, codeLensProvider, - documentFormattingProvider, documentRangeFormattingProvider, + definitionProvider, implementationProvider, + typeDefinitionProvider, referencesProvider, + documentHighlightProvider, documentSymbolProvider, + workspaceSymbolProvider, codeActionProvider, + codeLensProvider, documentFormattingProvider, + documentRangeFormattingProvider, documentOnTypeFormattingProvider, renameProvider, documentLinkProvider, executeCommandProvider);