kadircet created this revision.
Herald added subscribers: cfe-commits, usaxena95, arphaman, jkorous, MaskRay, 
ilya-biryukov.
Herald added a project: clang.

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.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D70723

Files:
  clang-tools-extra/clangd/Hover.cpp
  clang-tools-extra/clangd/Hover.h
  clang-tools-extra/clangd/unittests/HoverTests.cpp

Index: clang-tools-extra/clangd/unittests/HoverTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/HoverTests.cpp
+++ clang-tools-extra/clangd/unittests/HoverTests.cpp
@@ -32,7 +32,7 @@
        [](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 @@
        [](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 @@
          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 @@
          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 @@
          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 @@
        [](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 @@
        [](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 @@
        [](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 @@
        [](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 @@
        [](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 @@
          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 @@
          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 @@
          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 @@
          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 @@
          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 @@
        [](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 @@
          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 @@
          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 @@
         )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 @@
         )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 @@
         )cpp",
        [](HoverInfo &HI) {
          HI.Name = "class Foo<int>";
-         HI.Kind = SymbolKind::Class;
+         HI.Kind = index::SymbolKind::Class;
        }},
 
       // macro
@@ -391,7 +391,7 @@
         [[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 @@
        [](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 @@
        [](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 @@
        [](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 @@
          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 @@
          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 @@
        [](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 @@
        [](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 @@
        [](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]";
Index: clang-tools-extra/clangd/Hover.h
===================================================================
--- clang-tools-extra/clangd/Hover.h
+++ clang-tools-extra/clangd/Hover.h
@@ -28,7 +28,7 @@
   /// - 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 @@
   /// 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;
Index: clang-tools-extra/clangd/Hover.cpp
===================================================================
--- clang-tools-extra/clangd/Hover.cpp
+++ 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 @@
     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 @@
   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 HI;
   SourceManager &SM = AST.getSourceManager();
   HI.Name = Macro.Name;
-  HI.Kind = indexSymbolKindToSymbolKind(
-      index::getSymbolInfoForMacro(*Macro.Info).Kind);
+  HI.Kind = index::getSymbolInfoForMacro(*Macro.Info).Kind;
   // FIXME: Populate documentation
   // FIXME: Pupulate parameters
 
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to