[PATCH] D56370: [clangd] Add support for type hierarchy (super types only for now)

Kadir Cetinkaya via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Feb 8 02:54:59 PST 2019


kadircet added a subscriber: sammccall.
kadircet added a comment.

Implementation LG, but I am not sure about adding a functionality on a proposal that might change. WDYT @sammccall ?



================
Comment at: clang-tools-extra/clangd/FindSymbols.cpp:16
 #include "SourceCode.h"
+#include "XRefs.h"
 #include "index/Index.h"
----------------
it seems like there is no change in file requiring this


================
Comment at: clang-tools-extra/clangd/FindSymbols.cpp:218
   }
+
   return SI;
----------------
can you revert this one as well ?


================
Comment at: clang-tools-extra/clangd/Protocol.cpp:817
+bool fromJSON(const llvm::json::Value &E, TypeHierarchyDirection &Out) {
+  if (auto T = E.getAsInteger()) {
+    if (*T < static_cast<int>(TypeHierarchyDirection::Children) ||
----------------
nit: get rid of nesting by
```
auto T = E.getas..;
if(!T)
  return false;
if(*T not in rage)
  return false;
Out = cast(*T);
return true;
```


================
Comment at: clang-tools-extra/clangd/Protocol.h:1026
+  /// When not defined, it is treated as `0`.
+  llvm::Optional<int> resolve;
+
----------------
why not just use an int then ?


================
Comment at: clang-tools-extra/clangd/Protocol.h:1046
+  /// It is `false` by default.
+  llvm::Optional<bool> deprecated;
+
----------------
again we can just store a bool, and only serialize if it is true


================
Comment at: clang-tools-extra/clangd/XRefs.cpp:876
+  Optional<TypeHierarchyItem> Result = declToTypeHierarchyItem(ASTCtx, CXXRD);
+  if (Result && Levels > 0) {
+    if (Direction == TypeHierarchyDirection::Parents ||
----------------
again reduce nesting


================
Comment at: clang-tools-extra/clangd/XRefs.cpp:891
+        if (Optional<TypeHierarchyItem> ParentSym =
+                getTypeHierarchy(*ParentDecl, ASTCtx, Levels - 1, Direction)) {
+          Result->parents->emplace_back(std::move(*ParentSym));
----------------
A problem that might occur when you add children traversal:
do we really want to include current decl in children of parent when we have `BOTH` as direction? If so, maybe we should rather cache the results? Maybe leave a todo/fixme ?


================
Comment at: clang-tools-extra/clangd/XRefs.cpp:917
+  if (Symbols.Decls.empty())
+    return {};
+
----------------
llvm::None


================
Comment at: clang-tools-extra/clangd/XRefs.cpp:925
+    CXXRD = VD->getType().getTypePtr()->getAsCXXRecordDecl();
+  } else if (const CXXMethodDecl *Method = dyn_cast<CXXMethodDecl>(D)) {
+    // If this is a method, use the type of the class.
----------------
what about member fields ?


================
Comment at: clang-tools-extra/clangd/XRefs.cpp:932
+
+  if (CXXRD) {
+    int ResolveLevels = Resolve.getValueOr(0);
----------------
reduce nesting


================
Comment at: clang-tools-extra/clangd/XRefs.cpp:935
+    TypeHierarchyDirection ResolveDirection =
+        Direction.getValueOr(TypeHierarchyDirection::Parents);
+    return getTypeHierarchy(*CXXRD, ASTCtx, ResolveLevels, ResolveDirection);
----------------
Is this mentioned in proposal?


================
Comment at: clang-tools-extra/clangd/XRefs.cpp:939
+
+  return {};
+}
----------------
llvm::None


================
Comment at: clang-tools-extra/unittests/clangd/XRefsTests.cpp:1355
+  Annotations Source(R"cpp(
+struct $ParentDef[[Parent]]
+{
----------------
can you format the code?


================
Comment at: clang-tools-extra/unittests/clangd/XRefsTests.cpp:1387
+
+  for (auto Pt : {"p1", "p2", "p3", "p4"}) {
+    llvm::Optional<TypeHierarchyItem> Result = getTypeHierarchy(
----------------
You can use `Source.points()` and use `Pt` directly instead of doing `Source.point(pt)`. Same for other tests.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D56370/new/

https://reviews.llvm.org/D56370





More information about the cfe-commits mailing list