[PATCH] D50385: [clangd] Collect symbol occurrences in SymbolCollector
Sam McCall via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Aug 27 23:42:11 PDT 2018
sammccall added a comment.
This looks pretty good!
================
Comment at: clangd/index/Index.h:376
+
+ llvm::ArrayRef<SymbolOccurrence> find(const SymbolID &ID) const {
+ auto It = Occurrences.find(ID);
----------------
assert frozen?
looking up in a non-frozen array is probably a mistake.
if we choose to optimize this, it probably won't be possible.
================
Comment at: clangd/index/Index.h:377
+ llvm::ArrayRef<SymbolOccurrence> find(const SymbolID &ID) const {
+ auto It = Occurrences.find(ID);
+ if (It == Occurrences.end())
----------------
return Occurrences.lookup(ID)?
================
Comment at: clangd/index/SymbolCollector.cpp:227
+SymbolOccurrenceKind ToOccurrenceKind(index::SymbolRoleSet Roles) {
+ SymbolOccurrenceKind Kind;
----------------
nit: toOccurrenceKind
================
Comment at: clangd/index/SymbolCollector.cpp:229
+ SymbolOccurrenceKind Kind;
+ for (auto Mask :
+ {SymbolOccurrenceKind::Declaration, SymbolOccurrenceKind::Definition,
----------------
If you want to filter out the unsupported bits, maybe just add an explicit `AllOccurrenceKinds` constant to the header file, and `return AllOccurrenceKinds & Roles` here? (plus casts)
================
Comment at: clangd/index/SymbolCollector.cpp:328
+ if ((static_cast<unsigned>(Opts.OccurrenceFilter) & Roles) &&
+ SM.getFileID(SM.getSpellingLoc(Loc)) == SM.getMainFileID())
+ DeclOccurrences[ND].emplace_back(Loc, Roles);
----------------
just compute the spelling loc once and reuse?
================
Comment at: clangd/index/SymbolCollector.cpp:329
+ SM.getFileID(SM.getSpellingLoc(Loc)) == SM.getMainFileID())
+ DeclOccurrences[ND].emplace_back(Loc, Roles);
+
----------------
you get the spelling loc on the previous line to check for mainfile - so surely we should be using spelling loc here?
================
Comment at: clangd/index/SymbolCollector.cpp:455
+
+ for (auto& It : DeclOccurrences) {
+ if (auto ID = getSymbolID(It.first)) {
----------------
nit: const auto& for clarity since we're not mutating
================
Comment at: clangd/index/SymbolCollector.cpp:460
+ std::string FileURI;
+ if (auto DeclLoc = getTokenLocation(LocAndRole.first,
+ ASTCtx->getSourceManager(), Opts,
----------------
so this seems maybe gratuitously inefficient, we're copying the filename then going through the URI conversion dance for each reference - even though the filename is the same for each.
consider splitting out part of `getTokenLocation` into `getTokenRange(SymbolLocation&)` and only calling that here.
================
Comment at: clangd/index/SymbolCollector.h:54
// Populate the Symbol.References field.
bool CountReferences = false;
// Every symbol collected will be stamped with this origin.
----------------
this should be next to OccurrenceFilter, they're very closely related (the name mismatch is a little unfortunate)
================
Comment at: clangd/index/SymbolCollector.h:121
+ using DeclOccurrence = std::pair<SourceLocation, index::SymbolRoleSet>;
+ llvm::DenseMap<const NamedDecl*, std::vector<DeclOccurrence>> DeclOccurrences;
+ // All symbol occurrences collected from the AST, assembled on finish().
----------------
please move next to ReferencedDecls/ReferencedMacros so the comment applies to this too
================
Comment at: unittests/clangd/SymbolCollectorTests.cpp:466
+ SymbolOccurrences.find(findSymbol(Symbols, "Foo").ID),
+ testing::UnorderedPointwise(OccurrenceRange(), Main.ranges("foo")));
+ EXPECT_THAT(
----------------
this is cute - if possible, consider adding a matcher factory function for readability here, so you can write `EXPECT_THAT(..., HaveRanges(Main.ranges("foo"))`
Repository:
rCTE Clang Tools Extra
https://reviews.llvm.org/D50385
More information about the cfe-commits
mailing list