[PATCH] D114370: [clangd] IncludeCleaner: Attribute symbols from non self-contained headers to their parents
Sam McCall via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Nov 25 08:22:28 PST 2021
sammccall added a comment.
Thanks, this mostly LG now.
I'd consider splitting out the new infra change (IncludeStructure) from the feature change (include-cleaner treatment).
In case the latter causes some problems...
================
Comment at: clang-tools-extra/clangd/Headers.cpp:92
InBuiltinFile = false;
+ // At the file exit time HeaderSearchInfo is valid and can be used to
+ // determine whether the file was a self-contained header or not.
----------------
nit: at the file exit time -> at file exit time
================
Comment at: clang-tools-extra/clangd/Headers.h:65
SrcMgr::CharacteristicKind FileKind = SrcMgr::C_User;
+ bool SelfContained = true;
llvm::Optional<unsigned> HeaderID;
----------------
Why redundantly track this on Inclusion? It's already available via IncludeStructure.SelfContained.contains(*HeaderID)
================
Comment at: clang-tools-extra/clangd/Headers.h:128
// populates the structure.
- std::unique_ptr<PPCallbacks> collect(const SourceManager &SM);
+ std::unique_ptr<PPCallbacks> collect(const SourceManager &SM,
+ HeaderSearch &HeaderInfo);
----------------
Maybe it's neater just to pass the CompilerInstance& - there's no other practical way to use this.
================
Comment at: clang-tools-extra/clangd/Headers.h:158
+ // Contains HeaderIDs of all self-contained entries in the IncludeStructure.
+ llvm::DenseSet<HeaderID> SelfContained;
+
----------------
I think i'd prefer to see this private with an `isSelfContained` accessor, because the representation isn't the only sensible one.
Case in point: almost all headers in practice are self-contained, so in fact storing the set of non-self-contained headers seems preferable.
================
Comment at: clang-tools-extra/clangd/SourceCode.cpp:53
+namespace {
+
----------------
these helpers are 1000 lines away from the only place they're used, please move them closer
================
Comment at: clang-tools-extra/clangd/SourceCode.h:330
+/// guard, does not rely on preprocessor state). This will read a portion of the
+/// file which might be discouraged in performance-sensitive context.
+bool isSelfContainedHeader(const FileEntry *FE, FileID ID,
----------------
This still doesn't really describe the situation:
- if you're not getting the header from a preamble, it won't have to read anything as it'll be in-memory already
- if you are, then the fact that the content may have changed is at least as big a problem
- the string scanning itself is not ideal to do redundantly from a performance POV
I'd rather say:
"This scans source code, and should not be called when using a preamble.
Prefer to access the cache in IncludeStructure::isSelfContained if you can."
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D114370/new/
https://reviews.llvm.org/D114370
More information about the cfe-commits
mailing list