sammccall added a comment.

In D106394#2893457 <https://reviews.llvm.org/D106394#2893457>, @ldionne wrote:

> In D106394#2892832 <https://reviews.llvm.org/D106394#2892832>, @sammccall 
> wrote:
>
>> Eventually this seems like a reasonable thing to want for user code. What 
>> are your motivations for restricting it to system headers? (And do you think 
>> people in future will be tempted to lift them?)
>
> The problem with extending this to non-system headers is that you need a way 
> to tell which headers are allowed to include the detail headers and which 
> ones are not.

Ah, of course. It's a shame if this is a fatal reason because it seems like a 
small thing.

IWYU defines a whole bunch of other "pragmas", and one is "IWYU pragma: friend" 
for this purpose. This works but adds complexity to the source code (I didn't 
see it being as heavy as defining modules, but I haven't thought about it much) 
and also to consuming tools (we don't support it in clangd for this reason).

Annotating the include site instead like `#include "internals.h" // friend` 
seems almost tempting but magic-comments issues aside doesn't solve all the 
questions tools have (like what include to insert if none exists yet).

> Hmm... I like prior art. That clangd supports it suggests that there's a 
> section of code I can look at for inspiration if we were to replace this 
> pragma with the IWYU comment-pragma

Sure, there's nothing terribly interesting to see though. Clangd doesn't yet 
use it for warnings, but sometimes when we encounter an indexed symbol we 
consider inserting an `#include` for it (code completion, fixit for missing 
symbol). At indexing time the IWYU pragma is used to determine which insertable 
header we'll record for that symbol.

Indexing 1 
<https://github.com/llvm/llvm-project/blob/f14495dc75d72d8900b3f4056a36a1ba5063e957/clang-tools-extra/clangd/index/CanonicalIncludes.cpp#L59-L82>
 - parse an IWYU comment. Note that it always produces a quoted string, which 
means a verbatim `#include` spelling, rather than a resolved file path, thus 
the FIXME.
Indexing 2 
<https://github.com/llvm/llvm-project/blob/f14495dc75d72d8900b3f4056a36a1ba5063e957/clang-tools-extra/clangd/index/SymbolCollector.cpp#L228-L255>
 - determine the includable header for symbols from a FileID.
(The code completion and diagnostic fixit code isn't terribly interesting or 
readable...)

> (I wonder why they didn't just go with #pragma IWYU ...?).

Historically, it may have been the principled reason @Quuxplusone mentioned, or 
it may simply have been that as an *out-of-tree* clang-based tool, it's easier 
to hook comments in PPCallbacks than it is to hook an unknown pragma. (Of 
course these reasons are connected)

> If IWYU has already developed a de facto standard for this information, I 
> would recommend libc++ just use it (perhaps with no changes needed in clang 
> at all).

One hesitation I'd have about adopting this convention is that while the "IWYU 
pragma: friend" subset seems to coincide exactly with the design you want, the 
full set of IWYU pragmas are a rich/complicated set that I'm less confident in 
the design of.
Supporting only this subset will cause *some* confusion/pressure for more, but 
later choosing to extend the model will force a choice between adopting more 
IWYU pragmas (may be the wrong design) or doing something else with overlapping 
functionality (lots of confusion).


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D106394

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

Reply via email to