nridge added a comment.

Thanks for working on this!

I haven't looked at the whole patch in detail, but I looked at some parts 
(mainly the `SymbolIndex` API and what in-memory structures we store to 
implement it) and wrote a few thoughts.



================
Comment at: clang-tools-extra/clangd/XRefs.cpp:1843
+    auto Kind = Callee.SymInfo.Kind;
+    if (Kind != SK::Function && Kind != SK::InstanceMethod &&
+        Kind != SK::ClassMethod && Kind != SK::StaticMethod &&
----------------
If memory usage of `Dex::RevRefs` becomes a concern, we could consider only 
storing the references that would pass this filter in the first place. That 
would trade off time spent building the reverse lookup (we'd have to do symbol 
lookups or keep around extra state to track the symbol kinds) for space savings.


================
Comment at: clang-tools-extra/clangd/index/Index.h:85
 
+struct RefersToResult {
+  /// The source location where the symbol is named.
----------------
As the protocol wants the outgoing calls grouped by symbol, we could consider 
storing them (and having the `SymbolIndex` API expose them) in that way.

The main motivation would be space savings on the storage side 
(`Dex::RevRefs`), as in the case of multiple calls to the same function we only 
need to store the target `SymbolID` once.

However, it may not be worth doing this, as having a large number of outgoing 
calls to the same target inside a given function is likely to be rare, and 
vectors have their own overhead. (It's also not clear to what extent the 
details of the LSP protocol should dictate the shape of the `SymbolIndex` API.)


================
Comment at: clang-tools-extra/clangd/index/Index.h:133
+  virtual bool
+  refersTo(const RefsRequest &Req,
+           llvm::function_ref<void(const RefersToResult &)> Callback) const = 
0;
----------------
Perhaps we should have a distinct request structure, for future extensibility?


================
Comment at: clang-tools-extra/clangd/index/MemIndex.cpp:97
+      Req.Limit.getValueOr(std::numeric_limits<uint32_t>::max());
+  for (const auto &Pair : Refs) {
+    for (const auto &R : Pair.second) {
----------------
Looping over all refs seems expensive even for `MemIndex`. Perhaps we should 
have a reverse lookup table similar to `RevRefs` here as well?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D93829

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

Reply via email to