kadircet accepted this revision.
kadircet added a comment.
This revision is now accepted and ready to land.

thanks, LGTM apart from templated-lambdas.



================
Comment at: clang-tools-extra/clangd/index/remote/server/Server.cpp:86
+    unsigned FailedToSend = 0;
+    Index->lookup(Req, [&](const auto &Item) {
+      auto SerializedItem = ProtobufMarshaller->toProtobuf(Item);
----------------
usage of `auto` in here results in a templated-lambda. I don't think we want 
that (please let me know if I am missing something) maybe go back to using 
clangd::Symbol ? (same for other lambdas)


================
Comment at: clang-tools-extra/clangd/index/remote/server/Server.cpp:203
+      TracerStream.reset();
+      llvm::errs() << "Error while opening trace file " << TraceFile << ": "
+                   << EC.message();
----------------
any reasons for not using elog in here (and in other places using 
`llvm::errs()` ?


================
Comment at: clang-tools-extra/clangd/index/remote/server/Server.cpp:122
     }
-    Index->lookup(Req, [&](const clangd::Symbol &Sym) {
-      auto SerializedSymbol = ProtobufMarshaller->toProtobuf(Sym);
-      if (!SerializedSymbol)
-        return;
-      LookupReply NextMessage;
-      *NextMessage.mutable_stream_result() = *SerializedSymbol;
-      Reply->Write(NextMessage);
-    });
+    std::function<void(clang::clangd::SymbolIndex &,
+                       const clang::clangd::LookupRequest &,
----------------
sammccall wrote:
> kbobyrev wrote:
> > kadircet wrote:
> > > all of this trickery is really nice. but i am not sure if it improves 
> > > readability at all, from the perspective of call sites the amount of code 
> > > is almost the same. moreover it was some trivial lambda before and 
> > > instead it is lots of template parameters now.
> > > 
> > > maybe just have templated function to replace the lambda body instead? 
> > > e.g.
> > > 
> > > ```
> > > template <typename StreamType, typenameResultType>
> > > void IndexCallback(Marshaller &M, StreamType &Item) {
> > >       trace::Span Tracer....;
> > >       auto SerializedSymbol = M.toProtobuf(Item);
> > >       // log the events and much more ...
> > > }
> > > 
> > > ```
> > > 
> > > then call it in the callbacks. WDYT?
> > I think this is a good idea but I can't think of a nice way to do that, 
> > too. `IndexCallback` would have to update `Sent` and `FailedToSend` 
> > (`Tracer` should be outside of the callback, right?), and the callback 
> > signature if fixed so I wouldn't be able to pass these parameters by 
> > reference :( I could probably make those two fields of the class but this 
> > doesn't look very nice, or pass member function (templated one) to the 
> > callback in each index request, but this also doesn't look very nice.
> > 
> > I think the reason was initially to improve readability but then it's more 
> > about code deduplication: right now there are 3 pieces of code that do 
> > exactly the same, there will be a fourth one (relations request). Maybe 
> > readability even decreases but I really think that having 4 pieces of code 
> > with different types is not very nice. Also, D84525 compliments this and 
> > there will be practically only no functional code in the functions 
> > themselves.
> > 
> > I can understand your argument and I partially support it but I really 
> > think we're unfortunately choosing between bad and worse.
> FWIW, I find the template to be very hard to read, and would prefer the 
> version that is duplicated 4 times. 
> 
> I've left some suggestions for how to simplify (mostly, eliminating template 
> parameters) but I'm still not sure it's worth it.
> I think this is a good idea but I can't think of a nice way to do that, too. 
> IndexCallback would have to update Sent and FailedToSend (Tracer should be 
> outside of the callback, right?), and the callback signature if fixed so I 
> wouldn't be able to pass these parameters by reference :( I could probably 
> make those two fields of the class but this doesn't look very nice, or pass 
> member function (templated one) to the callback in each index request, but 
> this also doesn't look very nice.

right, i've missed that bit. but I was suggesting you to call `IndexCallback` 
inside the lambda, e.g. callsites would look like this:

```
    Index->lookup(Req, [&](const auto &Item) {
        IndexCallback(*ProtobufMarshaller, Item);
    });
```

so in theory you could pass in `Sent` and `FailedToSend` as parameters to 
`IndexCallback` and mutate them in there.


but not really relevant anymore.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D84499/new/

https://reviews.llvm.org/D84499



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to