hokein accepted this revision.
hokein added inline comments.
This revision is now accepted and ready to land.


================
Comment at: clang-tools-extra/include-cleaner/lib/Analysis.cpp:100
+      // Check if main file is the public interface for a private header. If so
+      // we shouldn't diagnose it as unused.
+      if (auto PHeader = PI->getPublic(I.Resolved); !PHeader.empty()) {
----------------
kadircet wrote:
> hokein wrote:
> > The beahvior (no showing the diagnostic) seems reasonable to me as we can 
> > infer that the included header is supposed to be exported by the main file. 
> > Just explore this a bit more.
> > 
> > The sad bit is that we start diverging from the classical IWYU tool (I have 
> > check it, for this case, it gives an unused-include unless you add an 
> > export pragma).
> > 
> > I think the main cause is that we're missing the `// IWYU pragma: export`, 
> > we should still want to recommend users to add the pragma export, right?
> > 
> > My only concern is that without the `export` pragma, whether the include is 
> > used can't be reason about by just "reading" the main-file content by 
> > human, e.g. for the case below, there is no usage of the `private.h` 
> > (previously the trailing `// IWYU pragma: export` comment is considered a 
> > usage), we have to open the private.h and find the private mapping to 
> > verify the usage.
> > 
> > ```
> > // public.h
> > 
> > #include "private.h"
> > ```
> > 
> > It seems better to provide an `adding //IWYU pragma: export` FIXIT.
> > 
> > The sad bit is that we start diverging from the classical IWYU tool (I have 
> > check it, for this case, it gives an unused-include unless you add an 
> > export pragma).
> 
> we're not providing the same behavior with IWYU tool, it's nice to be 
> compatible with it and this change won't break that compatibility (i.e. if 
> IWYU tool drops this include, we're not suggesting to insert or while IWYU 
> tool is suggesting to insert we're not suggesting to remove). so i don't 
> think this argument applies here.
> 
> > I think the main cause is that we're missing the // IWYU pragma: export, we 
> > should still want to recommend users to add the pragma export, right?
> 
> i don't see the reason why. i think we're actually losing value by enforcing 
> people to annotate headers in both places. if the library provider already 
> put a pragma in the included header, marking the umbrella header as the 
> private header, what's the extra value we're getting by making them also 
> annotate the public header with a bunch of export pragmas? i feel like this 
> goes against the nature of letting tooling automate things as much as 
> possible.
> 
> > My only concern is that without the export pragma, whether the include is 
> > used can't be reason about by just "reading" the main-file content by 
> > human, e.g. for the case below, there is no usage of the private.h 
> > (previously the trailing // IWYU pragma: export comment is considered a 
> > usage), we have to open the private.h and find the private mapping to 
> > verify the usage.
> 
> this definitely makes sense, and having an explicit IWYU export/keep pragma 
> on these includes are definitely nice but I believe in the common case, 
> because private-public matching is 1:1, the reason why a private header is 
> included inside a public header is quite obvious hence absence of these 
> pragmas won't really cause confusion, to the contrary forcing people to 
> introduce them will actually create frustration.
> 
> WDYT?
> this change won't break that compatibility (i.e. if IWYU tool drops this 
> include, we're not suggesting to insert or while IWYU tool is suggesting to 
> insert we're not suggesting to remove). so i don't think this argument 
> applies here.

Agree on this point. This is a safe change. But now clangd is diverging from 
the clang-include-cleaner tool.

> i feel like this goes against the nature of letting tooling automate things 
> as much as possible

I think the proposed change is good.

From the tooling automation, for example, we're doing a large cleanup (remove 
unused includes),  we should not remove this include. 

For interactive tools (like clangd), I actually think in addition to that, 
clangd should tell the user that they are missing an IWYU export pragma here, 
and suggest a FIXIT (but that's probably another thread).
 
> but I believe in the common case, because private-public matching is 1:1, the 
> reason why a private header is included inside a public header is quite 
> obvious hence absence of these pragmas won't really cause confusion

I'm not sure this is true, I think private=>public is 1:1, but public=>private 
is not always 1:1 (e.g. public header use `begin_export`/`end_export` to export 
a bunch of headers),
for these public headers, missing export pragmas is hard to justify the purpose.





================
Comment at: clang-tools-extra/include-cleaner/unittests/AnalysisTest.cpp:231
+  {
+    Inputs.Code = R"cpp(
+#include "private.h"
----------------
nit: fix the format, or just use a string. 


================
Comment at: clang-tools-extra/include-cleaner/unittests/AnalysisTest.cpp:232
+    Inputs.Code = R"cpp(
+#include "private.h"
+)cpp";
----------------
nit:  add a trailing comment `// line 2`, to make the L243 clearer.  


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D146406/new/

https://reviews.llvm.org/D146406

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to