kadircet marked 2 inline comments as done.
kadircet added a comment.

thanks a lot for the review!



================
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()) {
----------------
hokein wrote:
> 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.
> 
> 
> 
> But now clangd is diverging from the clang-include-cleaner tool.

And I was trying to make the point that we're already not trying to avoid that, 
deliberately. As our use definitions & objectives around automation are 
drastically different.

> 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).

I think there's harm rather than value in enabling people to introduce 
annotations, especially when they're not needed. Happy to discuss this more.

> I think private=>public is 1:1, but public=>private is not always 1:1

There's no matching like public "header" => private "header". The mapping goes 
from "an include in a header" to "a private header", which is still 1:1 and I 
believe even in that case it's obvious (regular case for an umbrella header)


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