9 #include <grpc++/grpc++.h>
12 #include "Index.grpc.pb.h"
18 #include "llvm/ADT/StringRef.h"
28 template <
typename RequestT,
typename ReplyT>
29 using StreamingCall = std::unique_ptr<grpc::ClientReader<ReplyT>> (
30 remote::SymbolIndex::Stub::*)(grpc::ClientContext *,
const RequestT &);
32 template <
typename ClangdRequestT,
typename RequestT>
33 RequestT serializeRequest(ClangdRequestT Request)
const {
42 template <
typename RequestT,
typename ReplyT,
typename ClangdRequestT,
44 bool streamRPC(ClangdRequestT Request,
45 StreamingCall<RequestT, ReplyT> RPCCall,
47 bool FinalResult =
false;
49 const auto RPCRequest = serializeRequest<ClangdRequestT, RequestT>(Request);
51 std::chrono::system_clock::time_point
Deadline =
52 std::chrono::system_clock::now() + DeadlineWaitingTime;
54 auto Reader = (Stub.get()->*RPCCall)(&
Context, RPCRequest);
55 llvm::BumpPtrAllocator
Arena;
58 while (Reader->Read(&Reply)) {
59 if (!Reply.has_stream_result()) {
60 FinalResult = Reply.final_result();
66 elog(
"Received invalid {0}", ReplyT::descriptor()->
name());
75 std::shared_ptr<grpc::Channel> Channel, llvm::StringRef ProjectRoot,
76 std::chrono::milliseconds DeadlineTime = std::chrono::milliseconds(1000))
77 : Stub(remote::SymbolIndex::NewStub(Channel)), ProjectRoot(ProjectRoot),
78 DeadlineWaitingTime(DeadlineTime) {}
82 streamRPC(Request, &remote::SymbolIndex::Stub::Lookup,
Callback);
88 return streamRPC(Request, &remote::SymbolIndex::Stub::FuzzyFind,
Callback);
104 size_t estimateMemoryUsage()
const {
return 0; }
107 std::unique_ptr<remote::SymbolIndex::Stub> Stub;
108 std::string ProjectRoot;
110 std::chrono::milliseconds DeadlineWaitingTime;
115 std::unique_ptr<clangd::SymbolIndex>
getClient(llvm::StringRef Address,
116 llvm::StringRef ProjectRoot) {
118 grpc::CreateChannel(Address.str(), grpc::InsecureChannelCredentials());
119 Channel->GetState(
true);
120 return std::unique_ptr<clangd::SymbolIndex>(
121 new IndexClient(Channel, ProjectRoot));