sammccall added a comment.

This is cool!
I think it will interact with other features (stdlib, exported headers), and so 
whatever lands second is going to have to eat the complexity of that 
interaction.
I think both stdlib and exported headers are more critical and more essentially 
complex, so should probably land first to drive the design.



================
Comment at: clang-tools-extra/clangd/IncludeCleaner.cpp:298
+
+llvm::StringSet<> reachableUsedHeaders(
+    const IncludeStructure &IncludeGraph, IncludeStructure::HeaderID Source,
----------------
It seems like this is going to include any files that are transitively 
reachable through multiple paths and directly reachable through none. These are 
going to seem like false positives.
Like <stddef.h> if the file uses size_t at all, or something.

Sure, if you want the whole file to be IWYU-clean you should remove <unused.h> 
and add <stddef.h>, but they're not *really* related.


================
Comment at: clang-tools-extra/clangd/IncludeCleaner.cpp:311
+      Result.insert(IncludeGraph.getRealPath(NextID));
+    for (const auto &Header : IncludeGraph.IncludeChildren.lookup(NextID))
+      if (!Visited.contains(Header))
----------------
This is going to have problems with private/exported headers.

Consider includes main -> foo -> bar -> private.
Main uses a symbol from private, bar exports private.
You need to suggest replacing the include of foo -> {bar}, not {bar, private}.

However you still want to traverse children of private in case main uses those.


================
Comment at: clang-tools-extra/clangd/IncludeCleaner.cpp:376
     D.Fixes.back().Edits.emplace_back();
-    D.Fixes.back().Edits.back().range.start.line = Inc->HashLine;
-    D.Fixes.back().Edits.back().range.end.line = Inc->HashLine + 1;
+    D.Fixes.back().Edits.back().range.start.line = I.Include->HashLine;
+    D.Fixes.back().Edits.back().range.end.line = I.Include->HashLine + 1;
----------------
We should offer both fixes as alternatives, maybe?


================
Comment at: clang-tools-extra/clangd/IncludeCleaner.cpp:381
+      DirectIncludes +=
+          llvm::formatv("#include \"{0}\"\n", Replacement.getKey());
+    }
----------------
exactly how to spell an include and where to place it is tricky. See 
IncludeInserter.h in headers.


================
Comment at: clang-tools-extra/clangd/IncludeCleaner.h:69
 
-std::vector<const Inclusion *> computeUnusedIncludes(ParsedAST &AST);
+llvm::StringSet<> reachableUsedHeaders(
+    IncludeStructure &IncludeGraph, IncludeStructure::HeaderID Source,
----------------
why are we back to passing around strings?


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D113262

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

Reply via email to