[PATCH] D49546: [clangd] Implement query iterators for Dex symbol index

Sam McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Jul 19 07:55:53 PDT 2018


sammccall added a comment.

Thanks for sending this early!
Rough interface comments - mostly looks good though!



================
Comment at: clang-tools-extra/clangd/index/dex/QueryIterator.h:26
+
+using PostingList = std::vector<size_t>;
+
----------------
we should at least use a type alias for a DocID (maybe an opaque one - not sure for now)


================
Comment at: clang-tools-extra/clangd/index/dex/QueryIterator.h:39
+public:
+  virtual bool reachedEnd() const = 0;
+  // FIXME(kbobyrev): Should advance() and advanceTo() return size_t peek()
----------------
or have peek return an InvalidID == size_t{-1}?


================
Comment at: clang-tools-extra/clangd/index/dex/QueryIterator.h:43
+  virtual bool advance() = 0;
+  virtual bool advanceTo(size_t Rank) = 0;
+  virtual size_t peek() const = 0;
----------------
name Rank is confusing. Type should be DocID (param doesn't need a name in the interface)


================
Comment at: clang-tools-extra/clangd/index/dex/QueryIterator.h:44
+  virtual bool advanceTo(size_t Rank) = 0;
+  virtual size_t peek() const = 0;
+
----------------
could reasonably call this operator*


================
Comment at: clang-tools-extra/clangd/index/dex/QueryIterator.h:53
+public:
+  DocumentIterator(std::shared_ptr<PostingList> Documents);
+
----------------
is shared_ptr really needed here? Seems like a raw pointer would be fine. I can see that when rebuilding the index we'll have some fun lifetime issues that are sometimes solved with shared_ptr, but I think that would be at the full-index level, not the individual-posting-list level.

(if you want one less indirection, you could have `using PostingListRef = ArrayRef<size_t>`, but it shouldn't matter)


================
Comment at: clang-tools-extra/clangd/index/dex/QueryIterator.h:59
+  bool advanceTo(size_t Rank) override;
+  size_t getIndex() const;
+  size_t peek() const override;
----------------
what's this for?
I don't think it's worth exposing for testing, should be able to get at the needed cases through the public interface


================
Comment at: clang-tools-extra/clangd/index/dex/QueryIterator.h:63
+  ///
+  void reset();
+
----------------
how will you use this? it's not in the interface, and if you know the implementation then creating a new iterator is cheap


================
Comment at: clang-tools-extra/clangd/index/dex/QueryIterator.h:76
+public:
+  AndIterator(const std::vector<std::shared_ptr<QueryIterator>> &Children);
+
----------------
again, unless you have a strong reason, don't use shared_ptr, as it makes it hard to reason about ownership and lifetimes.

These are a tree, unique_ptr should be fine. That way a top-level owned iterator is self-contained.


================
Comment at: clang-tools-extra/clangd/index/dex/QueryIterator.h:83
+
+  const std::vector<std::shared_ptr<QueryIterator>> getChildren() const;
+
----------------
what's this for?


https://reviews.llvm.org/D49546





More information about the cfe-commits mailing list