[PATCH] D136723: [include-cleaner] Record main-file macro occurences and includes

Haojian Wu via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Wed Oct 26 02:25:57 PDT 2022


hokein added a comment.

Left a few initial comments, it looks roughly good to me (for the macro-usage case, I might miss some historical context there, I think we come to an agreement that what this patch proposes is the designed behavior).



================
Comment at: clang-tools-extra/include-cleaner/include/clang-include-cleaner/Record.h:75
+    //  - for a logical file like <vector>, we check Spelled
+    llvm::SmallVector<const Include *> match(Header H) const;
+
----------------
sammccall wrote:
> in the prototype I reimplemented this function in clangd, but I expect we can just reuse the RecordedIncludes class instead, copying from clangd's includes list is cheap.
> 
> (That's one argument for putting this in a different header, which I can do already if you prefer)
that's an interesting idea, but we need to do it carefully because of `FileEntry*`, the `Include` structure has a filed of `FileEntry*`, it is not feasible for clangd to propagate it (clangd's `Inclusion` doesn't have it, instead it uses a `HeaderID` which is based on the `fs::UniqueID` to identify a physical file).

But I think this is not something we should worry about at the moment, and the current interfaces look quite good.


================
Comment at: clang-tools-extra/include-cleaner/include/clang-include-cleaner/Record.h:79
+    std::vector<Include> All;
+    llvm::StringMap<llvm::SmallVector<unsigned>> BySpelling;
+    llvm::DenseMap<const FileEntry *, llvm::SmallVector<unsigned>> ByFile;
----------------
nit: worth a comment mentioning the unsigned is the index of `All`.


================
Comment at: clang-tools-extra/include-cleaner/include/clang-include-cleaner/Types.h:118
+  const FileEntry *Resolved = nullptr; // e.g. /path/to/c++/v1/vector
+  SourceLocation Location;             // of hash in #include <vector>
+  unsigned Line = 0;                   // 1-based line number for #include
----------------
nit: HashLoc seems clearer than `Location`.

And it looks like `Location` and `Line` feels somewhat redundant -- we can get the Line loc from the `Location` with `SourceManager`. But I think it is fair to hold both, Line is an important property of the include, which will probably widely used.


================
Comment at: clang-tools-extra/include-cleaner/unittests/RecordTest.cpp:159
+    #define Y X
+    int one = x;
+  )cpp");
----------------
why using a lower case `x` here?


================
Comment at: clang-tools-extra/include-cleaner/unittests/RecordTest.cpp:167
+
+    int one = ^X;
+    int uno = $exp^LATE; // a ref in LATE's expansion
----------------
this is a redef error with the one defined in the header, I think it is not intended, rename it?


================
Comment at: clang-tools-extra/include-cleaner/unittests/RecordTest.cpp:180
+  Inputs.ExtraFiles["header.h"] = Header.code();
+  Inputs.ErrorOK = true; // missing header
+  auto AST = build();
----------------
IIUC, ErrorOK is irrelevant, and should be removed.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D136723



More information about the cfe-commits mailing list