aboutsummaryrefslogtreecommitdiff
path: root/clang-tools-extra/clangd/index/remote/server/Server.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra/clangd/index/remote/server/Server.cpp')
-rw-r--r--clang-tools-extra/clangd/index/remote/server/Server.cpp48
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;