kbobyrev added inline comments.

================
Comment at: clang-tools-extra/clangd/index/dex/dexp/Dexp.cpp:18
 #include "index/dex/Dex.h"
+#include "index/remote/Client.h"
 #include "llvm/ADT/ScopeExit.h"
----------------
sammccall wrote:
> Being able to include this header but not call the function in it doesn't 
> make sense - linker errors aren't a friendly way to surface this constraint.
> 
> If the goal is to forbid use of the API without it compiled in, the header 
> should `#ifndef #CLANGD_ENABLE_REMOTE #error "Client.h included but 
> CLANGD_ENABLE_REMOTE is off" #endif`, and all the include-sites should be 
> #ifdef-guarded.
> 
> (But please see other comments first)
Should be resolved in the newer version with (A) implementation.


================
Comment at: clang-tools-extra/clangd/index/remote/Client.h:22
+/// Caller is not blocked upon SymbolIndex request, the actual connection must
+/// happen upon the first request. RPCs have no timeout.
+///
----------------
sammccall wrote:
> RPCs have no timeout should be a FIXME
`streamRPC` already has a `FIXME` for that.


================
Comment at: clang-tools-extra/clangd/index/remote/Index.cpp:97
+std::unique_ptr<SymbolIndex> connect(llvm::StringRef Address) {
+#ifdef CLANGD_REMOTE
+  return std::unique_ptr<SymbolIndex>(new IndexClient(Address));
----------------
sammccall wrote:
> kbobyrev wrote:
> > sammccall wrote:
> > > if  remote is disabled we can't compile the rest of this file.
> > > Rather than ifdefs here, I'd suggest doing it at the cmake level:
> > > 
> > > ```
> > > if(CLANGD_ENABLE_REMOTE)
> > >   add_clang_library(... Index.cpp)
> > > else()
> > >   add_clang_library(... IndexUnimplemented.cpp)
> > > endif()
> > > ```
> > I would argue that including `index/remote/Client.h` without 
> > `CLANGD_ENABLE_REMOTE` is not correct. We would still have to put `#ifdefs` 
> > in the user code regardless of whether what you proposed is implemented. I 
> > don't see any benefits in allowing users to include 
> > `index/remote/Client.h`, link `clangdRemoteIndex` and getting a runtime 
> > error. All of those steps have _remote_ in them and if _remote mode_ is not 
> > enabled, something certainly went wrong.
> > 
> > Also, this will complicate CMake structure as I can't put files that are 
> > conditionally added/excluded from the clang library and I would either have 
> > to make a separate directory with an "empty" library, or put a bunch of 
> > `#ifdefs` in here. Either is not optimal and I think it'd be better to 
> > leave it like this. WDYT?
> > I would argue that including index/remote/Client.h without 
> > CLANGD_ENABLE_REMOTE is not correct. We would still have to put #ifdefs in 
> > the user code regardless of whether what you proposed is implemented
> 
> This is begging the question - what I'm proposing is to give that 
> header/library defined behavior when CLANGD_ENABLE_REMOTE is off, and so you 
> wouldn't need #ifdefs.
> 
> > I don't see any benefits in allowing users to include 
> > index/remote/Client.h, link clangdRemoteIndex and getting a runtime error.
> 
> The benefits are:
>  - no ifdefs and fewer conditional cmake rules, which are both hard to read 
> and result in untested constructs without even basic syntax checking
>  - fewer cases to consider in clients, as this falls into the regular "can't 
> connect to index" codepath
>  - readers trying to follow the possible behaviours end up at the header 
> documentation of a function that is called, which is an easy and familiar 
> workflow
> 
> > All of those steps have _remote_ in them and if _remote mode_ is not 
> > enabled, something certainly went wrong
> 
> Again, this is begging the question. If the header says "if GRPC mode is not 
> enabled, always returns nullptr", then everything is working as designed.
> 
> > Also, this will complicate CMake structure as I can't put files that are 
> > conditionally added/excluded from the clang library
> 
> Why not? (This sounds like a fair technical objection, but may be 
> surmountable)
I believe this is resolved in new version.

> > Also, this will complicate CMake structure as I can't put files that are 
> > conditionally added/excluded from the clang library
> Why not? (This sounds like a fair technical objection, but may be 
> surmountable)
As discussed before, there is a CMake module in LLVM that errors out in case 
some files are not included in any library. In case of conditional compilation, 
either `UnimplementedClient.cpp` or `Client.cpp` will be left out (or this has 
to be the single file with `#ifdefs`). See new version for the exact layout I 
came up with.

This is especially unfortunate because I actually need two libraries - one for 
Client implementation and one for Marshalling. And because of that I have to 
have three separate directories :( Suboptimal, but probably OK.


================
Comment at: clang-tools-extra/clangd/index/remote/server/CMakeLists.txt:17
 
-  protobuf
-  grpc++
-  clangDaemon
+  clangdRemoteIndex
   )
----------------
sammccall wrote:
> why does the server depend on the client?
Fixed in a newer diff.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D78521



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

Reply via email to