summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKirill Bobyrev <kbobyrev.opensource@gmail.com>2018-09-10 11:51:05 +0000
committerKirill Bobyrev <kbobyrev.opensource@gmail.com>2018-09-10 11:51:05 +0000
commit09f00dcf69fd87d50e93eb5218f20ebdd8ec7a61 (patch)
treee82d75820106eb778064b9e326494b48fc604f27
parent57b5966dad858f30fd3bbdf42ba560ef9382f0c2 (diff)
downloadbcm5719-llvm-09f00dcf69fd87d50e93eb5218f20ebdd8ec7a61.tar.gz
bcm5719-llvm-09f00dcf69fd87d50e93eb5218f20ebdd8ec7a61.zip
[clangd] Implement FuzzyFindRequest JSON (de)serialization
JSON (de)serialization of `FuzzyFindRequest` might be useful for both D51090 and D51628. Also, this allows precise logging of the fuzzy find requests. Reviewed By: sammccall Differential Revision: https://reviews.llvm.org/D51852 llvm-svn: 341802
-rw-r--r--clang-tools-extra/clangd/CodeComplete.cpp3
-rw-r--r--clang-tools-extra/clangd/index/Index.cpp27
-rw-r--r--clang-tools-extra/clangd/index/Index.h6
3 files changed, 33 insertions, 3 deletions
diff --git a/clang-tools-extra/clangd/CodeComplete.cpp b/clang-tools-extra/clangd/CodeComplete.cpp
index 354a2770e24..1e632dce9c6 100644
--- a/clang-tools-extra/clangd/CodeComplete.cpp
+++ b/clang-tools-extra/clangd/CodeComplete.cpp
@@ -1381,8 +1381,7 @@ private:
Req.Scopes = QueryScopes;
// FIXME: we should send multiple weighted paths here.
Req.ProximityPaths.push_back(FileName);
- vlog("Code complete: fuzzyFind(\"{0}\", scopes=[{1}])", Req.Query,
- llvm::join(Req.Scopes.begin(), Req.Scopes.end(), ","));
+ vlog("Code complete: fuzzyFind({0:2})", toJSON(Req));
if (SpecFuzzyFind)
SpecFuzzyFind->NewReq = Req;
diff --git a/clang-tools-extra/clangd/index/Index.cpp b/clang-tools-extra/clangd/index/Index.cpp
index a01c49f6573..013ba5cf9e7 100644
--- a/clang-tools-extra/clangd/index/Index.cpp
+++ b/clang-tools-extra/clangd/index/Index.cpp
@@ -175,6 +175,33 @@ std::shared_ptr<SymbolIndex> SwapIndex::snapshot() const {
return Index;
}
+bool fromJSON(const llvm::json::Value &Parameters, FuzzyFindRequest &Request) {
+ json::ObjectMapper O(Parameters);
+ llvm::Optional<int64_t> MaxCandidateCount;
+ bool OK =
+ O && O.map("Query", Request.Query) && O.map("Scopes", Request.Scopes) &&
+ O.map("RestrictForCodeCompletion", Request.RestrictForCodeCompletion) &&
+ O.map("ProximityPaths", Request.ProximityPaths) &&
+ O.map("MaxCandidateCount", MaxCandidateCount);
+ if (MaxCandidateCount)
+ Request.MaxCandidateCount = MaxCandidateCount.getValue();
+ return OK;
+}
+
+llvm::json::Value toJSON(const FuzzyFindRequest &Request) {
+ auto Result = json::Object{
+ {"Query", Request.Query},
+ {"Scopes", json::Array{Request.Scopes}},
+ {"RestrictForCodeCompletion", Request.RestrictForCodeCompletion},
+ {"ProximityPaths", json::Array{Request.ProximityPaths}},
+ };
+ // A huge limit means no limit, leave it out.
+ if (Request.MaxCandidateCount <= std::numeric_limits<int64_t>::max())
+ Result["MaxCandidateCount"] =
+ static_cast<int64_t>(Request.MaxCandidateCount);
+ return Result;
+}
+
bool SwapIndex::fuzzyFind(const FuzzyFindRequest &R,
llvm::function_ref<void(const Symbol &)> CB) const {
return snapshot()->fuzzyFind(R, CB);
diff --git a/clang-tools-extra/clangd/index/Index.h b/clang-tools-extra/clangd/index/Index.h
index 12727efaa86..b531d1e292a 100644
--- a/clang-tools-extra/clangd/index/Index.h
+++ b/clang-tools-extra/clangd/index/Index.h
@@ -19,8 +19,10 @@
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringRef.h"
+#include "llvm/Support/JSON.h"
#include "llvm/Support/StringSaver.h"
#include <array>
+#include <limits>
#include <mutex>
#include <string>
#include <tuple>
@@ -435,7 +437,7 @@ struct FuzzyFindRequest {
std::vector<std::string> Scopes;
/// \brief The number of top candidates to return. The index may choose to
/// return more than this, e.g. if it doesn't know which candidates are best.
- size_t MaxCandidateCount = UINT_MAX;
+ size_t MaxCandidateCount = std::numeric_limits<size_t>::max();
/// If set to true, only symbols for completion support will be considered.
bool RestrictForCodeCompletion = false;
/// Contextually relevant files (e.g. the file we're code-completing in).
@@ -450,6 +452,8 @@ struct FuzzyFindRequest {
}
bool operator!=(const FuzzyFindRequest &Req) const { return !(*this == Req); }
};
+bool fromJSON(const llvm::json::Value &Value, FuzzyFindRequest &Request);
+llvm::json::Value toJSON(const FuzzyFindRequest &Request);
struct LookupRequest {
llvm::DenseSet<SymbolID> IDs;
OpenPOWER on IntegriCloud