[PATCH] D149437: [clangd] Emit ChangeAnnotation label and description for include-cleaner diagnostics.

Kadir Cetinkaya via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Jun 9 03:15:49 PDT 2023


kadircet added a comment.

thanks, mostly LG. I think we need to be a little careful when generating insertions for all the missing includes though.



================
Comment at: clang-tools-extra/clangd/IncludeCleaner.cpp:169
 
-std::vector<Diag> generateMissingIncludeDiagnostics(
+using MissingIncludeEdits = llvm::MapVector<include_cleaner::Header, TextEdit>;
+MissingIncludeEdits generateMissingIncludeEdits(
----------------
what do we gain by preserving the insertion order here exactly?

in `generateMissingIncludeDiagnostics`, we already traverse using the order of `MissingIncludeDiagInfo`s and inside `addAllMissingIncludes` the order we preserved here (diagnostic order) doesn't really make much sense, we probably should generate fixes in the order of insertion location, or header spelling.

so what about just using a DenseMap ?


================
Comment at: clang-tools-extra/clangd/IncludeCleaner.cpp:176
   const FileEntry *MainFile = SM.getFileEntryForID(SM.getMainFileID());
+  const Config &Cfg = Config::current();
 
----------------
nit: maybe inline into the call site


================
Comment at: clang-tools-extra/clangd/IncludeCleaner.cpp:330
+  llvm::DenseMap<include_cleaner::Header,
+                 llvm::SetVector<include_cleaner::Symbol>>
+      HeaderToSymbols;
----------------
we might still have symbols with the same name (`ns1::Foo` vs `ns2::Foo`), they'll show up the same in the final annotation.

since we're already sorting by name, we might as well deduplicate after sorting and store just a SmallVector here


================
Comment at: clang-tools-extra/clangd/IncludeCleaner.cpp:353
+    ChangeAnnotationIdentifier ID = AddAllMissingID + std::to_string(I++);
+    AddAllMissing.Edits.push_back(Edit);
+    AddAllMissing.Edits.back().annotationId = ID;
----------------
we might generate multiple insertions to same location here e.g. insert `a.h` and `b.h` at the top of the file. [LSP](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#textEditArray) says that order reported by the server will be preserved. hence we should actually make sure our edits are ordered by spelling.


================
Comment at: clang-tools-extra/clangd/IncludeCleaner.h:44
   }
+  include_cleaner::Header header() const {
+    assert(!Providers.empty());
----------------
can you put definition out-of-line ?


================
Comment at: clang-tools-extra/include-cleaner/include/clang-include-cleaner/Types.h:71
 
+  std::string name() const;
+
----------------
// Unqualified name of the symbol


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D149437



More information about the cfe-commits mailing list