Skip to content

Commit

Permalink
[clang-tidy] Correct the include-cleaner-check diagnostic message for…
Browse files Browse the repository at this point in the history
… missing-includes.

We should print the symbol name rather than the header name in the
message.

Differential Revision: https://reviews.llvm.org/D153013
  • Loading branch information
hokein committed Jun 15, 2023
1 parent 015323f commit eed4a4d
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 20 deletions.
10 changes: 5 additions & 5 deletions clang-tools-extra/clang-tidy/misc/IncludeCleanerCheck.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ namespace clang::tidy::misc {

namespace {
struct MissingIncludeInfo {
SourceLocation SymRefLocation;
include_cleaner::SymbolReference SymRef;
include_cleaner::Header Missing;
};
} // namespace
Expand Down Expand Up @@ -134,7 +134,7 @@ void IncludeCleanerCheck::check(const MatchFinder::MatchResult &Result) {
if (!Satisfied && !Providers.empty() &&
Ref.RT == include_cleaner::RefType::Explicit &&
!shouldIgnore(Providers.front()))
Missing.push_back({Ref.RefLocation, Providers.front()});
Missing.push_back({Ref, Providers.front()});
});

std::vector<const include_cleaner::Include *> Unused;
Expand Down Expand Up @@ -190,9 +190,9 @@ void IncludeCleanerCheck::check(const MatchFinder::MatchResult &Result) {
if (auto Replacement =
HeaderIncludes.insert(llvm::StringRef{Spelling}.trim("\"<>"),
Angled, tooling::IncludeDirective::Include))
diag(SM->getSpellingLoc(Inc.SymRefLocation),
"no header providing %0 is directly included")
<< Spelling
diag(SM->getSpellingLoc(Inc.SymRef.RefLocation),
"no header providing \"%0\" is directly included")
<< Inc.SymRef.Target.name()
<< FixItHint::CreateInsertion(
SM->getComposedLoc(SM->getMainFileID(),
Replacement->getOffset()),
Expand Down
13 changes: 1 addition & 12 deletions clang-tools-extra/clangd/IncludeCleaner.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -144,17 +144,6 @@ llvm::StringRef getResolvedPath(const include_cleaner::Header &SymProvider) {
llvm_unreachable("Unknown header kind");
}

std::string getSymbolName(const include_cleaner::Symbol &Sym) {
switch (Sym.kind()) {
case include_cleaner::Symbol::Macro:
return Sym.macro().Name->getName().str();
case include_cleaner::Symbol::Declaration:
return llvm::dyn_cast<NamedDecl>(&Sym.declaration())
->getQualifiedNameAsString();
}
llvm_unreachable("Unknown symbol kind");
}

std::vector<Diag> generateMissingIncludeDiagnostics(
ParsedAST &AST, llvm::ArrayRef<MissingIncludeDiagInfo> MissingIncludes,
llvm::StringRef Code, HeaderFilter IgnoreHeaders) {
Expand Down Expand Up @@ -200,7 +189,7 @@ std::vector<Diag> generateMissingIncludeDiagnostics(
Diag &D = Result.emplace_back();
D.Message =
llvm::formatv("No header providing \"{0}\" is directly included",
getSymbolName(SymbolWithMissingInclude.Symbol));
SymbolWithMissingInclude.Symbol.name());
D.Name = "missing-includes";
D.Source = Diag::DiagSource::Clangd;
D.File = AST.tuPath();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ struct Symbol {

const Decl &declaration() const { return *std::get<Declaration>(Storage); }
struct Macro macro() const { return std::get<Macro>(Storage); }
std::string name() const;

private:
// Order must match Kind enum!
Expand Down
11 changes: 11 additions & 0 deletions clang-tools-extra/include-cleaner/lib/Types.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,17 @@

namespace clang::include_cleaner {

std::string Symbol::name() const {
switch (kind()) {
case include_cleaner::Symbol::Macro:
return macro().Name->getName().str();
case include_cleaner::Symbol::Declaration:
return llvm::dyn_cast<NamedDecl>(&declaration())
->getQualifiedNameAsString();
}
llvm_unreachable("Unknown symbol kind");
}

llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const Symbol &S) {
switch (S.kind()) {
case Symbol::Declaration:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
// CHECK-FIXES: {{^}}
int BarResult = bar();
int BazResult = baz();
// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: no header providing "baz.h" is directly included [misc-include-cleaner]
// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: no header providing "baz" is directly included [misc-include-cleaner]
std::string HelloString;
// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: no header providing <string> is directly included [misc-include-cleaner]
// 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 "public.h" is directly included [misc-include-cleaner]
// CHECK-MESSAGES: :[[@LINE-1]]:20: warning: no header providing "foobar" is directly included [misc-include-cleaner]

0 comments on commit eed4a4d

Please sign in to comment.