Author: Kadir Cetinkaya Date: 2019-12-06T13:40:22+01:00 New Revision: 24439a761c5e21fda8f9410a5e80ff07b4ba03a2
URL: https://github.com/llvm/llvm-project/commit/24439a761c5e21fda8f9410a5e80ff07b4ba03a2 DIFF: https://github.com/llvm/llvm-project/commit/24439a761c5e21fda8f9410a5e80ff07b4ba03a2.diff LOG: [clangd] Store index::SymbolKind in HoverInfo Summary: LSP's SymbolKind has some shortcomings when it comes to C++ types, index::SymbolKind has more detailed info like Destructor, Parameter, MACRO etc. We are planning to make use of that information in our new Hover response, and it would be nice to display the Symbol type in full detail, rather than some approximation. Reviewers: sammccall Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, usaxena95, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D70723 Added: Modified: clang-tools-extra/clangd/Hover.cpp clang-tools-extra/clangd/Hover.h clang-tools-extra/clangd/unittests/HoverTests.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/Hover.cpp b/clang-tools-extra/clangd/Hover.cpp index 6a7d994ce7e3..5bc15629b05b 100644 --- a/clang-tools-extra/clangd/Hover.cpp +++ b/clang-tools-extra/clangd/Hover.cpp @@ -20,6 +20,8 @@ #include "clang/AST/ASTTypeTraits.h" #include "clang/AST/DeclTemplate.h" #include "clang/AST/PrettyPrinter.h" +#include "clang/Index/IndexSymbol.h" +#include "llvm/Support/raw_ostream.h" namespace clang { namespace clangd { @@ -298,7 +300,7 @@ HoverInfo getHoverContents(const Decl *D, const SymbolIndex *Index) { HI.Name = printName(Ctx, *ND); } - HI.Kind = indexSymbolKindToSymbolKind(index::getSymbolInfo(D).Kind); + HI.Kind = index::getSymbolInfo(D).Kind; // Fill in template params. if (const TemplateDecl *TD = D->getDescribedTemplate()) { @@ -347,7 +349,7 @@ HoverInfo getHoverContents(QualType T, const Decl *D, ASTContext &ASTCtx, OS.flush(); if (D) { - HI.Kind = indexSymbolKindToSymbolKind(index::getSymbolInfo(D).Kind); + HI.Kind = index::getSymbolInfo(D).Kind; enhanceFromIndex(HI, D, Index); } return HI; @@ -358,8 +360,7 @@ HoverInfo getHoverContents(const DefinedMacro &Macro, ParsedAST &AST) { HoverInfo HI; SourceManager &SM = AST.getSourceManager(); HI.Name = Macro.Name; - HI.Kind = indexSymbolKindToSymbolKind( - index::getSymbolInfoForMacro(*Macro.Info).Kind); + HI.Kind = index::SymbolKind::Macro; // FIXME: Populate documentation // FIXME: Pupulate parameters diff --git a/clang-tools-extra/clangd/Hover.h b/clang-tools-extra/clangd/Hover.h index 704e5c4b14e5..f332f5d9eeea 100644 --- a/clang-tools-extra/clangd/Hover.h +++ b/clang-tools-extra/clangd/Hover.h @@ -28,7 +28,7 @@ struct HoverInfo { /// - template <ParamType Name = DefaultType> class Foo {}; struct Param { /// The pretty-printed parameter type, e.g. "int", or "typename" (in - /// TemplateParameters) + /// TemplateParameters), might be None for macro parameters. llvm::Optional<std::string> Type; /// None for unnamed parameters. llvm::Optional<std::string> Name; @@ -53,9 +53,7 @@ struct HoverInfo { /// Name of the symbol, does not contain any "::". std::string Name; llvm::Optional<Range> SymRange; - /// Scope containing the symbol. e.g, "global namespace", "function x::Y" - /// - None for deduced types, e.g "auto", "decltype" keywords. - SymbolKind Kind; + index::SymbolKind Kind; std::string Documentation; /// Source code containing the definition of the symbol. std::string Definition; diff --git a/clang-tools-extra/clangd/unittests/HoverTests.cpp b/clang-tools-extra/clangd/unittests/HoverTests.cpp index 530dfe600ecf..bd6a33d8d67e 100644 --- a/clang-tools-extra/clangd/unittests/HoverTests.cpp +++ b/clang-tools-extra/clangd/unittests/HoverTests.cpp @@ -32,7 +32,7 @@ TEST(Hover, Structured) { [](HoverInfo &HI) { HI.NamespaceScope = ""; HI.Name = "foo"; - HI.Kind = SymbolKind::Function; + HI.Kind = index::SymbolKind::Function; HI.Documentation = "Best foo ever."; HI.Definition = "void foo()"; HI.ReturnType = "void"; @@ -49,7 +49,7 @@ TEST(Hover, Structured) { [](HoverInfo &HI) { HI.NamespaceScope = "ns1::ns2::"; HI.Name = "foo"; - HI.Kind = SymbolKind::Function; + HI.Kind = index::SymbolKind::Function; HI.Documentation = "Best foo ever."; HI.Definition = "void foo()"; HI.ReturnType = "void"; @@ -68,7 +68,7 @@ TEST(Hover, Structured) { HI.NamespaceScope = "ns1::ns2::"; HI.LocalScope = "Foo::"; HI.Name = "bar"; - HI.Kind = SymbolKind::Field; + HI.Kind = index::SymbolKind::Field; HI.Definition = "int bar"; HI.Type = "int"; }}, @@ -86,7 +86,7 @@ TEST(Hover, Structured) { HI.NamespaceScope = "ns1::ns2::"; HI.LocalScope = "Foo::foo::"; HI.Name = "bar"; - HI.Kind = SymbolKind::Variable; + HI.Kind = index::SymbolKind::Variable; HI.Definition = "int bar"; HI.Type = "int"; }}, @@ -102,7 +102,7 @@ TEST(Hover, Structured) { HI.NamespaceScope = "ns1::(anonymous)::"; HI.LocalScope = "(anonymous struct)::"; HI.Name = "bar"; - HI.Kind = SymbolKind::Field; + HI.Kind = index::SymbolKind::Field; HI.Definition = "int bar"; HI.Type = "int"; }}, @@ -114,7 +114,7 @@ TEST(Hover, Structured) { [](HoverInfo &HI) { HI.NamespaceScope = ""; HI.Name = "foo"; - HI.Kind = SymbolKind::Variable; + HI.Kind = index::SymbolKind::Variable; HI.Definition = "Foo<int, char, bool> foo = Foo<int, char, bool>(5)"; HI.Type = "Foo<int, char, bool>"; }}, @@ -126,7 +126,7 @@ TEST(Hover, Structured) { [](HoverInfo &HI) { HI.NamespaceScope = ""; HI.Name = "vector"; - HI.Kind = SymbolKind::Class; + HI.Kind = index::SymbolKind::Class; HI.Definition = "template <typename T> class vector {}"; HI.TemplateParameters = { {std::string("typename"), std::string("T"), llvm::None}, @@ -145,7 +145,7 @@ TEST(Hover, Structured) { [](HoverInfo &HI) { HI.NamespaceScope = ""; HI.Name = "Foo"; - HI.Kind = SymbolKind::Class; + HI.Kind = index::SymbolKind::Class; HI.Definition = R"cpp(template <template <typename, bool...> class C, typename = char, int = 0, bool Q = false, class... Ts> @@ -175,7 +175,7 @@ class Foo {})cpp"; [](HoverInfo &HI) { HI.NamespaceScope = ""; HI.Name = "foo"; - HI.Kind = SymbolKind::Function; + HI.Kind = index::SymbolKind::Function; HI.Definition = R"cpp(template <template <typename, bool...> class C, typename = char, int = 0, bool Q = false, class... Ts> @@ -204,7 +204,7 @@ void foo())cpp"; [](HoverInfo &HI) { HI.NamespaceScope = ""; HI.Name = "foo"; - HI.Kind = SymbolKind::Function; + HI.Kind = index::SymbolKind::Function; HI.Definition = "Foo<bool, true, false> foo(int, bool T = false)"; HI.ReturnType = "Foo<bool, true, false>"; HI.Type = "Foo<bool, true, false> (int, bool)"; @@ -225,7 +225,7 @@ void foo())cpp"; HI.NamespaceScope = ""; HI.LocalScope = "foo::"; HI.Name = "c"; - HI.Kind = SymbolKind::Variable; + HI.Kind = index::SymbolKind::Variable; HI.Definition = "auto *c = &b"; HI.Type = "class (lambda) **"; HI.ReturnType = "bool"; @@ -246,7 +246,7 @@ void foo())cpp"; HI.NamespaceScope = ""; HI.LocalScope = "foo::"; HI.Name = "bar"; - HI.Kind = SymbolKind::Variable; + HI.Kind = index::SymbolKind::Parameter; HI.Definition = "decltype(lamb) &bar"; HI.Type = "decltype(lamb) &"; HI.ReturnType = "bool"; @@ -267,7 +267,7 @@ void foo())cpp"; HI.NamespaceScope = ""; HI.LocalScope = "foo::"; HI.Name = "bar"; - HI.Kind = SymbolKind::Variable; + HI.Kind = index::SymbolKind::Parameter; HI.Definition = "decltype(lamb) bar"; HI.Type = "class (lambda)"; HI.ReturnType = "bool"; @@ -290,7 +290,7 @@ void foo())cpp"; HI.NamespaceScope = ""; HI.LocalScope = "foo::"; HI.Name = "lamb"; - HI.Kind = SymbolKind::Variable; + HI.Kind = index::SymbolKind::Variable; HI.Definition = "auto lamb = [&bar](int T, bool B) -> bool {}"; HI.Type = "class (lambda)"; HI.ReturnType = "bool"; @@ -310,7 +310,7 @@ void foo())cpp"; HI.NamespaceScope = ""; HI.LocalScope = "foo::(anonymous class)::operator()::"; HI.Name = "test"; - HI.Kind = SymbolKind::Variable; + HI.Kind = index::SymbolKind::Variable; HI.Definition = "int test"; HI.Type = "int"; }}, @@ -322,7 +322,7 @@ void foo())cpp"; [](HoverInfo &HI) { HI.Name = "X<T *>"; HI.NamespaceScope = ""; - HI.Kind = SymbolKind::Class; + HI.Kind = index::SymbolKind::Class; HI.Definition = "template <typename T> class X<T *> {}"; }}, // Constructor of partially-specialized class template @@ -334,7 +334,7 @@ void foo())cpp"; HI.NamespaceScope = ""; HI.Name = "X"; HI.LocalScope = "X<T *>::"; // FIXME: X<T *, void>:: - HI.Kind = SymbolKind::Constructor; + HI.Kind = index::SymbolKind::Constructor; HI.ReturnType = "X<T *>"; HI.Definition = "X()"; HI.Parameters.emplace(); @@ -344,7 +344,7 @@ void foo())cpp"; HI.NamespaceScope = ""; HI.Name = "~X"; HI.LocalScope = "X::"; - HI.Kind = SymbolKind::Constructor; + HI.Kind = index::SymbolKind::Destructor; HI.ReturnType = "void"; HI.Definition = "~X()"; HI.Parameters.emplace(); @@ -358,7 +358,7 @@ void foo())cpp"; )cpp", [](HoverInfo &HI) { HI.Name = "class (lambda)"; - HI.Kind = SymbolKind::Class; + HI.Kind = index::SymbolKind::Class; }}, // auto on template instantiation {R"cpp( @@ -369,7 +369,7 @@ void foo())cpp"; )cpp", [](HoverInfo &HI) { HI.Name = "class Foo<int>"; - HI.Kind = SymbolKind::Class; + HI.Kind = index::SymbolKind::Class; }}, // auto on specialized template {R"cpp( @@ -381,7 +381,7 @@ void foo())cpp"; )cpp", [](HoverInfo &HI) { HI.Name = "class Foo<int>"; - HI.Kind = SymbolKind::Class; + HI.Kind = index::SymbolKind::Class; }}, // macro @@ -391,7 +391,7 @@ void foo())cpp"; [[MAC^RO]](int, double d, bool z = false); )cpp", [](HoverInfo &HI) { - HI.Name = "MACRO", HI.Kind = SymbolKind::String, + HI.Name = "MACRO", HI.Kind = index::SymbolKind::Macro, HI.Definition = "#define MACRO(x, y, z) void foo(x, y, z);"; }}, @@ -403,7 +403,7 @@ void foo())cpp"; [](HoverInfo &HI) { HI.Name = "bar"; HI.Definition = "int bar = add(1, 2)"; - HI.Kind = SymbolKind::Variable; + HI.Kind = index::SymbolKind::Variable; HI.Type = "int"; HI.NamespaceScope = ""; HI.Value = "3"; @@ -414,7 +414,7 @@ void foo())cpp"; [](HoverInfo &HI) { HI.Name = "bar"; HI.Definition = "int bar = sizeof(char)"; - HI.Kind = SymbolKind::Variable; + HI.Kind = index::SymbolKind::Variable; HI.Type = "int"; HI.NamespaceScope = ""; HI.Value = "1"; @@ -428,7 +428,7 @@ void foo())cpp"; [](HoverInfo &HI) { HI.Name = "bar"; HI.Definition = "int bar = Add<1, 2>::result"; - HI.Kind = SymbolKind::Variable; + HI.Kind = index::SymbolKind::Variable; HI.Type = "int"; HI.NamespaceScope = ""; HI.Value = "3"; @@ -442,7 +442,7 @@ void foo())cpp"; HI.NamespaceScope = ""; HI.LocalScope = "Color::"; HI.Definition = "GREEN"; - HI.Kind = SymbolKind::EnumMember; + HI.Kind = index::SymbolKind::EnumConstant; HI.Type = "enum Color"; HI.Value = "1"; // Numeric when hovering on the enumerator name. }}, @@ -455,7 +455,7 @@ void foo())cpp"; HI.Name = "x"; HI.NamespaceScope = ""; HI.Definition = "enum Color x = GREEN"; - HI.Kind = SymbolKind::Variable; + HI.Kind = index::SymbolKind::Variable; HI.Type = "enum Color"; HI.Value = "GREEN (1)"; // Symbolic when hovering on an expression. }}, @@ -470,7 +470,7 @@ void foo())cpp"; [](HoverInfo &HI) { HI.Name = "result"; HI.Definition = "static constexpr int result = a + b"; - HI.Kind = SymbolKind::Property; + HI.Kind = index::SymbolKind::StaticProperty; HI.Type = "const int"; HI.NamespaceScope = ""; HI.LocalScope = "Add<a, b>::"; @@ -483,7 +483,7 @@ void foo())cpp"; [](HoverInfo &HI) { HI.Name = "answer"; HI.Definition = "constexpr int answer()"; - HI.Kind = SymbolKind::Function; + HI.Kind = index::SymbolKind::Function; HI.Type = "int ()"; HI.ReturnType = "int"; HI.Parameters.emplace(); @@ -496,7 +496,7 @@ void foo())cpp"; [](HoverInfo &HI) { HI.Name = "bar"; HI.Definition = "const char *bar = \"1234\""; - HI.Kind = SymbolKind::Variable; + HI.Kind = index::SymbolKind::Variable; HI.Type = "const char *"; HI.NamespaceScope = ""; HI.Value = "&\"1234\"[0]"; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits