diff --git a/clang-tools-extra/include-cleaner/lib/LocateSymbol.cpp b/clang-tools-extra/include-cleaner/lib/LocateSymbol.cpp --- a/clang-tools-extra/include-cleaner/lib/LocateSymbol.cpp +++ b/clang-tools-extra/include-cleaner/lib/LocateSymbol.cpp @@ -7,6 +7,7 @@ //===----------------------------------------------------------------------===// #include "AnalysisInternal.h" +#include "clang-include-cleaner/Types.h" #include "clang/AST/Decl.h" #include "clang/AST/DeclBase.h" #include "clang/AST/DeclCXX.h" @@ -53,6 +54,12 @@ return Result; } +std::vector> locateMacro(const Macro &M) { + // FIXME: Should we also provide physical locations? + if (auto SS = tooling::stdlib::Symbol::named("", M.Name->getName())) + return {{*SS, Hints::CompleteSymbol}}; + return {{M.Definition, Hints::CompleteSymbol}}; +} } // namespace std::vector> locateSymbol(const Symbol &S) { @@ -60,7 +67,7 @@ case Symbol::Declaration: return locateDecl(S.declaration()); case Symbol::Macro: - return {{S.macro().Definition, Hints::CompleteSymbol}}; + return locateMacro(S.macro()); } llvm_unreachable("Unknown Symbol::Kind enum"); } diff --git a/clang-tools-extra/include-cleaner/unittests/LocateSymbolTest.cpp b/clang-tools-extra/include-cleaner/unittests/LocateSymbolTest.cpp --- a/clang-tools-extra/include-cleaner/unittests/LocateSymbolTest.cpp +++ b/clang-tools-extra/include-cleaner/unittests/LocateSymbolTest.cpp @@ -122,9 +122,17 @@ } TEST(LocateSymbol, Stdlib) { - LocateExample Test("namespace std { struct vector; }"); - EXPECT_THAT(locateSymbol(Test.findDecl("vector")), - ElementsAre(*tooling::stdlib::Symbol::named("std::", "vector"))); + { + LocateExample Test("namespace std { struct vector; }"); + EXPECT_THAT( + locateSymbol(Test.findDecl("vector")), + ElementsAre(*tooling::stdlib::Symbol::named("std::", "vector"))); + } + { + LocateExample Test("#define assert(x)\nvoid foo() { assert(true); }"); + EXPECT_THAT(locateSymbol(Test.findMacro("assert")), + ElementsAre(*tooling::stdlib::Symbol::named("", "assert"))); + } } TEST(LocateSymbol, Macros) {