Index: clang-tools-extra/clangd/index/dex/Iterator.h =================================================================== --- clang-tools-extra/clangd/index/dex/Iterator.h +++ clang-tools-extra/clangd/index/dex/Iterator.h @@ -101,8 +101,14 @@ virtual llvm::raw_ostream &dump(llvm::raw_ostream &OS) const = 0; }; -/// Advances the iterator until it is either exhausted or the number of -/// requested items is reached. The result contains sorted DocumentIDs. +/// Advances given iterator until it is exhausted or the requested number of +/// symbols is already seen while using callback on each processed DocID. +void matchSymbols(Iterator &It, + llvm::function_ref Callback, + size_t Limit = std::numeric_limits::max()); + +/// Advances given iterator until it is either exhausted or the number of +/// requested items is reached and returns all seen DocIDs. std::vector consume(Iterator &It, size_t Limit = std::numeric_limits::max()); Index: clang-tools-extra/clangd/index/dex/Iterator.cpp =================================================================== --- clang-tools-extra/clangd/index/dex/Iterator.cpp +++ clang-tools-extra/clangd/index/dex/Iterator.cpp @@ -220,10 +220,16 @@ std::vector consume(Iterator &It, size_t Limit) { std::vector Result; + matchSymbols(It, [&](const DocID &ID) { Result.push_back(ID); }, Limit); + return Result; +} + +void matchSymbols(Iterator &It, + llvm::function_ref Callback, + size_t Limit) { for (size_t Retrieved = 0; !It.reachedEnd() && Retrieved < Limit; It.advance(), ++Retrieved) - Result.push_back(It.peek()); - return Result; + Callback(It.peek()); } std::unique_ptr create(PostingListRef Documents) {