[PATCH] D155217: [clang-tidy][include-cleaner] Don't warn for the same symbol twice
Alex Brachet via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Jul 13 09:35:04 PDT 2023
abrachet created this revision.
abrachet added reviewers: VitaNuo, hokein.
Herald added subscribers: PiotrZSL, carlosgalvezp, xazax.hun.
Herald added a reviewer: njames93.
Herald added a project: All.
abrachet requested review of this revision.
Herald added a project: clang-tools-extra.
Herald added a subscriber: cfe-commits.
Only one diagnostic per symbol is necessary, after that the diagnostics
can become overbearing.
https://reviews.llvm.org/D155217
Files:
clang-tools-extra/clang-tidy/misc/IncludeCleanerCheck.cpp
clang-tools-extra/test/clang-tidy/checkers/misc/include-cleaner.cpp
Index: clang-tools-extra/test/clang-tidy/checkers/misc/include-cleaner.cpp
===================================================================
--- clang-tools-extra/test/clang-tidy/checkers/misc/include-cleaner.cpp
+++ clang-tools-extra/test/clang-tidy/checkers/misc/include-cleaner.cpp
@@ -15,3 +15,5 @@
// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: no header providing "std::string" is directly included [misc-include-cleaner]
int FooBarResult = foobar();
// CHECK-MESSAGES: :[[@LINE-1]]:20: warning: no header providing "foobar" is directly included [misc-include-cleaner]
+int FooBarResult2 = foobar();
+// CHECK-MESSAGES-NOT: :[[@LINE-1]]:
Index: clang-tools-extra/clang-tidy/misc/IncludeCleanerCheck.cpp
===================================================================
--- clang-tools-extra/clang-tidy/misc/IncludeCleanerCheck.cpp
+++ clang-tools-extra/clang-tidy/misc/IncludeCleanerCheck.cpp
@@ -106,7 +106,11 @@
const SourceManager *SM = Result.SourceManager;
const FileEntry *MainFile = SM->getFileEntryForID(SM->getMainFileID());
llvm::DenseSet<const include_cleaner::Include *> Used;
- std::vector<MissingIncludeInfo> Missing;
+ using SymRef = include_cleaner::SymbolReference;
+ auto Cmp = [](const SymRef &Left, const SymRef &Right) {
+ return Left.Target.name() < Right.Target.name();
+ };
+ std::map<SymRef, include_cleaner::Header, decltype(Cmp)> Missing{Cmp};
llvm::SmallVector<Decl *> MainFileDecls;
for (Decl *D : Result.Nodes.getNodeAs<TranslationUnitDecl>("top")->decls()) {
if (!SM->isWrittenInMainFile(SM->getExpansionLoc(D->getLocation())))
@@ -135,7 +139,7 @@
if (!Satisfied && !Providers.empty() &&
Ref.RT == include_cleaner::RefType::Explicit &&
!shouldIgnore(Providers.front()))
- Missing.push_back({Ref, Providers.front()});
+ Missing.try_emplace(Ref, Providers.front());
});
std::vector<const include_cleaner::Include *> Unused;
@@ -181,9 +185,9 @@
tooling::HeaderIncludes HeaderIncludes(getCurrentMainFile(), Code,
FileStyle->IncludeStyle);
- for (const auto &Inc : Missing) {
+ for (const auto &[SymRef, Header] : Missing) {
std::string Spelling =
- include_cleaner::spellHeader({Inc.Missing, *HS, MainFile});
+ include_cleaner::spellHeader({Header, *HS, MainFile});
bool Angled = llvm::StringRef{Spelling}.starts_with("<");
// We might suggest insertion of an existing include in edge cases, e.g.,
// include is present in a PP-disabled region, or spelling of the header
@@ -192,9 +196,9 @@
if (auto Replacement =
HeaderIncludes.insert(llvm::StringRef{Spelling}.trim("\"<>"),
Angled, tooling::IncludeDirective::Include))
- diag(SM->getSpellingLoc(Inc.SymRef.RefLocation),
+ diag(SM->getSpellingLoc(SymRef.RefLocation),
"no header providing \"%0\" is directly included")
- << Inc.SymRef.Target.name()
+ << SymRef.Target.name()
<< FixItHint::CreateInsertion(
SM->getComposedLoc(SM->getMainFileID(),
Replacement->getOffset()),
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D155217.540079.patch
Type: text/x-patch
Size: 3226 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230713/ddb5403b/attachment.bin>
More information about the cfe-commits
mailing list