[PATCH] D137698: [include-cleaner] Add self-contained file support for PragmaIncludes.
Haojian Wu via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Nov 18 03:13:02 PST 2022
hokein added inline comments.
================
Comment at: clang-tools-extra/include-cleaner/lib/CMakeLists.txt:12
LINK_LIBS
clangAST
----------------
mstorsjo wrote:
> Note that this file changed a bit further in 68294afa0836bb62be921e2143d147cdfdc8ba70, so you may want to rebase again.
>
> (I tested this patch after rebasing, in a mingw+dylib build configuration, and it still builds correctly there.)
sure, and thank you very much for taking care of the mingw+dylib build!
================
Comment at: clang-tools-extra/include-cleaner/lib/FindHeaders.cpp:24
+ const FileEntry *FE = SM.getFileEntryForID(FID);
+ if (!PI && FE)
+ return {Header(FE)};
----------------
kadircet wrote:
> can we rather write this as:
> ```
> if (!PI)
> return FE ? {Header(FE)} : {};
> ```
>
> i think it makes it more clear that in the absence of PI we're just terminating the traversal no matter what (rather than getting into the code below with possibly a null PI, because FE also happened to be null).
I agree, we can do that, but but the sad bit is that we need to explicitly spell the return type in the conditional operator.
================
Comment at: clang-tools-extra/include-cleaner/lib/FindHeaders.cpp:30
// FIXME: compute transitive exporter headers.
for (const auto *Export : PI->getExporters(FE, SM.getFileManager()))
Results.push_back(Export);
----------------
kadircet wrote:
> nit: `Results.append(PI->getExporters(FE, SM.getFileManager()))`
the type of two container is different (Header vs FileEntry, I updated to explicitly spell the `Header` type in the push_back) -- if we want to get rid of the for-loop, we could use the `llvm::for_each`.
================
Comment at: clang-tools-extra/include-cleaner/unittests/FindHeadersTest.cpp:85
EXPECT_THAT(findHeaders(SourceLocFromFile("header1.h"), SM, &PI),
+ UnorderedElementsAre(Header("\"path/public.h\""),
----------------
kadircet wrote:
> tests and assertions here are getting a little bit hard to follow. do you mind splitting them into smaller chunks instead? each testing different parts of the traversal behaviour. one for private->public mappings, another for exports, another for non-self contained traversal. having another big integration test for testing each might also be fine, but it's really hard to reason about so i don't think that should be the main test in which we're testing the behaviour.
>
> apart from that this might be easier to follow if we did some renaming:
> - header1.h -> private1.h
> - header2.h -> exporter.h (also probably move non-exported includes to a different header)
> - detailx.h -> exportedx.h
> - impx.inc -> fragmentx.inc
that sounds fair enough, split into small tests.
================
Comment at: clang-tools-extra/include-cleaner/unittests/FindHeadersTest.cpp:105
+ // that we don't emit its includer.
+ EXPECT_THAT(findHeaders(SourceLocFromFile("imp_private.inc"), SM, &PI),
+ UnorderedElementsAre(PhysicalHeader("imp_private.inc"),
----------------
kadircet wrote:
> i think it would be better to check we stop traversal once we hit the pragma (i.e. have a non-self contained file included by another non-self contained file that also has a IWYU private mapping).
I think this is covered by this case (though this case is quite simple) -- we started the traversing from the imp_private.inc, at the beginning we hit the the IWYU private mapping, we stop immediately.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D137698/new/
https://reviews.llvm.org/D137698
More information about the cfe-commits
mailing list