diff --git a/clang-tools-extra/clangd/FindSymbols.cpp b/clang-tools-extra/clangd/FindSymbols.cpp --- a/clang-tools-extra/clangd/FindSymbols.cpp +++ b/clang-tools-extra/clangd/FindSymbols.cpp @@ -9,6 +9,7 @@ #include "AST.h" #include "FuzzyMatch.h" +#include "Hover.h" #include "ParsedAST.h" #include "Quality.h" #include "SourceCode.h" @@ -194,6 +195,15 @@ SI.range = Range{sourceLocToPosition(SM, SymbolRange->getBegin()), sourceLocToPosition(SM, SymbolRange->getEnd())}; + PrintingPolicy P(getPrintingPolicy(Ctx.getPrintingPolicy())); + P.SuppressScope = true; + P.SuppressUnwrittenScope = true; + llvm::raw_string_ostream OS(SI.detail); + if (const auto *TP = ND.getDescribedTemplateParams()) { + TP->print(OS, Ctx, P); + } + ND.print(OS, P); + SourceLocation NameLoc = ND.getLocation(); SourceLocation FallbackNameLoc; if (NameLoc.isMacroID()) { diff --git a/clang-tools-extra/clangd/Hover.h b/clang-tools-extra/clangd/Hover.h --- a/clang-tools-extra/clangd/Hover.h +++ b/clang-tools-extra/clangd/Hover.h @@ -17,6 +17,7 @@ namespace clang { namespace clangd { +PrintingPolicy getPrintingPolicy(PrintingPolicy Base); /// Contains detailed information about a Symbol. Especially useful when /// generating hover responses. It can be rendered as a hover panel, or /// embedding clients can use the structured information to provide their own diff --git a/clang-tools-extra/clangd/Hover.cpp b/clang-tools-extra/clangd/Hover.cpp --- a/clang-tools-extra/clangd/Hover.cpp +++ b/clang-tools-extra/clangd/Hover.cpp @@ -48,7 +48,6 @@ namespace clang { namespace clangd { -namespace { PrintingPolicy getPrintingPolicy(PrintingPolicy Base) { Base.AnonymousTagLocations = false; @@ -59,6 +58,7 @@ return Base; } +namespace { /// Given a declaration \p D, return a human-readable string representing the /// local scope in which it is declared, i.e. class(es) and method name. Returns /// an empty string if it is not local. diff --git a/clang-tools-extra/clangd/test/symbols.test b/clang-tools-extra/clangd/test/symbols.test --- a/clang-tools-extra/clangd/test/symbols.test +++ b/clang-tools-extra/clangd/test/symbols.test @@ -1,5 +1,5 @@ # RUN: clangd --index-file=%S/Inputs/symbols.test.yaml -lit-test < %s | FileCheck %s -{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":123,"rootPath":"clangd","capabilities":{"workspace":{"symbol":{"symbolKind":{"valueSet": [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]}}}},"trace":"off"}} +{"jsonrpc":"2.0","id":0,"method":"initialize","params":{"processId":123,"rootPath":"clangd","capabilities":{"textDocument":{"documentSymbol":{"hierarchicalDocumentSymbolSupport":true}},"workspace":{"symbol":{"symbolKind":{"valueSet": [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26]}}}},"trace":"off"}} --- {"jsonrpc":"2.0","method":"textDocument/didOpen","params":{"textDocument":{"uri":"test:///main.cpp","languageId":"cpp","version":1,"text":"void foo(); int main() { foo(); }\n"}}} --- @@ -34,40 +34,54 @@ # CHECK-NEXT: "jsonrpc": "2.0", # CHECK-NEXT: "result": [ # CHECK-NEXT: { -# CHECK-NEXT: "containerName": "", +# CHECK-NEXT: "detail": "void foo()", # CHECK-NEXT: "kind": 12, -# CHECK-NEXT: "location": { -# CHECK-NEXT: "range": { -# CHECK-NEXT: "end": { -# CHECK-NEXT: "character": {{.*}}, -# CHECK-NEXT: "line": {{.*}} -# CHECK-NEXT: }, -# CHECK-NEXT: "start": { -# CHECK-NEXT: "character": {{.*}}, -# CHECK-NEXT: "line": {{.*}} -# CHECK-NEXT: } +# CHECK-NEXT: "name": "foo", +# CHECK-NEXT: "range": { +# CHECK-NEXT: "end": { +# CHECK-NEXT: "character": {{.*}}, +# CHECK-NEXT: "line": {{.*}} # CHECK-NEXT: }, -# CHECK-NEXT: "uri": "file://{{.*}}/main.cpp" +# CHECK-NEXT: "start": { +# CHECK-NEXT: "character": {{.*}}, +# CHECK-NEXT: "line": {{.*}} +# CHECK-NEXT: } # CHECK-NEXT: }, -# CHECK-NEXT: "name": "foo" -# CHECK-NEXT: } +# CHECK-NEXT: "selectionRange": { +# CHECK-NEXT: "end": { +# CHECK-NEXT: "character": {{.*}}, +# CHECK-NEXT: "line": {{.*}} +# CHECK-NEXT: }, +# CHECK-NEXT: "start": { +# CHECK-NEXT: "character": {{.*}}, +# CHECK-NEXT: "line": {{.*}} +# CHECK-NEXT: } +# CHECK-NEXT: } +# CHECK-NEXT: }, # CHECK-NEXT: { -# CHECK-NEXT: "containerName": "", +# CHECK-NEXT: "detail": "int main()", # CHECK-NEXT: "kind": 12, -# CHECK-NEXT: "location": { -# CHECK-NEXT: "range": { -# CHECK-NEXT: "end": { -# CHECK-NEXT: "character": {{.*}}, -# CHECK-NEXT: "line": {{.*}} -# CHECK-NEXT: }, -# CHECK-NEXT: "start": { -# CHECK-NEXT: "character": {{.*}}, -# CHECK-NEXT: "line": {{.*}} -# CHECK-NEXT: } +# CHECK-NEXT: "name": "main", +# CHECK-NEXT: "range": { +# CHECK-NEXT: "end": { +# CHECK-NEXT: "character": {{.*}}, +# CHECK-NEXT: "line": {{.*}} # CHECK-NEXT: }, -# CHECK-NEXT: "uri": "file://{{.*}}/main.cpp" +# CHECK-NEXT: "start": { +# CHECK-NEXT: "character": {{.*}}, +# CHECK-NEXT: "line": {{.*}} +# CHECK-NEXT: } # CHECK-NEXT: }, -# CHECK-NEXT: "name": "main" +# CHECK-NEXT: "selectionRange": { +# CHECK-NEXT: "end": { +# CHECK-NEXT: "character": {{.*}}, +# CHECK-NEXT: "line": {{.*}} +# CHECK-NEXT: }, +# CHECK-NEXT: "start": { +# CHECK-NEXT: "character": {{.*}}, +# CHECK-NEXT: "line": {{.*}} +# CHECK-NEXT: } +# CHECK-NEXT: } # CHECK-NEXT: } # CHECK-NEXT: ] # CHECK-NEXT:}