diff options
Diffstat (limited to 'clang-tools-extra/clangd/index/remote/server/Server.cpp')
-rw-r--r-- | clang-tools-extra/clangd/index/remote/server/Server.cpp | 48 |
1 files changed, 48 insertions, 0 deletions
diff --git a/clang-tools-extra/clangd/index/remote/server/Server.cpp b/clang-tools-extra/clangd/index/remote/server/Server.cpp index 890b6c2..af9e9c3 100644 --- a/clang-tools-extra/clangd/index/remote/server/Server.cpp +++ b/clang-tools-extra/clangd/index/remote/server/Server.cpp @@ -351,6 +351,54 @@ private: return grpc::Status::OK; } + grpc::Status + ReverseRelations(grpc::ServerContext *Context, + const RelationsRequest *Request, + grpc::ServerWriter<RelationsReply> *Reply) override { + auto StartTime = stopwatch::now(); + WithContextValue WithRequestContext(CurrentRequest, Context); + logRequest(*Request); + trace::Span Tracer("ReverseRelationsRequest"); + auto Req = ProtobufMarshaller->fromProtobuf(Request); + if (!Req) { + elog("Can not parse ReverseRelationsRequest from protobuf: {0}", + Req.takeError()); + return grpc::Status::CANCELLED; + } + if (!Req->Limit || *Req->Limit > LimitResults) { + log("[public] Limiting result size for ReverseRelations request from {0} " + "to " + "{1}.", + Req->Limit, LimitResults); + Req->Limit = LimitResults; + } + unsigned Sent = 0; + unsigned FailedToSend = 0; + Index.reverseRelations( + *Req, [&](const SymbolID &Subject, const clangd::Symbol &Object) { + auto SerializedItem = ProtobufMarshaller->toProtobuf(Subject, Object); + if (!SerializedItem) { + elog("Unable to convert Relation to protobuf: {0}", + SerializedItem.takeError()); + ++FailedToSend; + return; + } + RelationsReply NextMessage; + *NextMessage.mutable_stream_result() = *SerializedItem; + logResponse(NextMessage); + Reply->Write(NextMessage); + ++Sent; + }); + RelationsReply LastMessage; + LastMessage.mutable_final_result()->set_has_more(true); + logResponse(LastMessage); + Reply->Write(LastMessage); + SPAN_ATTACH(Tracer, "Sent", Sent); + SPAN_ATTACH(Tracer, "Failed to send", FailedToSend); + logRequestSummary("v1/ReverseRelations", Sent, StartTime); + return grpc::Status::OK; + } + // Proxy object to allow proto messages to be lazily serialized as text. struct TextProto { const google::protobuf::Message &M; |