[PATCH] D51279: [clangd] Implement findOccurrences interface in dynamic index.

Haojian Wu via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Aug 29 06:02:17 PDT 2018

hokein added a comment.

Thanks for the comments.

Comment at: clangd/index/FileIndex.cpp:48
+  if (TopLevelDecls) { // index main AST, set occurrence flag.
+    CollectorOpts.OccurrenceFilter = SymbolOccurrenceKind::Declaration |
ilya-biryukov wrote:
> There is an implicit assumption (`TopLevelDecls != null` iff indexing the main file AST in dynamic index) that does not seem quite obvious.
> Maybe add two overloads (for indexing the main AST and for indexing the preamble AST) or add an extra parameter to be explicit more about those choices?
This is a hacky way to detect whether we are indexing main AST or preamble AST -- because the current `FileIndex::update(PathRef Path, ...)` interface doesn't contain this information, and we use it both for `PreambleAST` and `MainAST` indexing in the client side (`ParsingCallback`).

I think we might want two dedicated methods (`updateMainAST`, and `updatePreambleAST`) in `FileSymbol`, and I think we should address it in a follow-up patch. WDYT?

Comment at: clangd/index/FileIndex.h:50
+  std::vector<std::shared_ptr<SymbolOccurrenceSlab>> allOccurrenceSlabs() const;
sammccall wrote:
> sammccall wrote:
> > This return type seems inconsistent with the design of this class.
> > The purpose of the `shared_ptr<vector<symbol_slab>>` in `allSymbols` is to avoid exposing the concrete storage.
> > The analogue would I guess be `shared_ptr<DenseMap<SymbolID, vector<SymbolOccurrence*>>>`.
> > 
> > The cost of creating that does seem a little gross though.
> allOccurrences
> (name should reflect the semantics, not the type)
> The cost of creating that does seem a little gross though.

Previously I tried to avoid the cost of iterating/copying all occurrences. After some investigations, it seems that the number of symbol occurrences is small (~500 for `SemaDecl.cpp`, < 100 for `CodeComplete.cpp`). The cost should not be too expensive.

Comment at: clangd/index/FileIndex.h:100
 /// level decls obtained from \p AST are indexed.
+std::pair<SymbolSlab, SymbolOccurrenceSlab>
 indexAST(ASTContext &AST, std::shared_ptr<Preprocessor> PP,
ilya-biryukov wrote:
> Maybe use a struct to allow named fields? Would mean a tiny amount of extra code in `indexAST`, but should make the client code slightly nicer.
I think the type of `pair` explicitly express its meaning well enough? And this function is exposed for unittests, I'm happy to do the change if you insist.

Comment at: clangd/index/MemIndex.cpp:36
   auto Idx = llvm::make_unique<MemIndex>();
-  Idx->build(getSymbolsFromSlab(std::move(Slab)));
+  Idx->build(getSymbolsFromSlab(std::move(Slab)), {});
   return std::move(Idx);
sammccall wrote:
> we should find a way to avoid having functions implicitly zero out parts of the index like this!
Made it explicit.

Comment at: clangd/index/Merge.cpp:95
+    Static->findOccurrences(Req, [&](const SymbolOccurrence& O) {
+      if (llvm::is_contained(SeenFiles, O.Location.FileURI))
+        return;
ilya-biryukov wrote:
> `llvm::is_contained` seems to be linear time, maybe replace with hash-table lookup.
> Or am I missing something?
Good catch, I thought it had a trait for `Map`, `Set`, but it turns out that `is_contained` is only a `std::find` wrapper :(

  rCTE Clang Tools Extra


More information about the cfe-commits mailing list