| //===--- Index.cpp -----------------------------------------------*- C++-*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "Index.h" |
| #include "support/Logger.h" |
| #include "llvm/ADT/StringExtras.h" |
| #include "llvm/ADT/StringRef.h" |
| #include "llvm/Support/Error.h" |
| #include "llvm/Support/raw_ostream.h" |
| #include <limits> |
| |
| namespace clang { |
| namespace clangd { |
| |
| void SwapIndex::reset(std::unique_ptr<SymbolIndex> Index) { |
| // Keep the old index alive, so we don't destroy it under lock (may be slow). |
| std::shared_ptr<SymbolIndex> Pin; |
| { |
| std::lock_guard<std::mutex> Lock(Mutex); |
| Pin = std::move(this->Index); |
| this->Index = std::move(Index); |
| } |
| } |
| std::shared_ptr<SymbolIndex> SwapIndex::snapshot() const { |
| std::lock_guard<std::mutex> Lock(Mutex); |
| return Index; |
| } |
| |
| bool fromJSON(const llvm::json::Value &Parameters, FuzzyFindRequest &Request, |
| llvm::json::Path P) { |
| llvm::json::ObjectMapper O(Parameters, P); |
| int64_t Limit; |
| bool OK = |
| O && O.map("Query", Request.Query) && O.map("Scopes", Request.Scopes) && |
| O.map("AnyScope", Request.AnyScope) && O.map("Limit", Limit) && |
| O.map("RestrictForCodeCompletion", Request.RestrictForCodeCompletion) && |
| O.map("ProximityPaths", Request.ProximityPaths) && |
| O.map("PreferredTypes", Request.PreferredTypes); |
| if (OK && Limit <= std::numeric_limits<uint32_t>::max()) |
| Request.Limit = Limit; |
| return OK; |
| } |
| |
| llvm::json::Value toJSON(const FuzzyFindRequest &Request) { |
| return llvm::json::Object{ |
| {"Query", Request.Query}, |
| {"Scopes", Request.Scopes}, |
| {"AnyScope", Request.AnyScope}, |
| {"Limit", Request.Limit}, |
| {"RestrictForCodeCompletion", Request.RestrictForCodeCompletion}, |
| {"ProximityPaths", Request.ProximityPaths}, |
| {"PreferredTypes", Request.PreferredTypes}, |
| }; |
| } |
| |
| bool SwapIndex::fuzzyFind(const FuzzyFindRequest &R, |
| llvm::function_ref<void(const Symbol &)> CB) const { |
| return snapshot()->fuzzyFind(R, CB); |
| } |
| void SwapIndex::lookup(const LookupRequest &R, |
| llvm::function_ref<void(const Symbol &)> CB) const { |
| return snapshot()->lookup(R, CB); |
| } |
| bool SwapIndex::refs(const RefsRequest &R, |
| llvm::function_ref<void(const Ref &)> CB) const { |
| return snapshot()->refs(R, CB); |
| } |
| void SwapIndex::relations( |
| const RelationsRequest &R, |
| llvm::function_ref<void(const SymbolID &, const Symbol &)> CB) const { |
| return snapshot()->relations(R, CB); |
| } |
| |
| llvm::unique_function<IndexContents(llvm::StringRef) const> |
| SwapIndex::indexedFiles() const { |
| // The index snapshot should outlive this method return value. |
| auto SnapShot = snapshot(); |
| auto IndexedFiles = SnapShot->indexedFiles(); |
| return [KeepAlive{std::move(SnapShot)}, |
| IndexContainsFile{std::move(IndexedFiles)}](llvm::StringRef File) { |
| return IndexContainsFile(File); |
| }; |
| } |
| |
| size_t SwapIndex::estimateMemoryUsage() const { |
| return snapshot()->estimateMemoryUsage(); |
| } |
| |
| } // namespace clangd |
| } // namespace clang |