[clang-tools-extra] Revert "[clangd] Support outgoing calls in call hierarchy (#77556)" (PR #117668)

Nathan Ridge via cfe-commits cfe-commits at lists.llvm.org
Mon Nov 25 21:08:25 PST 2024


https://github.com/HighCommander4 created https://github.com/llvm/llvm-project/pull/117668

This reverts commit ca184cfc088a843e545e5f04b48813e6f9bfba77.

>From 08003a8cc09ad8a6afab582be0d90078d84e617b Mon Sep 17 00:00:00 2001
From: Nathan Ridge <zeratul976 at hotmail.com>
Date: Tue, 26 Nov 2024 00:07:31 -0500
Subject: [PATCH] Revert "[clangd] Support outgoing calls in call hierarchy
 (#77556)"

This reverts commit ca184cfc088a843e545e5f04b48813e6f9bfba77.
---
 clang-tools-extra/clangd/ClangdLSPServer.cpp  |   7 -
 clang-tools-extra/clangd/ClangdLSPServer.h    |   3 -
 clang-tools-extra/clangd/ClangdServer.cpp     |   9 -
 clang-tools-extra/clangd/ClangdServer.h       |   4 -
 clang-tools-extra/clangd/XRefs.cpp            |  59 ----
 clang-tools-extra/clangd/XRefs.h              |   3 -
 clang-tools-extra/clangd/index/Index.cpp      |   5 -
 clang-tools-extra/clangd/index/Index.h        |  35 ---
 clang-tools-extra/clangd/index/MemIndex.cpp   |  20 --
 clang-tools-extra/clangd/index/MemIndex.h     |   4 -
 clang-tools-extra/clangd/index/Merge.cpp      |  34 ---
 clang-tools-extra/clangd/index/Merge.h        |   3 -
 .../clangd/index/ProjectAware.cpp             |  13 -
 clang-tools-extra/clangd/index/Ref.h          |   3 -
 .../clangd/index/SymbolCollector.cpp          |  20 +-
 .../clangd/index/SymbolCollector.h            |   1 -
 clang-tools-extra/clangd/index/dex/Dex.cpp    |  42 ---
 clang-tools-extra/clangd/index/dex/Dex.h      |  20 --
 .../clangd/test/type-hierarchy-ext.test       |   2 -
 .../clangd/test/type-hierarchy.test           |   2 -
 .../clangd/unittests/CallHierarchyTests.cpp   | 271 +++++-------------
 .../clangd/unittests/CodeCompleteTests.cpp    |   6 -
 .../clangd/unittests/RenameTests.cpp          |  12 -
 23 files changed, 73 insertions(+), 505 deletions(-)

diff --git a/clang-tools-extra/clangd/ClangdLSPServer.cpp b/clang-tools-extra/clangd/ClangdLSPServer.cpp
index 1391dcaa0c81a4..05dd313d0a0d35 100644
--- a/clang-tools-extra/clangd/ClangdLSPServer.cpp
+++ b/clang-tools-extra/clangd/ClangdLSPServer.cpp
@@ -1415,12 +1415,6 @@ void ClangdLSPServer::onInlayHint(const InlayHintsParams &Params,
                      std::move(Reply));
 }
 
-void ClangdLSPServer::onCallHierarchyOutgoingCalls(
-    const CallHierarchyOutgoingCallsParams &Params,
-    Callback<std::vector<CallHierarchyOutgoingCall>> Reply) {
-  Server->outgoingCalls(Params.item, std::move(Reply));
-}
-
 void ClangdLSPServer::applyConfiguration(
     const ConfigurationSettings &Settings) {
   // Per-file update to the compilation database.
@@ -1699,7 +1693,6 @@ void ClangdLSPServer::bindMethods(LSPBinder &Bind,
   Bind.method("typeHierarchy/subtypes", this, &ClangdLSPServer::onSubTypes);
   Bind.method("textDocument/prepareCallHierarchy", this, &ClangdLSPServer::onPrepareCallHierarchy);
   Bind.method("callHierarchy/incomingCalls", this, &ClangdLSPServer::onCallHierarchyIncomingCalls);
-  Bind.method("callHierarchy/outgoingCalls", this, &ClangdLSPServer::onCallHierarchyOutgoingCalls);
   Bind.method("textDocument/selectionRange", this, &ClangdLSPServer::onSelectionRange);
   Bind.method("textDocument/documentLink", this, &ClangdLSPServer::onDocumentLink);
   Bind.method("textDocument/semanticTokens/full", this, &ClangdLSPServer::onSemanticTokens);
diff --git a/clang-tools-extra/clangd/ClangdLSPServer.h b/clang-tools-extra/clangd/ClangdLSPServer.h
index 597fd9de7ff688..0b8e4720f53236 100644
--- a/clang-tools-extra/clangd/ClangdLSPServer.h
+++ b/clang-tools-extra/clangd/ClangdLSPServer.h
@@ -156,9 +156,6 @@ class ClangdLSPServer : private ClangdServer::Callbacks,
   void onCallHierarchyIncomingCalls(
       const CallHierarchyIncomingCallsParams &,
       Callback<std::vector<CallHierarchyIncomingCall>>);
-  void onCallHierarchyOutgoingCalls(
-      const CallHierarchyOutgoingCallsParams &,
-      Callback<std::vector<CallHierarchyOutgoingCall>>);
   void onClangdInlayHints(const InlayHintsParams &,
                           Callback<llvm::json::Value>);
   void onInlayHint(const InlayHintsParams &, Callback<std::vector<InlayHint>>);
diff --git a/clang-tools-extra/clangd/ClangdServer.cpp b/clang-tools-extra/clangd/ClangdServer.cpp
index 63f83bc36f0c69..9b38be04e7ddd7 100644
--- a/clang-tools-extra/clangd/ClangdServer.cpp
+++ b/clang-tools-extra/clangd/ClangdServer.cpp
@@ -912,15 +912,6 @@ void ClangdServer::inlayHints(PathRef File, std::optional<Range> RestrictRange,
   WorkScheduler->runWithAST("InlayHints", File, std::move(Action), Transient);
 }
 
-void ClangdServer::outgoingCalls(
-    const CallHierarchyItem &Item,
-    Callback<std::vector<CallHierarchyOutgoingCall>> CB) {
-  WorkScheduler->run("Outgoing Calls", "",
-                     [CB = std::move(CB), Item, this]() mutable {
-                       CB(clangd::outgoingCalls(Item, Index));
-                     });
-}
-
 void ClangdServer::onFileEvent(const DidChangeWatchedFilesParams &Params) {
   // FIXME: Do nothing for now. This will be used for indexing and potentially
   // invalidating other caches.
diff --git a/clang-tools-extra/clangd/ClangdServer.h b/clang-tools-extra/clangd/ClangdServer.h
index 8b6618cf96ccfc..a653cdb56b751b 100644
--- a/clang-tools-extra/clangd/ClangdServer.h
+++ b/clang-tools-extra/clangd/ClangdServer.h
@@ -292,10 +292,6 @@ class ClangdServer {
   void incomingCalls(const CallHierarchyItem &Item,
                      Callback<std::vector<CallHierarchyIncomingCall>>);
 
-  /// Resolve outgoing calls for a given call hierarchy item.
-  void outgoingCalls(const CallHierarchyItem &Item,
-                     Callback<std::vector<CallHierarchyOutgoingCall>>);
-
   /// Resolve inlay hints for a given document.
   void inlayHints(PathRef File, std::optional<Range> RestrictRange,
                   Callback<std::vector<InlayHint>>);
diff --git a/clang-tools-extra/clangd/XRefs.cpp b/clang-tools-extra/clangd/XRefs.cpp
index d237d95b3eb655..61fa66180376cd 100644
--- a/clang-tools-extra/clangd/XRefs.cpp
+++ b/clang-tools-extra/clangd/XRefs.cpp
@@ -1702,7 +1702,6 @@ declToHierarchyItem(const NamedDecl &ND, llvm::StringRef TUPath) {
 
   HierarchyItem HI;
   HI.name = printName(Ctx, ND);
-  // FIXME: Populate HI.detail the way we do in symbolToHierarchyItem?
   HI.kind = SK;
   HI.range = Range{sourceLocToPosition(SM, DeclRange->getBegin()),
                    sourceLocToPosition(SM, DeclRange->getEnd())};
@@ -1754,7 +1753,6 @@ static std::optional<HierarchyItem> symbolToHierarchyItem(const Symbol &S,
   }
   HierarchyItem HI;
   HI.name = std::string(S.Name);
-  HI.detail = (S.Scope + S.Name).str();
   HI.kind = indexSymbolKindToSymbolKind(S.SymInfo.Kind);
   HI.selectionRange = Loc->range;
   // FIXME: Populate 'range' correctly
@@ -2321,63 +2319,6 @@ incomingCalls(const CallHierarchyItem &Item, const SymbolIndex *Index) {
   return Results;
 }
 
-std::vector<CallHierarchyOutgoingCall>
-outgoingCalls(const CallHierarchyItem &Item, const SymbolIndex *Index) {
-  std::vector<CallHierarchyOutgoingCall> Results;
-  if (!Index || Item.data.empty())
-    return Results;
-  auto ID = SymbolID::fromStr(Item.data);
-  if (!ID) {
-    elog("outgoingCalls failed to find symbol: {0}", ID.takeError());
-    return Results;
-  }
-  // In this function, we find outgoing calls based on the index only.
-  ContainedRefsRequest Request;
-  Request.ID = *ID;
-  // Initially store the ranges in a map keyed by SymbolID of the callee.
-  // This allows us to group different calls to the same function
-  // into the same CallHierarchyOutgoingCall.
-  llvm::DenseMap<SymbolID, std::vector<Range>> CallsOut;
-  // We can populate the ranges based on a refs request only. As we do so, we
-  // also accumulate the callee IDs into a lookup request.
-  LookupRequest CallsOutLookup;
-  Index->containedRefs(Request, [&](const auto &R) {
-    auto Loc = indexToLSPLocation(R.Location, Item.uri.file());
-    if (!Loc) {
-      elog("outgoingCalls failed to convert location: {0}", Loc.takeError());
-      return;
-    }
-    auto It = CallsOut.try_emplace(R.Symbol, std::vector<Range>{}).first;
-    It->second.push_back(Loc->range);
-
-    CallsOutLookup.IDs.insert(R.Symbol);
-  });
-  // Perform the lookup request and combine its results with CallsOut to
-  // get complete CallHierarchyOutgoingCall objects.
-  Index->lookup(CallsOutLookup, [&](const Symbol &Callee) {
-    // The containedRefs request should only return symbols which are
-    // function-like, i.e. symbols for which references to them can be "calls".
-    using SK = index::SymbolKind;
-    auto Kind = Callee.SymInfo.Kind;
-    assert(Kind == SK::Function || Kind == SK::InstanceMethod ||
-           Kind == SK::ClassMethod || Kind == SK::StaticMethod ||
-           Kind == SK::Constructor || Kind == SK::Destructor ||
-           Kind == SK::ConversionFunction);
-
-    auto It = CallsOut.find(Callee.ID);
-    assert(It != CallsOut.end());
-    if (auto CHI = symbolToCallHierarchyItem(Callee, Item.uri.file()))
-      Results.push_back(
-          CallHierarchyOutgoingCall{std::move(*CHI), std::move(It->second)});
-  });
-  // Sort results by name of the callee.
-  llvm::sort(Results, [](const CallHierarchyOutgoingCall &A,
-                         const CallHierarchyOutgoingCall &B) {
-    return A.to.name < B.to.name;
-  });
-  return Results;
-}
-
 llvm::DenseSet<const Decl *> getNonLocalDeclRefs(ParsedAST &AST,
                                                  const FunctionDecl *FD) {
   if (!FD->hasBody())
diff --git a/clang-tools-extra/clangd/XRefs.h b/clang-tools-extra/clangd/XRefs.h
index 247e52314c3f94..df91dd15303c18 100644
--- a/clang-tools-extra/clangd/XRefs.h
+++ b/clang-tools-extra/clangd/XRefs.h
@@ -150,9 +150,6 @@ prepareCallHierarchy(ParsedAST &AST, Position Pos, PathRef TUPath);
 std::vector<CallHierarchyIncomingCall>
 incomingCalls(const CallHierarchyItem &Item, const SymbolIndex *Index);
 
-std::vector<CallHierarchyOutgoingCall>
-outgoingCalls(const CallHierarchyItem &Item, const SymbolIndex *Index);
-
 /// Returns all decls that are referenced in the \p FD except local symbols.
 llvm::DenseSet<const Decl *> getNonLocalDeclRefs(ParsedAST &AST,
                                                  const FunctionDecl *FD);
diff --git a/clang-tools-extra/clangd/index/Index.cpp b/clang-tools-extra/clangd/index/Index.cpp
index 86dc6ed7633449..7a0c23287db225 100644
--- a/clang-tools-extra/clangd/index/Index.cpp
+++ b/clang-tools-extra/clangd/index/Index.cpp
@@ -66,11 +66,6 @@ bool SwapIndex::refs(const RefsRequest &R,
                      llvm::function_ref<void(const Ref &)> CB) const {
   return snapshot()->refs(R, CB);
 }
-bool SwapIndex::containedRefs(
-    const ContainedRefsRequest &R,
-    llvm::function_ref<void(const ContainedRefsResult &)> CB) const {
-  return snapshot()->containedRefs(R, CB);
-}
 void SwapIndex::relations(
     const RelationsRequest &R,
     llvm::function_ref<void(const SymbolID &, const Symbol &)> CB) const {
diff --git a/clang-tools-extra/clangd/index/Index.h b/clang-tools-extra/clangd/index/Index.h
index a193b1a191216a..047ce08e93e3ab 100644
--- a/clang-tools-extra/clangd/index/Index.h
+++ b/clang-tools-extra/clangd/index/Index.h
@@ -77,19 +77,6 @@ struct RefsRequest {
   bool WantContainer = false;
 };
 
-struct ContainedRefsRequest {
-  /// Note that RefKind::Call just restricts the matched SymbolKind to
-  /// functions, not the form of the reference (e.g. address-of-function,
-  /// which can indicate an indirect call, should still be caught).
-  static const RefKind SupportedRefKinds = RefKind::Call;
-
-  SymbolID ID;
-  /// If set, limit the number of refers returned from the index. The index may
-  /// choose to return less than this, e.g. it tries to avoid returning stale
-  /// results.
-  std::optional<uint32_t> Limit;
-};
-
 struct RelationsRequest {
   llvm::DenseSet<SymbolID> Subjects;
   RelationKind Predicate;
@@ -97,14 +84,6 @@ struct RelationsRequest {
   std::optional<uint32_t> Limit;
 };
 
-struct ContainedRefsResult {
-  /// The source location where the symbol is named.
-  SymbolLocation Location;
-  RefKind Kind = RefKind::Unknown;
-  /// The ID of the symbol which is referred to
-  SymbolID Symbol;
-};
-
 /// Describes what data is covered by an index.
 ///
 /// Indexes may contain symbols but not references from a file, etc.
@@ -162,17 +141,6 @@ class SymbolIndex {
   virtual bool refs(const RefsRequest &Req,
                     llvm::function_ref<void(const Ref &)> Callback) const = 0;
 
-  /// Find all symbols that are referenced by a symbol and apply
-  /// \p Callback on each result.
-  ///
-  /// Results should be returned in arbitrary order.
-  /// The returned result must be deep-copied if it's used outside Callback.
-  ///
-  /// Returns true if there will be more results (limited by Req.Limit);
-  virtual bool containedRefs(
-      const ContainedRefsRequest &Req,
-      llvm::function_ref<void(const ContainedRefsResult &)> Callback) const = 0;
-
   /// Finds all relations (S, P, O) stored in the index such that S is among
   /// Req.Subjects and P is Req.Predicate, and invokes \p Callback for (S, O) in
   /// each.
@@ -207,9 +175,6 @@ class SwapIndex : public SymbolIndex {
               llvm::function_ref<void(const Symbol &)>) const override;
   bool refs(const RefsRequest &,
             llvm::function_ref<void(const Ref &)>) const override;
-  bool containedRefs(
-      const ContainedRefsRequest &,
-      llvm::function_ref<void(const ContainedRefsResult &)>) const override;
   void relations(const RelationsRequest &,
                  llvm::function_ref<void(const SymbolID &, const Symbol &)>)
       const override;
diff --git a/clang-tools-extra/clangd/index/MemIndex.cpp b/clang-tools-extra/clangd/index/MemIndex.cpp
index 9c9d3942bdee63..2665d46b97d839 100644
--- a/clang-tools-extra/clangd/index/MemIndex.cpp
+++ b/clang-tools-extra/clangd/index/MemIndex.cpp
@@ -9,7 +9,6 @@
 #include "MemIndex.h"
 #include "FuzzyMatch.h"
 #include "Quality.h"
-#include "index/Index.h"
 #include "support/Trace.h"
 
 namespace clang {
@@ -86,25 +85,6 @@ bool MemIndex::refs(const RefsRequest &Req,
   return false; // We reported all refs.
 }
 
-bool MemIndex::containedRefs(
-    const ContainedRefsRequest &Req,
-    llvm::function_ref<void(const ContainedRefsResult &)> Callback) const {
-  trace::Span Tracer("MemIndex refersTo");
-  uint32_t Remaining = Req.Limit.value_or(std::numeric_limits<uint32_t>::max());
-  for (const auto &Pair : Refs) {
-    for (const auto &R : Pair.second) {
-      if (!static_cast<int>(ContainedRefsRequest::SupportedRefKinds & R.Kind) ||
-          Req.ID != R.Container)
-        continue;
-      if (Remaining == 0)
-        return true; // More refs were available.
-      --Remaining;
-      Callback({R.Location, R.Kind, Pair.first});
-    }
-  }
-  return false; // We reported all refs.
-}
-
 void MemIndex::relations(
     const RelationsRequest &Req,
     llvm::function_ref<void(const SymbolID &, const Symbol &)> Callback) const {
diff --git a/clang-tools-extra/clangd/index/MemIndex.h b/clang-tools-extra/clangd/index/MemIndex.h
index 8f390c5028dc4d..fba2c1a7120a2b 100644
--- a/clang-tools-extra/clangd/index/MemIndex.h
+++ b/clang-tools-extra/clangd/index/MemIndex.h
@@ -72,10 +72,6 @@ class MemIndex : public SymbolIndex {
   bool refs(const RefsRequest &Req,
             llvm::function_ref<void(const Ref &)> Callback) const override;
 
-  bool containedRefs(const ContainedRefsRequest &Req,
-                     llvm::function_ref<void(const ContainedRefsResult &)>
-                         Callback) const override;
-
   void relations(const RelationsRequest &Req,
                  llvm::function_ref<void(const SymbolID &, const Symbol &)>
                      Callback) const override;
diff --git a/clang-tools-extra/clangd/index/Merge.cpp b/clang-tools-extra/clangd/index/Merge.cpp
index aecca38a885b66..8221d4b1f44405 100644
--- a/clang-tools-extra/clangd/index/Merge.cpp
+++ b/clang-tools-extra/clangd/index/Merge.cpp
@@ -155,40 +155,6 @@ bool MergedIndex::refs(const RefsRequest &Req,
   return More || StaticHadMore;
 }
 
-bool MergedIndex::containedRefs(
-    const ContainedRefsRequest &Req,
-    llvm::function_ref<void(const ContainedRefsResult &)> Callback) const {
-  trace::Span Tracer("MergedIndex refersTo");
-  bool More = false;
-  uint32_t Remaining = Req.Limit.value_or(std::numeric_limits<uint32_t>::max());
-  // We don't want duplicated refs from the static/dynamic indexes,
-  // and we can't reliably deduplicate them because offsets may differ slightly.
-  // We consider the dynamic index authoritative and report all its refs,
-  // and only report static index refs from other files.
-  More |= Dynamic->containedRefs(Req, [&](const auto &O) {
-    Callback(O);
-    assert(Remaining != 0);
-    --Remaining;
-  });
-  if (Remaining == 0 && More)
-    return More;
-  auto DynamicContainsFile = Dynamic->indexedFiles();
-  // We return less than Req.Limit if static index returns more refs for dirty
-  // files.
-  bool StaticHadMore = Static->containedRefs(Req, [&](const auto &O) {
-    if ((DynamicContainsFile(O.Location.FileURI) & IndexContents::References) !=
-        IndexContents::None)
-      return; // ignore refs that have been seen from dynamic index.
-    if (Remaining == 0) {
-      More = true;
-      return;
-    }
-    --Remaining;
-    Callback(O);
-  });
-  return More || StaticHadMore;
-}
-
 llvm::unique_function<IndexContents(llvm::StringRef) const>
 MergedIndex::indexedFiles() const {
   return [DynamicContainsFile{Dynamic->indexedFiles()},
diff --git a/clang-tools-extra/clangd/index/Merge.h b/clang-tools-extra/clangd/index/Merge.h
index 7441be6e57e854..b8a562b0df5d92 100644
--- a/clang-tools-extra/clangd/index/Merge.h
+++ b/clang-tools-extra/clangd/index/Merge.h
@@ -38,9 +38,6 @@ class MergedIndex : public SymbolIndex {
               llvm::function_ref<void(const Symbol &)>) const override;
   bool refs(const RefsRequest &,
             llvm::function_ref<void(const Ref &)>) const override;
-  bool containedRefs(
-      const ContainedRefsRequest &,
-      llvm::function_ref<void(const ContainedRefsResult &)>) const override;
   void relations(const RelationsRequest &,
                  llvm::function_ref<void(const SymbolID &, const Symbol &)>)
       const override;
diff --git a/clang-tools-extra/clangd/index/ProjectAware.cpp b/clang-tools-extra/clangd/index/ProjectAware.cpp
index 9836f0130362a0..2c6f8273b35d0e 100644
--- a/clang-tools-extra/clangd/index/ProjectAware.cpp
+++ b/clang-tools-extra/clangd/index/ProjectAware.cpp
@@ -35,10 +35,6 @@ class ProjectAwareIndex : public SymbolIndex {
   /// Query all indexes while prioritizing the associated one (if any).
   bool refs(const RefsRequest &Req,
             llvm::function_ref<void(const Ref &)> Callback) const override;
-  /// Query all indexes while prioritizing the associated one (if any).
-  bool containedRefs(const ContainedRefsRequest &Req,
-                     llvm::function_ref<void(const ContainedRefsResult &)>
-                         Callback) const override;
 
   /// Queries only the associates index when Req.RestrictForCodeCompletion is
   /// set, otherwise queries all.
@@ -98,15 +94,6 @@ bool ProjectAwareIndex::refs(
   return false;
 }
 
-bool ProjectAwareIndex::containedRefs(
-    const ContainedRefsRequest &Req,
-    llvm::function_ref<void(const ContainedRefsResult &)> Callback) const {
-  trace::Span Tracer("ProjectAwareIndex::refersTo");
-  if (auto *Idx = getIndex())
-    return Idx->containedRefs(Req, Callback);
-  return false;
-}
-
 bool ProjectAwareIndex::fuzzyFind(
     const FuzzyFindRequest &Req,
     llvm::function_ref<void(const Symbol &)> Callback) const {
diff --git a/clang-tools-extra/clangd/index/Ref.h b/clang-tools-extra/clangd/index/Ref.h
index 870f77f56e6cb3..6e383e2ade3d25 100644
--- a/clang-tools-extra/clangd/index/Ref.h
+++ b/clang-tools-extra/clangd/index/Ref.h
@@ -63,9 +63,6 @@ enum class RefKind : uint8_t {
   //   ^ this references Foo, but does not explicitly spell out its name
   // };
   Spelled = 1 << 3,
-  // A reference which is a call. Used as a filter for which references
-  // to store in data structures used for computing outgoing calls.
-  Call = 1 << 4,
   All = Declaration | Definition | Reference | Spelled,
 };
 
diff --git a/clang-tools-extra/clangd/index/SymbolCollector.cpp b/clang-tools-extra/clangd/index/SymbolCollector.cpp
index 81125dbb1aeafc..91ae9d3003a971 100644
--- a/clang-tools-extra/clangd/index/SymbolCollector.cpp
+++ b/clang-tools-extra/clangd/index/SymbolCollector.cpp
@@ -18,7 +18,6 @@
 #include "clang-include-cleaner/Record.h"
 #include "clang-include-cleaner/Types.h"
 #include "index/CanonicalIncludes.h"
-#include "index/Ref.h"
 #include "index/Relation.h"
 #include "index/Symbol.h"
 #include "index/SymbolID.h"
@@ -661,7 +660,7 @@ bool SymbolCollector::handleDeclOccurrence(
     auto FileLoc = SM.getFileLoc(Loc);
     auto FID = SM.getFileID(FileLoc);
     if (Opts.RefsInHeaders || FID == SM.getMainFileID()) {
-      addRef(ID, SymbolRef{FileLoc, FID, Roles, index::getSymbolInfo(ND).Kind,
+      addRef(ID, SymbolRef{FileLoc, FID, Roles,
                            getRefContainer(ASTNode.Parent, Opts),
                            isSpelled(FileLoc, *ND)});
     }
@@ -775,10 +774,8 @@ bool SymbolCollector::handleMacroOccurrence(const IdentifierInfo *Name,
     // FIXME: Populate container information for macro references.
     // FIXME: All MacroRefs are marked as Spelled now, but this should be
     // checked.
-    addRef(ID,
-           SymbolRef{Loc, SM.getFileID(Loc), Roles, index::SymbolKind::Macro,
-                     /*Container=*/nullptr,
-                     /*Spelled=*/true});
+    addRef(ID, SymbolRef{Loc, SM.getFileID(Loc), Roles, /*Container=*/nullptr,
+                         /*Spelled=*/true});
   }
 
   // Collect symbols.
@@ -1169,14 +1166,6 @@ bool SymbolCollector::shouldIndexFile(FileID FID) {
   return I.first->second;
 }
 
-static bool refIsCall(index::SymbolKind Kind) {
-  using SK = index::SymbolKind;
-  return Kind == SK::Function || Kind == SK::InstanceMethod ||
-         Kind == SK::ClassMethod || Kind == SK::StaticMethod ||
-         Kind == SK::Constructor || Kind == SK::Destructor ||
-         Kind == SK::ConversionFunction;
-}
-
 void SymbolCollector::addRef(SymbolID ID, const SymbolRef &SR) {
   const auto &SM = ASTCtx->getSourceManager();
   // FIXME: use the result to filter out references.
@@ -1188,9 +1177,6 @@ void SymbolCollector::addRef(SymbolID ID, const SymbolRef &SR) {
     R.Location.End = Range.second;
     R.Location.FileURI = HeaderFileURIs->toURI(*FE).c_str();
     R.Kind = toRefKind(SR.Roles, SR.Spelled);
-    if (refIsCall(SR.Kind)) {
-      R.Kind |= RefKind::Call;
-    }
     R.Container = getSymbolIDCached(SR.Container);
     Refs.insert(ID, R);
   }
diff --git a/clang-tools-extra/clangd/index/SymbolCollector.h b/clang-tools-extra/clangd/index/SymbolCollector.h
index e9eb27fd0f6648..6ff7a0145ff874 100644
--- a/clang-tools-extra/clangd/index/SymbolCollector.h
+++ b/clang-tools-extra/clangd/index/SymbolCollector.h
@@ -209,7 +209,6 @@ class SymbolCollector : public index::IndexDataConsumer {
     SourceLocation Loc;
     FileID FID;
     index::SymbolRoleSet Roles;
-    index::SymbolKind Kind;
     const Decl *Container;
     bool Spelled;
   };
diff --git a/clang-tools-extra/clangd/index/dex/Dex.cpp b/clang-tools-extra/clangd/index/dex/Dex.cpp
index 9c02e88900b07d..b7d3063e19b499 100644
--- a/clang-tools-extra/clangd/index/dex/Dex.cpp
+++ b/clang-tools-extra/clangd/index/dex/Dex.cpp
@@ -147,17 +147,6 @@ void Dex::buildIndex() {
   for (DocID SymbolRank = 0; SymbolRank < Symbols.size(); ++SymbolRank)
     Builder.add(*Symbols[SymbolRank], SymbolRank);
   InvertedIndex = std::move(Builder).build();
-
-  // Build RevRefs
-  for (const auto &[ID, RefList] : Refs)
-    for (const auto &R : RefList)
-      if ((R.Kind & ContainedRefsRequest::SupportedRefKinds) !=
-          RefKind::Unknown)
-        RevRefs.emplace_back(R, ID);
-  // Sort by container ID so we can use binary search for lookup.
-  llvm::sort(RevRefs, [](const RevRef &A, const RevRef &B) {
-    return A.ref().Container < B.ref().Container;
-  });
 }
 
 std::unique_ptr<Iterator> Dex::iterator(const Token &Tok) const {
@@ -325,36 +314,6 @@ bool Dex::refs(const RefsRequest &Req,
   return false; // We reported all refs.
 }
 
-llvm::iterator_range<std::vector<Dex::RevRef>::const_iterator>
-Dex::lookupRevRefs(const SymbolID &Container) const {
-  // equal_range() requires an element of the same type as the elements of the
-  // range, so construct a dummy RevRef with the container of interest.
-  Ref QueryRef;
-  QueryRef.Container = Container;
-  RevRef Query(QueryRef, SymbolID{});
-
-  auto ItPair = std::equal_range(RevRefs.cbegin(), RevRefs.cend(), Query,
-                                 [](const RevRef &A, const RevRef &B) {
-                                   return A.ref().Container < B.ref().Container;
-                                 });
-  return {ItPair.first, ItPair.second};
-}
-
-bool Dex::containedRefs(
-    const ContainedRefsRequest &Req,
-    llvm::function_ref<void(const ContainedRefsResult &)> Callback) const {
-  trace::Span Tracer("Dex reversed refs");
-  uint32_t Remaining = Req.Limit.value_or(std::numeric_limits<uint32_t>::max());
-  for (const auto &Rev : lookupRevRefs(Req.ID)) {
-    // RevRefs are already filtered to ContainedRefsRequest::SupportedRefKinds
-    if (Remaining == 0)
-      return true; // More refs were available.
-    --Remaining;
-    Callback(Rev.containedRefsResult());
-  }
-  return false; // We reported all refs.
-}
-
 void Dex::relations(
     const RelationsRequest &Req,
     llvm::function_ref<void(const SymbolID &, const Symbol &)> Callback) const {
@@ -391,7 +350,6 @@ size_t Dex::estimateMemoryUsage() const {
   for (const auto &TokenToPostingList : InvertedIndex)
     Bytes += TokenToPostingList.second.bytes();
   Bytes += Refs.getMemorySize();
-  Bytes += RevRefs.size() * sizeof(RevRef);
   Bytes += Relations.getMemorySize();
   return Bytes + BackingDataSize;
 }
diff --git a/clang-tools-extra/clangd/index/dex/Dex.h b/clang-tools-extra/clangd/index/dex/Dex.h
index b0799ec9bae34e..69e161d51135b6 100644
--- a/clang-tools-extra/clangd/index/dex/Dex.h
+++ b/clang-tools-extra/clangd/index/dex/Dex.h
@@ -85,10 +85,6 @@ class Dex : public SymbolIndex {
   bool refs(const RefsRequest &Req,
             llvm::function_ref<void(const Ref &)> Callback) const override;
 
-  bool containedRefs(const ContainedRefsRequest &Req,
-                     llvm::function_ref<void(const ContainedRefsResult &)>
-                         Callback) const override;
-
   void relations(const RelationsRequest &Req,
                  llvm::function_ref<void(const SymbolID &, const Symbol &)>
                      Callback) const override;
@@ -99,22 +95,7 @@ class Dex : public SymbolIndex {
   size_t estimateMemoryUsage() const override;
 
 private:
-  class RevRef {
-    const Ref *Reference;
-    SymbolID Target;
-
-  public:
-    RevRef(const Ref &Reference, SymbolID Target)
-        : Reference(&Reference), Target(Target) {}
-    const Ref &ref() const { return *Reference; }
-    ContainedRefsResult containedRefsResult() const {
-      return {ref().Location, ref().Kind, Target};
-    }
-  };
-
   void buildIndex();
-  llvm::iterator_range<std::vector<RevRef>::const_iterator>
-  lookupRevRefs(const SymbolID &Container) const;
   std::unique_ptr<Iterator> iterator(const Token &Tok) const;
   std::unique_ptr<Iterator>
   createFileProximityIterator(llvm::ArrayRef<std::string> ProximityPaths) const;
@@ -135,7 +116,6 @@ class Dex : public SymbolIndex {
   llvm::DenseMap<Token, PostingList> InvertedIndex;
   dex::Corpus Corpus;
   llvm::DenseMap<SymbolID, llvm::ArrayRef<Ref>> Refs;
-  std::vector<RevRef> RevRefs; // sorted by container ID
   static_assert(sizeof(RelationKind) == sizeof(uint8_t),
                 "RelationKind should be of same size as a uint8_t");
   llvm::DenseMap<std::pair<SymbolID, uint8_t>, std::vector<SymbolID>> Relations;
diff --git a/clang-tools-extra/clangd/test/type-hierarchy-ext.test b/clang-tools-extra/clangd/test/type-hierarchy-ext.test
index 8d1a5dc31da0f1..ddb9a014be0c72 100644
--- a/clang-tools-extra/clangd/test/type-hierarchy-ext.test
+++ b/clang-tools-extra/clangd/test/type-hierarchy-ext.test
@@ -12,7 +12,6 @@
 # CHECK-NEXT:        "data": {
 # CHECK-NEXT:           "symbolID": "A6576FE083F2949A"
 # CHECK-NEXT:        },
-# CHECK-NEXT:        "detail": "Child3",
 # CHECK-NEXT:        "kind": 23,
 # CHECK-NEXT:        "name": "Child3",
 # CHECK-NEXT:        "range": {
@@ -154,7 +153,6 @@
 # CHECK-NEXT:        "data": {
 # CHECK-NEXT:          "symbolID": "5705B382DFC77CBC"
 # CHECK-NEXT:        },
-# CHECK-NEXT:        "detail": "Child4",
 # CHECK-NEXT:        "kind": 23,
 # CHECK-NEXT:        "name": "Child4",
 # CHECK-NEXT:        "range": {
diff --git a/clang-tools-extra/clangd/test/type-hierarchy.test b/clang-tools-extra/clangd/test/type-hierarchy.test
index a5f13ab13d0b3f..69751000a7c6c0 100644
--- a/clang-tools-extra/clangd/test/type-hierarchy.test
+++ b/clang-tools-extra/clangd/test/type-hierarchy.test
@@ -62,7 +62,6 @@
 # CHECK-NEXT:         ],
 # CHECK-NEXT:         "symbolID": "ECDC0C46D75120F4"
 # CHECK-NEXT:       },
-# CHECK-NEXT:       "detail": "Child1",
 # CHECK-NEXT:       "kind": 23,
 # CHECK-NEXT:       "name": "Child1",
 # CHECK-NEXT:       "range": {
@@ -113,7 +112,6 @@
 # CHECK-NEXT:        ],
 # CHECK-NEXT:        "symbolID": "A6576FE083F2949A"
 # CHECK-NEXT:       },
-# CHECK-NEXT:       "detail": "Child3",
 # CHECK-NEXT:       "kind": 23,
 # CHECK-NEXT:       "name": "Child3",
 # CHECK-NEXT:       "range": {
diff --git a/clang-tools-extra/clangd/unittests/CallHierarchyTests.cpp b/clang-tools-extra/clangd/unittests/CallHierarchyTests.cpp
index e086e3a6ce3caa..8821d3aad9c784 100644
--- a/clang-tools-extra/clangd/unittests/CallHierarchyTests.cpp
+++ b/clang-tools-extra/clangd/unittests/CallHierarchyTests.cpp
@@ -44,27 +44,17 @@ using ::testing::UnorderedElementsAre;
 
 // Helpers for matching call hierarchy data structures.
 MATCHER_P(withName, N, "") { return arg.name == N; }
-MATCHER_P(withDetail, N, "") { return arg.detail == N; }
 MATCHER_P(withSelectionRange, R, "") { return arg.selectionRange == R; }
 
 template <class ItemMatcher>
 ::testing::Matcher<CallHierarchyIncomingCall> from(ItemMatcher M) {
   return Field(&CallHierarchyIncomingCall::from, M);
 }
-template <class ItemMatcher>
-::testing::Matcher<CallHierarchyOutgoingCall> to(ItemMatcher M) {
-  return Field(&CallHierarchyOutgoingCall::to, M);
-}
 template <class... RangeMatchers>
-::testing::Matcher<CallHierarchyIncomingCall> iFromRanges(RangeMatchers... M) {
+::testing::Matcher<CallHierarchyIncomingCall> fromRanges(RangeMatchers... M) {
   return Field(&CallHierarchyIncomingCall::fromRanges,
                UnorderedElementsAre(M...));
 }
-template <class... RangeMatchers>
-::testing::Matcher<CallHierarchyOutgoingCall> oFromRanges(RangeMatchers... M) {
-  return Field(&CallHierarchyOutgoingCall::fromRanges,
-               UnorderedElementsAre(M...));
-}
 
 TEST(CallHierarchy, IncomingOneFileCpp) {
   Annotations Source(R"cpp(
@@ -89,24 +79,21 @@ TEST(CallHierarchy, IncomingOneFileCpp) {
       prepareCallHierarchy(AST, Source.point(), testPath(TU.Filename));
   ASSERT_THAT(Items, ElementsAre(withName("callee")));
   auto IncomingLevel1 = incomingCalls(Items[0], Index.get());
-  ASSERT_THAT(
-      IncomingLevel1,
-      ElementsAre(AllOf(from(AllOf(withName("caller1"), withDetail("caller1"))),
-                        iFromRanges(Source.range("Callee")))));
+  ASSERT_THAT(IncomingLevel1,
+              ElementsAre(AllOf(from(withName("caller1")),
+                                fromRanges(Source.range("Callee")))));
   auto IncomingLevel2 = incomingCalls(IncomingLevel1[0].from, Index.get());
-  ASSERT_THAT(
-      IncomingLevel2,
-      ElementsAre(AllOf(from(AllOf(withName("caller2"), withDetail("caller2"))),
-                        iFromRanges(Source.range("Caller1A"),
-                                    Source.range("Caller1B"))),
-                  AllOf(from(AllOf(withName("caller3"), withDetail("caller3"))),
-                        iFromRanges(Source.range("Caller1C")))));
+  ASSERT_THAT(IncomingLevel2,
+              ElementsAre(AllOf(from(withName("caller2")),
+                                fromRanges(Source.range("Caller1A"),
+                                           Source.range("Caller1B"))),
+                          AllOf(from(withName("caller3")),
+                                fromRanges(Source.range("Caller1C")))));
 
   auto IncomingLevel3 = incomingCalls(IncomingLevel2[0].from, Index.get());
-  ASSERT_THAT(
-      IncomingLevel3,
-      ElementsAre(AllOf(from(AllOf(withName("caller3"), withDetail("caller3"))),
-                        iFromRanges(Source.range("Caller2")))));
+  ASSERT_THAT(IncomingLevel3,
+              ElementsAre(AllOf(from(withName("caller3")),
+                                fromRanges(Source.range("Caller2")))));
 
   auto IncomingLevel4 = incomingCalls(IncomingLevel3[0].from, Index.get());
   EXPECT_THAT(IncomingLevel4, IsEmpty());
@@ -138,24 +125,20 @@ TEST(CallHierarchy, IncomingOneFileObjC) {
   ASSERT_THAT(Items, ElementsAre(withName("callee")));
   auto IncomingLevel1 = incomingCalls(Items[0], Index.get());
   ASSERT_THAT(IncomingLevel1,
-              ElementsAre(AllOf(from(AllOf(withName("caller1"),
-                                           withDetail("MyClass::caller1"))),
-                                iFromRanges(Source.range("Callee")))));
+              ElementsAre(AllOf(from(withName("caller1")),
+                                fromRanges(Source.range("Callee")))));
   auto IncomingLevel2 = incomingCalls(IncomingLevel1[0].from, Index.get());
   ASSERT_THAT(IncomingLevel2,
-              ElementsAre(AllOf(from(AllOf(withName("caller2"),
-                                           withDetail("MyClass::caller2"))),
-                                iFromRanges(Source.range("Caller1A"),
-                                            Source.range("Caller1B"))),
-                          AllOf(from(AllOf(withName("caller3"),
-                                           withDetail("MyClass::caller3"))),
-                                iFromRanges(Source.range("Caller1C")))));
+              ElementsAre(AllOf(from(withName("caller2")),
+                                fromRanges(Source.range("Caller1A"),
+                                           Source.range("Caller1B"))),
+                          AllOf(from(withName("caller3")),
+                                fromRanges(Source.range("Caller1C")))));
 
   auto IncomingLevel3 = incomingCalls(IncomingLevel2[0].from, Index.get());
   ASSERT_THAT(IncomingLevel3,
-              ElementsAre(AllOf(from(AllOf(withName("caller3"),
-                                           withDetail("MyClass::caller3"))),
-                                iFromRanges(Source.range("Caller2")))));
+              ElementsAre(AllOf(from(withName("caller3")),
+                                fromRanges(Source.range("Caller2")))));
 
   auto IncomingLevel4 = incomingCalls(IncomingLevel3[0].from, Index.get());
   EXPECT_THAT(IncomingLevel4, IsEmpty());
@@ -184,16 +167,14 @@ TEST(CallHierarchy, MainFileOnlyRef) {
       prepareCallHierarchy(AST, Source.point(), testPath(TU.Filename));
   ASSERT_THAT(Items, ElementsAre(withName("callee")));
   auto IncomingLevel1 = incomingCalls(Items[0], Index.get());
-  ASSERT_THAT(
-      IncomingLevel1,
-      ElementsAre(AllOf(from(AllOf(withName("caller1"), withDetail("caller1"))),
-                        iFromRanges(Source.range("Callee")))));
+  ASSERT_THAT(IncomingLevel1,
+              ElementsAre(AllOf(from(withName("caller1")),
+                                fromRanges(Source.range("Callee")))));
 
   auto IncomingLevel2 = incomingCalls(IncomingLevel1[0].from, Index.get());
-  EXPECT_THAT(
-      IncomingLevel2,
-      ElementsAre(AllOf(from(AllOf(withName("caller2"), withDetail("caller2"))),
-                        iFromRanges(Source.range("Caller1")))));
+  EXPECT_THAT(IncomingLevel2,
+              ElementsAre(AllOf(from(withName("caller2")),
+                                fromRanges(Source.range("Caller1")))));
 }
 
 TEST(CallHierarchy, IncomingQualified) {
@@ -219,72 +200,14 @@ TEST(CallHierarchy, IncomingQualified) {
       prepareCallHierarchy(AST, Source.point(), testPath(TU.Filename));
   ASSERT_THAT(Items, ElementsAre(withName("Waldo::find")));
   auto Incoming = incomingCalls(Items[0], Index.get());
-  EXPECT_THAT(
-      Incoming,
-      ElementsAre(
-          AllOf(from(AllOf(withName("caller1"), withDetail("ns::caller1"))),
-                iFromRanges(Source.range("Caller1"))),
-          AllOf(from(AllOf(withName("caller2"), withDetail("ns::caller2"))),
-                iFromRanges(Source.range("Caller2")))));
-}
-
-TEST(CallHierarchy, OutgoingOneFile) {
-  // Test outgoing call on the main file, with namespaces and methods
-  Annotations Source(R"cpp(
-    void callee(int);
-    namespace ns {
-      struct Foo {
-        void caller1();
-      };
-      void Foo::caller1() {
-        $Callee[[callee]](42);
-      }
-    }
-    namespace {
-      void caller2(ns::Foo& F) {
-        F.$Caller1A[[caller1]]();
-        F.$Caller1B[[caller1]]();
-      }
-    }
-    void call^er3(ns::Foo& F) {
-      F.$Caller1C[[caller1]]();
-      $Caller2[[caller2]](F);
-    }
-  )cpp");
-  TestTU TU = TestTU::withCode(Source.code());
-  auto AST = TU.build();
-  auto Index = TU.index();
-
-  std::vector<CallHierarchyItem> Items =
-      prepareCallHierarchy(AST, Source.point(), testPath(TU.Filename));
-  ASSERT_THAT(Items, ElementsAre(withName("caller3")));
-  auto OugoingLevel1 = outgoingCalls(Items[0], Index.get());
-  ASSERT_THAT(
-      OugoingLevel1,
-      ElementsAre(
-          AllOf(to(AllOf(withName("caller1"), withDetail("ns::Foo::caller1"))),
-                oFromRanges(Source.range("Caller1C"))),
-          AllOf(to(AllOf(withName("caller2"), withDetail("caller2"))),
-                oFromRanges(Source.range("Caller2")))));
-
-  auto OutgoingLevel2 = outgoingCalls(OugoingLevel1[1].to, Index.get());
-  ASSERT_THAT(
-      OutgoingLevel2,
-      ElementsAre(AllOf(
-          to(AllOf(withName("caller1"), withDetail("ns::Foo::caller1"))),
-          oFromRanges(Source.range("Caller1A"), Source.range("Caller1B")))));
-
-  auto OutgoingLevel3 = outgoingCalls(OutgoingLevel2[0].to, Index.get());
-  ASSERT_THAT(
-      OutgoingLevel3,
-      ElementsAre(AllOf(to(AllOf(withName("callee"), withDetail("callee"))),
-                        oFromRanges(Source.range("Callee")))));
-
-  auto OutgoingLevel4 = outgoingCalls(OutgoingLevel3[0].to, Index.get());
-  EXPECT_THAT(OutgoingLevel4, IsEmpty());
+  EXPECT_THAT(Incoming,
+              ElementsAre(AllOf(from(withName("caller1")),
+                                fromRanges(Source.range("Caller1"))),
+                          AllOf(from(withName("caller2")),
+                                fromRanges(Source.range("Caller2")))));
 }
 
-TEST(CallHierarchy, MultiFileCpp) {
+TEST(CallHierarchy, IncomingMultiFileCpp) {
   // The test uses a .hh suffix for header files to get clang
   // to parse them in C++ mode. .h files are parsed in C mode
   // by default, which causes problems because e.g. symbol
@@ -298,47 +221,32 @@ TEST(CallHierarchy, MultiFileCpp) {
     void calle^e(int) {}
   )cpp");
   Annotations Caller1H(R"cpp(
-    namespace nsa {
-      void caller1();
-    }
+    void caller1();
   )cpp");
   Annotations Caller1C(R"cpp(
     #include "callee.hh"
     #include "caller1.hh"
-    namespace nsa {
-      void caller1() {
-        [[calle^e]](42);
-      }
+    void caller1() {
+      [[calle^e]](42);
     }
   )cpp");
   Annotations Caller2H(R"cpp(
-    namespace nsb {
-      void caller2();
-    }
+    void caller2();
   )cpp");
   Annotations Caller2C(R"cpp(
     #include "caller1.hh"
     #include "caller2.hh"
-    namespace nsb {
-      void caller2() {
-        nsa::$A[[caller1]]();
-        nsa::$B[[caller1]]();
-      }
-    }
-  )cpp");
-  Annotations Caller3H(R"cpp(
-    namespace nsa {
-      void call^er3();
+    void caller2() {
+      $A[[caller1]]();
+      $B[[caller1]]();
     }
   )cpp");
   Annotations Caller3C(R"cpp(
     #include "caller1.hh"
     #include "caller2.hh"
-    namespace nsa {
-      void call^er3() {
-        $Caller1[[caller1]]();
-        nsb::$Caller2[[caller2]]();
-      }
+    void caller3() {
+      $Caller1[[caller1]]();
+      $Caller2[[caller2]]();
     }
   )cpp");
 
@@ -346,7 +254,6 @@ TEST(CallHierarchy, MultiFileCpp) {
   Workspace.addSource("callee.hh", CalleeH.code());
   Workspace.addSource("caller1.hh", Caller1H.code());
   Workspace.addSource("caller2.hh", Caller2H.code());
-  Workspace.addSource("caller3.hh", Caller3H.code());
   Workspace.addMainFile("callee.cc", CalleeC.code());
   Workspace.addMainFile("caller1.cc", Caller1C.code());
   Workspace.addMainFile("caller2.cc", Caller2C.code());
@@ -354,84 +261,46 @@ TEST(CallHierarchy, MultiFileCpp) {
 
   auto Index = Workspace.index();
 
-  auto CheckIncomingCalls = [&](ParsedAST &AST, Position Pos, PathRef TUPath) {
+  auto CheckCallHierarchy = [&](ParsedAST &AST, Position Pos, PathRef TUPath) {
     std::vector<CallHierarchyItem> Items =
         prepareCallHierarchy(AST, Pos, TUPath);
     ASSERT_THAT(Items, ElementsAre(withName("callee")));
     auto IncomingLevel1 = incomingCalls(Items[0], Index.get());
     ASSERT_THAT(IncomingLevel1,
-                ElementsAre(AllOf(from(AllOf(withName("caller1"),
-                                             withDetail("nsa::caller1"))),
-                                  iFromRanges(Caller1C.range()))));
+                ElementsAre(AllOf(from(withName("caller1")),
+                                  fromRanges(Caller1C.range()))));
 
     auto IncomingLevel2 = incomingCalls(IncomingLevel1[0].from, Index.get());
     ASSERT_THAT(
         IncomingLevel2,
-        ElementsAre(
-            AllOf(from(AllOf(withName("caller2"), withDetail("nsb::caller2"))),
-                  iFromRanges(Caller2C.range("A"), Caller2C.range("B"))),
-            AllOf(from(AllOf(withName("caller3"), withDetail("nsa::caller3"))),
-                  iFromRanges(Caller3C.range("Caller1")))));
+        ElementsAre(AllOf(from(withName("caller2")),
+                          fromRanges(Caller2C.range("A"), Caller2C.range("B"))),
+                    AllOf(from(withName("caller3")),
+                          fromRanges(Caller3C.range("Caller1")))));
 
     auto IncomingLevel3 = incomingCalls(IncomingLevel2[0].from, Index.get());
     ASSERT_THAT(IncomingLevel3,
-                ElementsAre(AllOf(from(AllOf(withName("caller3"),
-                                             withDetail("nsa::caller3"))),
-                                  iFromRanges(Caller3C.range("Caller2")))));
+                ElementsAre(AllOf(from(withName("caller3")),
+                                  fromRanges(Caller3C.range("Caller2")))));
 
     auto IncomingLevel4 = incomingCalls(IncomingLevel3[0].from, Index.get());
     EXPECT_THAT(IncomingLevel4, IsEmpty());
   };
 
-  auto CheckOutgoingCalls = [&](ParsedAST &AST, Position Pos, PathRef TUPath) {
-    std::vector<CallHierarchyItem> Items =
-        prepareCallHierarchy(AST, Pos, TUPath);
-    ASSERT_THAT(Items, ElementsAre(withName("caller3")));
-    auto OutgoingLevel1 = outgoingCalls(Items[0], Index.get());
-    ASSERT_THAT(
-        OutgoingLevel1,
-        ElementsAre(
-            AllOf(to(AllOf(withName("caller1"), withDetail("nsa::caller1"))),
-                  oFromRanges(Caller3C.range("Caller1"))),
-            AllOf(to(AllOf(withName("caller2"), withDetail("nsb::caller2"))),
-                  oFromRanges(Caller3C.range("Caller2")))));
-
-    auto OutgoingLevel2 = outgoingCalls(OutgoingLevel1[1].to, Index.get());
-    ASSERT_THAT(OutgoingLevel2,
-                ElementsAre(AllOf(
-                    to(AllOf(withName("caller1"), withDetail("nsa::caller1"))),
-                    oFromRanges(Caller2C.range("A"), Caller2C.range("B")))));
-
-    auto OutgoingLevel3 = outgoingCalls(OutgoingLevel2[0].to, Index.get());
-    ASSERT_THAT(
-        OutgoingLevel3,
-        ElementsAre(AllOf(to(AllOf(withName("callee"), withDetail("callee"))),
-                          oFromRanges(Caller1C.range()))));
-
-    auto OutgoingLevel4 = outgoingCalls(OutgoingLevel3[0].to, Index.get());
-    EXPECT_THAT(OutgoingLevel4, IsEmpty());
-  };
-
   // Check that invoking from a call site works.
   auto AST = Workspace.openFile("caller1.cc");
   ASSERT_TRUE(bool(AST));
-  CheckIncomingCalls(*AST, Caller1C.point(), testPath("caller1.cc"));
+  CheckCallHierarchy(*AST, Caller1C.point(), testPath("caller1.cc"));
 
   // Check that invoking from the declaration site works.
   AST = Workspace.openFile("callee.hh");
   ASSERT_TRUE(bool(AST));
-  CheckIncomingCalls(*AST, CalleeH.point(), testPath("callee.hh"));
-  AST = Workspace.openFile("caller3.hh");
-  ASSERT_TRUE(bool(AST));
-  CheckOutgoingCalls(*AST, Caller3H.point(), testPath("caller3.hh"));
+  CheckCallHierarchy(*AST, CalleeH.point(), testPath("callee.hh"));
 
   // Check that invoking from the definition site works.
   AST = Workspace.openFile("callee.cc");
   ASSERT_TRUE(bool(AST));
-  CheckIncomingCalls(*AST, CalleeC.point(), testPath("callee.cc"));
-  AST = Workspace.openFile("caller3.cc");
-  ASSERT_TRUE(bool(AST));
-  CheckOutgoingCalls(*AST, Caller3C.point(), testPath("caller3.cc"));
+  CheckCallHierarchy(*AST, CalleeC.point(), testPath("callee.cc"));
 }
 
 TEST(CallHierarchy, IncomingMultiFileObjC) {
@@ -508,20 +377,20 @@ TEST(CallHierarchy, IncomingMultiFileObjC) {
     auto IncomingLevel1 = incomingCalls(Items[0], Index.get());
     ASSERT_THAT(IncomingLevel1,
                 ElementsAre(AllOf(from(withName("caller1")),
-                                  iFromRanges(Caller1C.range()))));
+                                  fromRanges(Caller1C.range()))));
 
     auto IncomingLevel2 = incomingCalls(IncomingLevel1[0].from, Index.get());
-    ASSERT_THAT(IncomingLevel2,
-                ElementsAre(AllOf(from(withName("caller2")),
-                                  iFromRanges(Caller2C.range("A"),
-                                              Caller2C.range("B"))),
-                            AllOf(from(withName("caller3")),
-                                  iFromRanges(Caller3C.range("Caller1")))));
+    ASSERT_THAT(
+        IncomingLevel2,
+        ElementsAre(AllOf(from(withName("caller2")),
+                          fromRanges(Caller2C.range("A"), Caller2C.range("B"))),
+                    AllOf(from(withName("caller3")),
+                          fromRanges(Caller3C.range("Caller1")))));
 
     auto IncomingLevel3 = incomingCalls(IncomingLevel2[0].from, Index.get());
     ASSERT_THAT(IncomingLevel3,
                 ElementsAre(AllOf(from(withName("caller3")),
-                                  iFromRanges(Caller3C.range("Caller2")))));
+                                  fromRanges(Caller3C.range("Caller2")))));
 
     auto IncomingLevel4 = incomingCalls(IncomingLevel3[0].from, Index.get());
     EXPECT_THAT(IncomingLevel4, IsEmpty());
@@ -569,12 +438,12 @@ TEST(CallHierarchy, CallInLocalVarDecl) {
   ASSERT_THAT(Items, ElementsAre(withName("callee")));
 
   auto Incoming = incomingCalls(Items[0], Index.get());
-  ASSERT_THAT(Incoming, ElementsAre(AllOf(from(withName("caller1")),
-                                          iFromRanges(Source.range("call1"))),
-                                    AllOf(from(withName("caller2")),
-                                          iFromRanges(Source.range("call2"))),
-                                    AllOf(from(withName("caller3")),
-                                          iFromRanges(Source.range("call3")))));
+  ASSERT_THAT(
+      Incoming,
+      ElementsAre(
+          AllOf(from(withName("caller1")), fromRanges(Source.range("call1"))),
+          AllOf(from(withName("caller2")), fromRanges(Source.range("call2"))),
+          AllOf(from(withName("caller3")), fromRanges(Source.range("call3")))));
 }
 
 TEST(CallHierarchy, HierarchyOnField) {
diff --git a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
index 3acacf496e77f9..a89f4997362265 100644
--- a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
+++ b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
@@ -1703,12 +1703,6 @@ class IndexRequestCollector : public SymbolIndex {
     return false;
   }
 
-  bool containedRefs(
-      const ContainedRefsRequest &,
-      llvm::function_ref<void(const ContainedRefsResult &)>) const override {
-    return false;
-  }
-
   void relations(const RelationsRequest &,
                  llvm::function_ref<void(const SymbolID &, const Symbol &)>)
       const override {}
diff --git a/clang-tools-extra/clangd/unittests/RenameTests.cpp b/clang-tools-extra/clangd/unittests/RenameTests.cpp
index a3aa4542bdf751..7d9252110b27df 100644
--- a/clang-tools-extra/clangd/unittests/RenameTests.cpp
+++ b/clang-tools-extra/clangd/unittests/RenameTests.cpp
@@ -1601,12 +1601,6 @@ TEST(CrossFileRenameTests, DirtyBuffer) {
       return true; // has more references
     }
 
-    bool containedRefs(const ContainedRefsRequest &Req,
-                       llvm::function_ref<void(const ContainedRefsResult &)>
-                           Callback) const override {
-      return false;
-    }
-
     bool fuzzyFind(
         const FuzzyFindRequest &Req,
         llvm::function_ref<void(const Symbol &)> Callback) const override {
@@ -1658,12 +1652,6 @@ TEST(CrossFileRenameTests, DeduplicateRefsFromIndex) {
       return false;
     }
 
-    bool containedRefs(const ContainedRefsRequest &Req,
-                       llvm::function_ref<void(const ContainedRefsResult &)>
-                           Callback) const override {
-      return false;
-    }
-
     bool fuzzyFind(const FuzzyFindRequest &,
                    llvm::function_ref<void(const Symbol &)>) const override {
       return false;



More information about the cfe-commits mailing list