[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 00:46:00 PST 2022


hokein marked 2 inline comments as done.
hokein added inline comments.


================
Comment at: clang-tools-extra/include-cleaner/lib/FindHeaders.cpp:39
     FileID FID = SM.getFileID(Loc.physical());
-    const auto *FE = SM.getFileEntryForID(FID);
+    const auto *FE = getResponsibleHeader(FID, SM, PI);
     if (!FE)
----------------
hokein wrote:
> kadircet wrote:
> > i am not sure if sequencing of this and rest of the IWYU pragma handling is the right actually.
> > 
> > e.g. consider a scenario in which:
> > private.h:
> > ```
> > // IWYU private, include "public.h"
> > void foo();
> > ```
> > private-impl.h:
> > ```
> > #pragma once
> > #include "private.h"
> > ```
> > 
> > we'll actually now use `private-impl.h` as provider for `foo` rather than `public.h`, a similar argument goes for export pragma. i think intent of the developer is a lot more explicit when we have these pragmas around, so we should prioritize them and then pick the self contained one, if it's still needed. WDYT?
> It looks reasonable to me. Thanks for raising this case, this is a good point. I mostly considered the case where the self-contained file has the IWYU private mapping.
> 
> My current thought is:
> 
> Overall algorithm: we check the original `FE` to see whether we can get any IWYU mapping (private, export) headers, if there is any, we use these mapping headers as final results; if not, we use the `selfContainedHeader(FE)` and its IWYU mapping headers;
> 
> Below are the cases I considered -- 1), 2), 4) works fine, but the 3) is not perfect (as we prioritize the IWYU mapping headers), but probably ok.
> 
> ```
>   // Case1: Private
>   // findHeaders("private1.inc") => "path/public1.h"
>   Inputs.ExtraFiles["private1.h"] = R"cpp(
>     #pragma once
>     #include "private1.inc"
>   )cpp");
>   Inputs.ExtraFiles["private1.inc"] = R"cpp(
>     // IWYU pragma: private, include "path/public1.h"
>   )cpp";
> 
>   // Case2: Private
>   // findHeaders("private2.inc") => "path/public2.h"
>   Inputs.ExtraFiles["private2.h"] = R"cpp(
>     #pragma once
>     // IWYU pragma: private, include "path/public2.h"
>     #include "private2.inc"
>   )cpp";
>   Inputs.ExtraFiles["private2.inc"] = "";
> 
>   // Case3: Export
>   // findHeaders("details1.inc") => "details1.inc", "export1.h"
>   Inputs.ExtraFiles["export1.h"] = R"cpp(
>     #include "details1.inc" // IWYU pragma: export
>   )cpp";
>   Inputs.ExtraFiles["details1.inc"] = "";
> 
>   // Case4: Export
>   // findHeaders("details2.inc") => "export2.h", "export2_internal.h"
>   Inputs.ExtraFiles["export2.h"] =R"cpp(
>     #pragma once
>     #include "export2_internal.h" // IWYU pragma: export
>   )cpp";
>   Inputs.ExtraFiles["export2_internal.h"] = R"cpp(
>     #pragma once
>     #include "details2.inc"
>   )cpp";
>   Inputs.ExtraFiles["details2.inc"] = "";
> ```
> 
> Let me know what you think about it.
> 
based on our offline discussion, we're going to preserve all header candidates here (and with proper private/export signals attached, which will be in in a followup patch), and let the later step to select proper headers.


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