diff --git a/clang-tools-extra/clangd/ClangdLSPServer.cpp b/clang-tools-extra/clangd/ClangdLSPServer.cpp index 1391dcaa0c81a..05dd313d0a0d3 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> 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 597fd9de7ff68..0b8e4720f5323 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>); - void onCallHierarchyOutgoingCalls( - const CallHierarchyOutgoingCallsParams &, - Callback>); void onClangdInlayHints(const InlayHintsParams &, Callback); void onInlayHint(const InlayHintsParams &, Callback>); diff --git a/clang-tools-extra/clangd/ClangdServer.cpp b/clang-tools-extra/clangd/ClangdServer.cpp index 63f83bc36f0c6..9b38be04e7ddd 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 RestrictRange, WorkScheduler->runWithAST("InlayHints", File, std::move(Action), Transient); } -void ClangdServer::outgoingCalls( - const CallHierarchyItem &Item, - Callback> 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 8b6618cf96ccf..a653cdb56b751 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>); - /// Resolve outgoing calls for a given call hierarchy item. - void outgoingCalls(const CallHierarchyItem &Item, - Callback>); - /// Resolve inlay hints for a given document. void inlayHints(PathRef File, std::optional RestrictRange, Callback>); diff --git a/clang-tools-extra/clangd/XRefs.cpp b/clang-tools-extra/clangd/XRefs.cpp index d237d95b3eb65..61fa66180376c 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 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 -outgoingCalls(const CallHierarchyItem &Item, const SymbolIndex *Index) { - std::vector 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> 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{}).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 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 247e52314c3f9..df91dd15303c1 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 incomingCalls(const CallHierarchyItem &Item, const SymbolIndex *Index); -std::vector -outgoingCalls(const CallHierarchyItem &Item, const SymbolIndex *Index); - /// Returns all decls that are referenced in the \p FD except local symbols. llvm::DenseSet 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 86dc6ed763344..7a0c23287db22 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 CB) const { return snapshot()->refs(R, CB); } -bool SwapIndex::containedRefs( - const ContainedRefsRequest &R, - llvm::function_ref CB) const { - return snapshot()->containedRefs(R, CB); -} void SwapIndex::relations( const RelationsRequest &R, llvm::function_ref CB) const { diff --git a/clang-tools-extra/clangd/index/Index.h b/clang-tools-extra/clangd/index/Index.h index a193b1a191216..047ce08e93e3a 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 Limit; -}; - struct RelationsRequest { llvm::DenseSet Subjects; RelationKind Predicate; @@ -97,14 +84,6 @@ struct RelationsRequest { std::optional 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 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 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) const override; bool refs(const RefsRequest &, llvm::function_ref) const override; - bool containedRefs( - const ContainedRefsRequest &, - llvm::function_ref) const override; void relations(const RelationsRequest &, llvm::function_ref) const override; diff --git a/clang-tools-extra/clangd/index/MemIndex.cpp b/clang-tools-extra/clangd/index/MemIndex.cpp index 9c9d3942bdee6..2665d46b97d83 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 Callback) const { - trace::Span Tracer("MemIndex refersTo"); - uint32_t Remaining = Req.Limit.value_or(std::numeric_limits::max()); - for (const auto &Pair : Refs) { - for (const auto &R : Pair.second) { - if (!static_cast(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 Callback) const { diff --git a/clang-tools-extra/clangd/index/MemIndex.h b/clang-tools-extra/clangd/index/MemIndex.h index 8f390c5028dc4..fba2c1a7120a2 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 Callback) const override; - bool containedRefs(const ContainedRefsRequest &Req, - llvm::function_ref - Callback) const override; - void relations(const RelationsRequest &Req, llvm::function_ref Callback) const override; diff --git a/clang-tools-extra/clangd/index/Merge.cpp b/clang-tools-extra/clangd/index/Merge.cpp index aecca38a885b6..8221d4b1f4440 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 Callback) const { - trace::Span Tracer("MergedIndex refersTo"); - bool More = false; - uint32_t Remaining = Req.Limit.value_or(std::numeric_limits::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 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 7441be6e57e85..b8a562b0df5d9 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) const override; bool refs(const RefsRequest &, llvm::function_ref) const override; - bool containedRefs( - const ContainedRefsRequest &, - llvm::function_ref) const override; void relations(const RelationsRequest &, llvm::function_ref) const override; diff --git a/clang-tools-extra/clangd/index/ProjectAware.cpp b/clang-tools-extra/clangd/index/ProjectAware.cpp index 9836f0130362a..2c6f8273b35d0 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 Callback) const override; - /// Query all indexes while prioritizing the associated one (if any). - bool containedRefs(const ContainedRefsRequest &Req, - llvm::function_ref - 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 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 Callback) const { diff --git a/clang-tools-extra/clangd/index/Ref.h b/clang-tools-extra/clangd/index/Ref.h index 870f77f56e6cb..6e383e2ade3d2 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 81125dbb1aeaf..91ae9d3003a97 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 e9eb27fd0f664..6ff7a0145ff87 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 9c02e88900b07..b7d3063e19b49 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 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::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 Callback) const { - trace::Span Tracer("Dex reversed refs"); - uint32_t Remaining = Req.Limit.value_or(std::numeric_limits::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 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 b0799ec9bae34..69e161d51135b 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 Callback) const override; - bool containedRefs(const ContainedRefsRequest &Req, - llvm::function_ref - Callback) const override; - void relations(const RelationsRequest &Req, llvm::function_ref 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::const_iterator> - lookupRevRefs(const SymbolID &Container) const; std::unique_ptr iterator(const Token &Tok) const; std::unique_ptr createFileProximityIterator(llvm::ArrayRef ProximityPaths) const; @@ -135,7 +116,6 @@ class Dex : public SymbolIndex { llvm::DenseMap InvertedIndex; dex::Corpus Corpus; llvm::DenseMap> Refs; - std::vector 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::vector> Relations; diff --git a/clang-tools-extra/clangd/test/type-hierarchy-ext.test b/clang-tools-extra/clangd/test/type-hierarchy-ext.test index 8d1a5dc31da0f..ddb9a014be0c7 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 a5f13ab13d0b3..69751000a7c6c 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 e086e3a6ce3ca..8821d3aad9c78 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 ::testing::Matcher from(ItemMatcher M) { return Field(&CallHierarchyIncomingCall::from, M); } -template -::testing::Matcher to(ItemMatcher M) { - return Field(&CallHierarchyOutgoingCall::to, M); -} template -::testing::Matcher iFromRanges(RangeMatchers... M) { +::testing::Matcher fromRanges(RangeMatchers... M) { return Field(&CallHierarchyIncomingCall::fromRanges, UnorderedElementsAre(M...)); } -template -::testing::Matcher 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 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 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 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 3acacf496e77f..a89f499736226 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) const override { - return false; - } - void relations(const RelationsRequest &, llvm::function_ref) const override {} diff --git a/clang-tools-extra/clangd/unittests/RenameTests.cpp b/clang-tools-extra/clangd/unittests/RenameTests.cpp index a3aa4542bdf75..7d9252110b27d 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 - Callback) const override { - return false; - } - bool fuzzyFind( const FuzzyFindRequest &Req, llvm::function_ref Callback) const override { @@ -1658,12 +1652,6 @@ TEST(CrossFileRenameTests, DeduplicateRefsFromIndex) { return false; } - bool containedRefs(const ContainedRefsRequest &Req, - llvm::function_ref - Callback) const override { - return false; - } - bool fuzzyFind(const FuzzyFindRequest &, llvm::function_ref) const override { return false;