Author: hokein Date: Mon Aug 6 06:14:32 2018 New Revision: 339011 URL: http://llvm.org/viewvc/llvm-project?rev=339011&view=rev Log: [clangd] Index Interfaces for Xrefs
Summary: This is the first step of implementing Xrefs in clangd: - add index interfaces, and related data structures. Reviewers: sammccall Subscribers: ilya-biryukov, ioeric, MaskRay, jkorous, arphaman, cfe-commits Differential Revision: https://reviews.llvm.org/D49658 Modified: clang-tools-extra/trunk/clangd/index/FileIndex.cpp clang-tools-extra/trunk/clangd/index/FileIndex.h clang-tools-extra/trunk/clangd/index/Index.h clang-tools-extra/trunk/clangd/index/MemIndex.cpp clang-tools-extra/trunk/clangd/index/MemIndex.h clang-tools-extra/trunk/clangd/index/Merge.cpp clang-tools-extra/trunk/unittests/clangd/CodeCompleteTests.cpp Modified: clang-tools-extra/trunk/clangd/index/FileIndex.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/index/FileIndex.cpp?rev=339011&r1=339010&r2=339011&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/index/FileIndex.cpp (original) +++ clang-tools-extra/trunk/clangd/index/FileIndex.cpp Mon Aug 6 06:14:32 2018 @@ -9,6 +9,7 @@ #include "FileIndex.h" #include "SymbolCollector.h" +#include "../Logger.h" #include "clang/Index/IndexingAction.h" #include "clang/Lex/Preprocessor.h" @@ -105,5 +106,11 @@ void FileIndex::lookup( Index.lookup(Req, Callback); } +void FileIndex::findOccurrences( + const OccurrencesRequest &Req, + llvm::function_ref<void(const SymbolOccurrence &)> Callback) const { + log("findOccurrences is not implemented."); +} + } // namespace clangd } // namespace clang Modified: clang-tools-extra/trunk/clangd/index/FileIndex.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/index/FileIndex.h?rev=339011&r1=339010&r2=339011&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/index/FileIndex.h (original) +++ clang-tools-extra/trunk/clangd/index/FileIndex.h Mon Aug 6 06:14:32 2018 @@ -73,6 +73,10 @@ public: void lookup(const LookupRequest &Req, llvm::function_ref<void(const Symbol &)> Callback) const override; + + void findOccurrences(const OccurrencesRequest &Req, + llvm::function_ref<void(const SymbolOccurrence &)> + Callback) const override; private: FileSymbols FSymbols; MemIndex Index; Modified: clang-tools-extra/trunk/clangd/index/Index.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/index/Index.h?rev=339011&r1=339010&r2=339011&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/index/Index.h (original) +++ clang-tools-extra/trunk/clangd/index/Index.h Mon Aug 6 06:14:32 2018 @@ -287,6 +287,40 @@ private: std::vector<Symbol> Symbols; // Sorted by SymbolID to allow lookup. }; +// Describes the kind of a symbol occurrence. +// +// This is a bitfield which can be combined from different kinds. +enum class SymbolOccurrenceKind : uint8_t { + Unknown = 0, + Declaration = static_cast<uint8_t>(index::SymbolRole::Declaration), + Definition = static_cast<uint8_t>(index::SymbolRole::Definition), + Reference = static_cast<uint8_t>(index::SymbolRole::Reference), +}; +inline SymbolOccurrenceKind operator|(SymbolOccurrenceKind L, + SymbolOccurrenceKind R) { + return static_cast<SymbolOccurrenceKind>(static_cast<uint8_t>(L) | + static_cast<uint8_t>(R)); +} +inline SymbolOccurrenceKind &operator|=(SymbolOccurrenceKind &L, + SymbolOccurrenceKind R) { + return L = L | R; +} +inline SymbolOccurrenceKind operator&(SymbolOccurrenceKind A, + SymbolOccurrenceKind B) { + return static_cast<SymbolOccurrenceKind>(static_cast<uint8_t>(A) & + static_cast<uint8_t>(B)); +} + +// Represents a symbol occurrence in the source file. It could be a +// declaration/definition/reference occurrence. +// +// WARNING: Location does not own the underlying data - Copies are shallow. +struct SymbolOccurrence { + // The location of the occurrence. + SymbolLocation Location; + SymbolOccurrenceKind Kind = SymbolOccurrenceKind::Unknown; +}; + struct FuzzyFindRequest { /// \brief A query string for the fuzzy find. This is matched against symbols' /// un-qualified identifiers and should not contain qualifiers like "::". @@ -312,6 +346,11 @@ struct LookupRequest { llvm::DenseSet<SymbolID> IDs; }; +struct OccurrencesRequest { + llvm::DenseSet<SymbolID> IDs; + SymbolOccurrenceKind Filter; +}; + /// \brief Interface for symbol indexes that can be used for searching or /// matching symbols among a set of symbols based on names or unique IDs. class SymbolIndex { @@ -334,8 +373,15 @@ public: lookup(const LookupRequest &Req, llvm::function_ref<void(const Symbol &)> Callback) const = 0; - // FIXME: add interfaces for more index use cases: - // - getAllOccurrences(SymbolID); + /// CrossReference finds all symbol occurrences (e.g. references, + /// declarations, definitions) and applies \p Callback on each result. + /// + /// Resutls are returned in arbitrary order. + /// + /// The returned result must be deep-copied if it's used outside Callback. + virtual void findOccurrences( + const OccurrencesRequest &Req, + llvm::function_ref<void(const SymbolOccurrence &)> Callback) const = 0; }; } // namespace clangd Modified: clang-tools-extra/trunk/clangd/index/MemIndex.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/index/MemIndex.cpp?rev=339011&r1=339010&r2=339011&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/index/MemIndex.cpp (original) +++ clang-tools-extra/trunk/clangd/index/MemIndex.cpp Mon Aug 6 06:14:32 2018 @@ -87,5 +87,11 @@ std::unique_ptr<SymbolIndex> MemIndex::b return std::move(MemIdx); } +void MemIndex::findOccurrences( + const OccurrencesRequest &Req, + llvm::function_ref<void(const SymbolOccurrence &)> Callback) const { + log("findOccurrences is not implemented."); +} + } // namespace clangd } // namespace clang Modified: clang-tools-extra/trunk/clangd/index/MemIndex.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/index/MemIndex.h?rev=339011&r1=339010&r2=339011&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/index/MemIndex.h (original) +++ clang-tools-extra/trunk/clangd/index/MemIndex.h Mon Aug 6 06:14:32 2018 @@ -31,10 +31,14 @@ public: fuzzyFind(const FuzzyFindRequest &Req, llvm::function_ref<void(const Symbol &)> Callback) const override; - virtual void + void lookup(const LookupRequest &Req, llvm::function_ref<void(const Symbol &)> Callback) const override; + void findOccurrences(const OccurrencesRequest &Req, + llvm::function_ref<void(const SymbolOccurrence &)> + Callback) const override; + private: std::shared_ptr<std::vector<const Symbol *>> Symbols; // Index is a set of symbols that are deduplicated by symbol IDs. Modified: clang-tools-extra/trunk/clangd/index/Merge.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/index/Merge.cpp?rev=339011&r1=339010&r2=339011&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/index/Merge.cpp (original) +++ clang-tools-extra/trunk/clangd/index/Merge.cpp Mon Aug 6 06:14:32 2018 @@ -7,6 +7,7 @@ // //===---------------------------------------------------------------------===// #include "Merge.h" +#include "../Logger.h" #include "llvm/ADT/STLExtras.h" #include "llvm/Support/raw_ostream.h" namespace clang { @@ -74,6 +75,12 @@ class MergedIndex : public SymbolIndex { Callback(*Sym); } + void findOccurrences(const OccurrencesRequest &Req, + llvm::function_ref<void(const SymbolOccurrence &)> + Callback) const override { + log("findOccurrences is not implemented."); + } + private: const SymbolIndex *Dynamic, *Static; }; Modified: clang-tools-extra/trunk/unittests/clangd/CodeCompleteTests.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clangd/CodeCompleteTests.cpp?rev=339011&r1=339010&r2=339011&view=diff ============================================================================== --- clang-tools-extra/trunk/unittests/clangd/CodeCompleteTests.cpp (original) +++ clang-tools-extra/trunk/unittests/clangd/CodeCompleteTests.cpp Mon Aug 6 06:14:32 2018 @@ -893,6 +893,10 @@ public: void lookup(const LookupRequest &, llvm::function_ref<void(const Symbol &)>) const override {} + void findOccurrences(const OccurrencesRequest &Req, + llvm::function_ref<void(const SymbolOccurrence &)> + Callback) const override {} + const std::vector<FuzzyFindRequest> allRequests() const { return Requests; } private: _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits