diff options
Diffstat (limited to 'clang-tools-extra/unittests')
-rw-r--r-- | clang-tools-extra/unittests/include-fixer/IncludeFixerTest.cpp | 87 | ||||
-rw-r--r-- | clang-tools-extra/unittests/include-fixer/find-all-symbols/FindAllSymbolsTests.cpp | 189 |
2 files changed, 194 insertions, 82 deletions
diff --git a/clang-tools-extra/unittests/include-fixer/IncludeFixerTest.cpp b/clang-tools-extra/unittests/include-fixer/IncludeFixerTest.cpp index 9402c28ffbf..029590aed30 100644 --- a/clang-tools-extra/unittests/include-fixer/IncludeFixerTest.cpp +++ b/clang-tools-extra/unittests/include-fixer/IncludeFixerTest.cpp @@ -19,6 +19,7 @@ namespace include_fixer { namespace { using find_all_symbols::SymbolInfo; +using find_all_symbols::SymbolAndSignals; static bool runOnCode(tooling::ToolAction *ToolAction, StringRef Code, StringRef FileName, @@ -52,42 +53,49 @@ static bool runOnCode(tooling::ToolAction *ToolAction, StringRef Code, static std::string runIncludeFixer( StringRef Code, const std::vector<std::string> &ExtraArgs = std::vector<std::string>()) { - std::vector<SymbolInfo> Symbols = { - SymbolInfo("string", SymbolInfo::SymbolKind::Class, "<string>", 1, - {{SymbolInfo::ContextType::Namespace, "std"}}), - SymbolInfo("sting", SymbolInfo::SymbolKind::Class, "\"sting\"", 1, - {{SymbolInfo::ContextType::Namespace, "std"}}), - SymbolInfo("foo", SymbolInfo::SymbolKind::Class, "\"dir/otherdir/qux.h\"", - 1, {{SymbolInfo::ContextType::Namespace, "b"}, - {SymbolInfo::ContextType::Namespace, "a"}}), - SymbolInfo("bar", SymbolInfo::SymbolKind::Class, "\"bar.h\"", 1, - {{SymbolInfo::ContextType::Namespace, "b"}, - {SymbolInfo::ContextType::Namespace, "a"}}), - SymbolInfo("bar", SymbolInfo::SymbolKind::Class, "\"bar2.h\"", 1, - {{SymbolInfo::ContextType::Namespace, "c"}, - {SymbolInfo::ContextType::Namespace, "a"}}), - SymbolInfo("Green", SymbolInfo::SymbolKind::Class, "\"color.h\"", 1, - {{SymbolInfo::ContextType::EnumDecl, "Color"}, - {SymbolInfo::ContextType::Namespace, "b"}, - {SymbolInfo::ContextType::Namespace, "a"}}), - SymbolInfo("Vector", SymbolInfo::SymbolKind::Class, "\"Vector.h\"", 1, - {{SymbolInfo::ContextType::Namespace, "__a"}, - {SymbolInfo::ContextType::Namespace, "a"}}, - /*num_occurrences=*/2), - SymbolInfo("Vector", SymbolInfo::SymbolKind::Class, "\"Vector.h\"", 2, - {{SymbolInfo::ContextType::Namespace, "a"}}, - /*num_occurrences=*/1), - SymbolInfo("StrCat", SymbolInfo::SymbolKind::Class, "\"strcat.h\"", - 1, {{SymbolInfo::ContextType::Namespace, "str"}}), - SymbolInfo("str", SymbolInfo::SymbolKind::Class, "\"str.h\"", - 1, {}), - SymbolInfo("foo2", SymbolInfo::SymbolKind::Class, "\"foo2.h\"", - 1, {}), + std::vector<SymbolAndSignals> Symbols = { + {SymbolInfo("string", SymbolInfo::SymbolKind::Class, "<string>", 1, + {{SymbolInfo::ContextType::Namespace, "std"}}), + SymbolInfo::Signals{}}, + {SymbolInfo("sting", SymbolInfo::SymbolKind::Class, "\"sting\"", 1, + {{SymbolInfo::ContextType::Namespace, "std"}}), + SymbolInfo::Signals{}}, + {SymbolInfo("foo", SymbolInfo::SymbolKind::Class, + "\"dir/otherdir/qux.h\"", 1, + {{SymbolInfo::ContextType::Namespace, "b"}, + {SymbolInfo::ContextType::Namespace, "a"}}), + SymbolInfo::Signals{}}, + {SymbolInfo("bar", SymbolInfo::SymbolKind::Class, "\"bar.h\"", 1, + {{SymbolInfo::ContextType::Namespace, "b"}, + {SymbolInfo::ContextType::Namespace, "a"}}), + SymbolInfo::Signals{}}, + {SymbolInfo("bar", SymbolInfo::SymbolKind::Class, "\"bar2.h\"", 1, + {{SymbolInfo::ContextType::Namespace, "c"}, + {SymbolInfo::ContextType::Namespace, "a"}}), + SymbolInfo::Signals{}}, + {SymbolInfo("Green", SymbolInfo::SymbolKind::Class, "\"color.h\"", 1, + {{SymbolInfo::ContextType::EnumDecl, "Color"}, + {SymbolInfo::ContextType::Namespace, "b"}, + {SymbolInfo::ContextType::Namespace, "a"}}), + SymbolInfo::Signals{}}, + {SymbolInfo("Vector", SymbolInfo::SymbolKind::Class, "\"Vector.h\"", 1, + {{SymbolInfo::ContextType::Namespace, "__a"}, + {SymbolInfo::ContextType::Namespace, "a"}}), + SymbolInfo::Signals{/*Seen=*/2, 0}}, + {SymbolInfo("Vector", SymbolInfo::SymbolKind::Class, "\"Vector.h\"", 2, + {{SymbolInfo::ContextType::Namespace, "a"}}), + SymbolInfo::Signals{/*Seen=*/2, 0}}, + {SymbolInfo("StrCat", SymbolInfo::SymbolKind::Class, "\"strcat.h\"", 1, + {{SymbolInfo::ContextType::Namespace, "str"}}), + SymbolInfo::Signals{}}, + {SymbolInfo("str", SymbolInfo::SymbolKind::Class, "\"str.h\"", 1, {}), + SymbolInfo::Signals{}}, + {SymbolInfo("foo2", SymbolInfo::SymbolKind::Class, "\"foo2.h\"", 1, {}), + SymbolInfo::Signals{}}, }; - auto SymbolIndexMgr = llvm::make_unique<include_fixer::SymbolIndexManager>(); - SymbolIndexMgr->addSymbolIndex([=]() { - return llvm::make_unique<include_fixer::InMemorySymbolIndex>(Symbols); - }); + auto SymbolIndexMgr = llvm::make_unique<SymbolIndexManager>(); + SymbolIndexMgr->addSymbolIndex( + [=]() { return llvm::make_unique<InMemorySymbolIndex>(Symbols); }); std::vector<IncludeFixerContext> FixerContexts; IncludeFixerActionFactory Factory(*SymbolIndexMgr, FixerContexts, "llvm"); @@ -96,15 +104,14 @@ static std::string runIncludeFixer( assert(FixerContexts.size() == 1); if (FixerContexts.front().getHeaderInfos().empty()) return Code; - auto Replaces = clang::include_fixer::createIncludeFixerReplacements( - Code, FixerContexts.front()); + auto Replaces = createIncludeFixerReplacements(Code, FixerContexts.front()); EXPECT_TRUE(static_cast<bool>(Replaces)) << llvm::toString(Replaces.takeError()) << "\n"; if (!Replaces) return ""; - clang::RewriterTestContext Context; - clang::FileID ID = Context.createInMemoryFile(FakeFileName, Code); - clang::tooling::applyAllReplacements(*Replaces, Context.Rewrite); + RewriterTestContext Context; + FileID ID = Context.createInMemoryFile(FakeFileName, Code); + tooling::applyAllReplacements(*Replaces, Context.Rewrite); return Context.getRewrittenText(ID); } diff --git a/clang-tools-extra/unittests/include-fixer/find-all-symbols/FindAllSymbolsTests.cpp b/clang-tools-extra/unittests/include-fixer/find-all-symbols/FindAllSymbolsTests.cpp index 852fe148de1..e90f0211c54 100644 --- a/clang-tools-extra/unittests/include-fixer/find-all-symbols/FindAllSymbolsTests.cpp +++ b/clang-tools-extra/unittests/include-fixer/find-all-symbols/FindAllSymbolsTests.cpp @@ -19,6 +19,7 @@ #include "clang/Frontend/PCHContainerOperations.h" #include "clang/Tooling/Tooling.h" #include "llvm/ADT/IntrusiveRefCntPtr.h" +#include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringRef.h" #include "llvm/Support/MemoryBuffer.h" #include "gtest/gtest.h" @@ -31,25 +32,28 @@ namespace find_all_symbols { static const char HeaderName[] = "symbols.h"; -class TestSymbolReporter : public clang::find_all_symbols::SymbolReporter { +class TestSymbolReporter : public SymbolReporter { public: ~TestSymbolReporter() override {} - void reportSymbol(llvm::StringRef FileName, - const SymbolInfo &Symbol) override { - Symbols.push_back(Symbol); + void reportSymbols(llvm::StringRef FileName, + const SymbolInfo::SignalMap &NewSymbols) override { + for (const auto &Entry : NewSymbols) + Symbols[Entry.first] += Entry.second; } bool hasSymbol(const SymbolInfo &Symbol) const { - for (const auto &S : Symbols) { - if (S == Symbol) - return true; - } - return false; + auto it = Symbols.find(Symbol); + return it != Symbols.end() && it->second.Seen > 0; + } + + bool hasUse(const SymbolInfo &Symbol) const { + auto it = Symbols.find(Symbol); + return it != Symbols.end() && it->second.Used > 0; } private: - std::vector<SymbolInfo> Symbols; + SymbolInfo::SignalMap Symbols; }; class FindAllSymbolsTest : public ::testing::Test { @@ -58,7 +62,9 @@ public: return Reporter.hasSymbol(Symbol); } - bool runFindAllSymbols(StringRef Code) { + bool hasUse(const SymbolInfo &Symbol) { return Reporter.hasUse(Symbol); } + + bool runFindAllSymbols(StringRef HeaderCode, StringRef MainCode) { llvm::IntrusiveRefCntPtr<vfs::InMemoryFileSystem> InMemoryFileSystem( new vfs::InMemoryFileSystem); llvm::IntrusiveRefCntPtr<FileManager> Files( @@ -88,7 +94,7 @@ public: InMemoryFileSystem->addFile(InternalHeader, 0, llvm::MemoryBuffer::getMemBuffer(InternalCode)); - std::unique_ptr<clang::tooling::FrontendActionFactory> Factory( + std::unique_ptr<tooling::FrontendActionFactory> Factory( new FindAllSymbolsActionFactory(&Reporter, &RegexMap)); tooling::ToolInvocation Invocation( @@ -98,7 +104,7 @@ public: std::make_shared<PCHContainerOperations>()); InMemoryFileSystem->addFile(HeaderName, 0, - llvm::MemoryBuffer::getMemBuffer(Code)); + llvm::MemoryBuffer::getMemBuffer(HeaderCode)); std::string Content = "#include\"" + std::string(HeaderName) + "\"\n" @@ -118,6 +124,7 @@ public: SymbolInfo DirtySymbol("ExtraInternal", SymbolInfo::SymbolKind::Class, CleanHeader, 2, {}); #endif // _MSC_VER && __MINGW32__ + Content += "\n" + MainCode.str(); InMemoryFileSystem->addFile(FileName, 0, llvm::MemoryBuffer::getMemBuffer(Content)); Invocation.run(); @@ -135,49 +142,64 @@ protected: }; TEST_F(FindAllSymbolsTest, VariableSymbols) { - static const char Code[] = R"( + static const char Header[] = R"( extern int xargc; namespace na { static bool SSSS = false; namespace nb { const long long *XXXX; } })"; - runFindAllSymbols(Code); + static const char Main[] = R"( + auto y = &na::nb::XXXX; + int main() { if (na::SSSS) return xargc; } + )"; + runFindAllSymbols(Header, Main); SymbolInfo Symbol = SymbolInfo("xargc", SymbolInfo::SymbolKind::Variable, HeaderName, 2, {}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); Symbol = SymbolInfo("SSSS", SymbolInfo::SymbolKind::Variable, HeaderName, 4, {{SymbolInfo::ContextType::Namespace, "na"}}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); Symbol = SymbolInfo("XXXX", SymbolInfo::SymbolKind::Variable, HeaderName, 5, {{SymbolInfo::ContextType::Namespace, "nb"}, {SymbolInfo::ContextType::Namespace, "na"}}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); } TEST_F(FindAllSymbolsTest, ExternCSymbols) { - static const char Code[] = R"( + static const char Header[] = R"( extern "C" { int C_Func() { return 0; } struct C_struct { int Member; }; })"; - runFindAllSymbols(Code); + static const char Main[] = R"( + C_struct q() { + int(*ptr)() = C_Func; + return {0}; + } + )"; + runFindAllSymbols(Header, Main); SymbolInfo Symbol = SymbolInfo("C_Func", SymbolInfo::SymbolKind::Function, HeaderName, 3, {}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); Symbol = SymbolInfo("C_struct", SymbolInfo::SymbolKind::Class, HeaderName, 4, {}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); } TEST_F(FindAllSymbolsTest, CXXRecordSymbols) { - static const char Code[] = R"( + static const char Header[] = R"( struct Glob {}; struct A; // Not a defintion, ignored. class NOP; // Not a defintion, ignored @@ -190,26 +212,33 @@ TEST_F(FindAllSymbolsTest, CXXRecordSymbols) { }; }; // )"; - runFindAllSymbols(Code); + static const char Main[] = R"( + static Glob glob; + static na::A::AAAA* a; + )"; + runFindAllSymbols(Header, Main); SymbolInfo Symbol = SymbolInfo("Glob", SymbolInfo::SymbolKind::Class, HeaderName, 2, {}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); Symbol = SymbolInfo("A", SymbolInfo::SymbolKind::Class, HeaderName, 6, {{SymbolInfo::ContextType::Namespace, "na"}}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); Symbol = SymbolInfo("AAA", SymbolInfo::SymbolKind::Class, HeaderName, 7, {{SymbolInfo::ContextType::Record, "A"}, {SymbolInfo::ContextType::Namespace, "na"}}); EXPECT_FALSE(hasSymbol(Symbol)); + EXPECT_FALSE(hasUse(Symbol)); } TEST_F(FindAllSymbolsTest, CXXRecordSymbolsTemplate) { - static const char Code[] = R"( + static const char Header[] = R"( template <typename T> - class T_TEMP { + struct T_TEMP { template <typename _Tp1> struct rebind { typedef T_TEMP<_Tp1> other; }; }; @@ -222,11 +251,15 @@ TEST_F(FindAllSymbolsTest, CXXRecordSymbolsTemplate) { // Ignore specialization. template <> class Observer<int> {}; )"; - runFindAllSymbols(Code); + static const char Main[] = R"( + extern T_TEMP<int>::rebind<char> weirdo; + )"; + runFindAllSymbols(Header, Main); SymbolInfo Symbol = SymbolInfo("T_TEMP", SymbolInfo::SymbolKind::Class, HeaderName, 3, {}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); } TEST_F(FindAllSymbolsTest, DontIgnoreTemplatePartialSpecialization) { @@ -239,7 +272,7 @@ TEST_F(FindAllSymbolsTest, DontIgnoreTemplatePartialSpecialization) { template<class T> void f() {}; template<> void f<int>() {}; )"; - runFindAllSymbols(Code); + runFindAllSymbols(Code, ""); SymbolInfo Symbol = SymbolInfo("Class", SymbolInfo::SymbolKind::Class, HeaderName, 4, {}); EXPECT_TRUE(hasSymbol(Symbol)); @@ -252,7 +285,7 @@ TEST_F(FindAllSymbolsTest, DontIgnoreTemplatePartialSpecialization) { } TEST_F(FindAllSymbolsTest, FunctionSymbols) { - static const char Code[] = R"( + static const char Header[] = R"( namespace na { int gg(int); int f(const int &a) { int Local; static int StaticLocal; return 0; } @@ -265,91 +298,127 @@ TEST_F(FindAllSymbolsTest, FunctionSymbols) { } // namespace nb } // namespace na"; )"; - runFindAllSymbols(Code); + static const char Main[] = R"( + int(*gg)(int) = &na::gg; + int main() { + (void)na::SSSFFF; + na::nb::fun(0); + return na::f(gg(0)); + } + )"; + runFindAllSymbols(Header, Main); SymbolInfo Symbol = SymbolInfo("gg", SymbolInfo::SymbolKind::Function, HeaderName, 3, {{SymbolInfo::ContextType::Namespace, "na"}}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); Symbol = SymbolInfo("f", SymbolInfo::SymbolKind::Function, HeaderName, 4, {{SymbolInfo::ContextType::Namespace, "na"}}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); Symbol = SymbolInfo("SSSFFF", SymbolInfo::SymbolKind::Function, HeaderName, 5, {{SymbolInfo::ContextType::Namespace, "na"}}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); Symbol = SymbolInfo("fun", SymbolInfo::SymbolKind::Function, HeaderName, 10, {{SymbolInfo::ContextType::Namespace, "nb"}, {SymbolInfo::ContextType::Namespace, "na"}}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); } TEST_F(FindAllSymbolsTest, NamespaceTest) { - static const char Code[] = R"( + static const char Header[] = R"( int X1; namespace { int X2; } namespace { namespace { int X3; } } namespace { namespace nb { int X4; } } namespace na { inline namespace __1 { int X5; } } )"; - runFindAllSymbols(Code); + static const char Main[] = R"( + using namespace nb; + int main() { + X1 = X2; + X3 = X4; + (void)na::X5; + } + )"; + runFindAllSymbols(Header, Main); SymbolInfo Symbol = SymbolInfo("X1", SymbolInfo::SymbolKind::Variable, HeaderName, 2, {}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); Symbol = SymbolInfo("X2", SymbolInfo::SymbolKind::Variable, HeaderName, 3, {{SymbolInfo::ContextType::Namespace, ""}}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); Symbol = SymbolInfo("X3", SymbolInfo::SymbolKind::Variable, HeaderName, 4, {{SymbolInfo::ContextType::Namespace, ""}, {SymbolInfo::ContextType::Namespace, ""}}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); Symbol = SymbolInfo("X4", SymbolInfo::SymbolKind::Variable, HeaderName, 5, {{SymbolInfo::ContextType::Namespace, "nb"}, {SymbolInfo::ContextType::Namespace, ""}}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); Symbol = SymbolInfo("X5", SymbolInfo::SymbolKind::Variable, HeaderName, 6, {{SymbolInfo::ContextType::Namespace, "na"}}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); } TEST_F(FindAllSymbolsTest, DecayedTypeTest) { - static const char Code[] = "void DecayedFunc(int x[], int y[10]) {}"; - runFindAllSymbols(Code); + static const char Header[] = "void DecayedFunc(int x[], int y[10]) {}"; + static const char Main[] = R"(int main() { DecayedFunc(nullptr, nullptr); })"; + runFindAllSymbols(Header, Main); SymbolInfo Symbol = SymbolInfo( "DecayedFunc", SymbolInfo::SymbolKind::Function, HeaderName, 1, {}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); } TEST_F(FindAllSymbolsTest, CTypedefTest) { - static const char Code[] = R"( + static const char Header[] = R"( typedef unsigned size_t_; typedef struct { int x; } X; using XX = X; )"; - runFindAllSymbols(Code); + static const char Main[] = R"( + size_t_ f; + template<typename T> struct vector{}; + vector<X> list; + void foo(const XX&){} + )"; + runFindAllSymbols(Header, Main); SymbolInfo Symbol = SymbolInfo("size_t_", SymbolInfo::SymbolKind::TypedefName, HeaderName, 2, {}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); Symbol = SymbolInfo("X", SymbolInfo::SymbolKind::TypedefName, HeaderName, 3, {}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); Symbol = SymbolInfo("XX", SymbolInfo::SymbolKind::TypedefName, HeaderName, 4, {}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); } TEST_F(FindAllSymbolsTest, EnumTest) { - static const char Code[] = R"( + static const char Header[] = R"( enum Glob_E { G1, G2 }; enum class Altitude { high='h', low='l'}; enum { A1, A2 }; @@ -359,42 +428,58 @@ TEST_F(FindAllSymbolsTest, EnumTest) { }; enum DECL : int; )"; - runFindAllSymbols(Code); + static const char Main[] = R"( + static auto flags = G1 | G2; + static auto alt = Altitude::high; + static auto nested = A::X1; + extern DECL whatever; + static auto flags2 = A1 | A2; + )"; + runFindAllSymbols(Header, Main); SymbolInfo Symbol = SymbolInfo("Glob_E", SymbolInfo::SymbolKind::EnumDecl, HeaderName, 2, {}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_FALSE(hasUse(Symbol)); Symbol = SymbolInfo("G1", SymbolInfo::SymbolKind::EnumConstantDecl, HeaderName, 2, {{SymbolInfo::ContextType::EnumDecl, "Glob_E"}}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); Symbol = SymbolInfo("G2", SymbolInfo::SymbolKind::EnumConstantDecl, HeaderName, 2, {{SymbolInfo::ContextType::EnumDecl, "Glob_E"}}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); Symbol = SymbolInfo("Altitude", SymbolInfo::SymbolKind::EnumDecl, HeaderName, 3, {}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); Symbol = SymbolInfo("high", SymbolInfo::SymbolKind::EnumConstantDecl, HeaderName, 3, {{SymbolInfo::ContextType::EnumDecl, "Altitude"}}); EXPECT_FALSE(hasSymbol(Symbol)); + EXPECT_FALSE(hasUse(Symbol)); Symbol = SymbolInfo("A1", SymbolInfo::SymbolKind::EnumConstantDecl, HeaderName, 4, {{SymbolInfo::ContextType::EnumDecl, ""}}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); Symbol = SymbolInfo("A2", SymbolInfo::SymbolKind::EnumConstantDecl, HeaderName, 4, {{SymbolInfo::ContextType::EnumDecl, ""}}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); Symbol = SymbolInfo("", SymbolInfo::SymbolKind::EnumDecl, HeaderName, 4, {}); EXPECT_FALSE(hasSymbol(Symbol)); + EXPECT_FALSE(hasUse(Symbol)); Symbol = SymbolInfo("A_ENUM", SymbolInfo::SymbolKind::EnumDecl, HeaderName, 7, {{SymbolInfo::ContextType::Record, "A"}}); EXPECT_FALSE(hasSymbol(Symbol)); + EXPECT_FALSE(hasUse(Symbol)); Symbol = SymbolInfo("X1", SymbolInfo::SymbolKind::EnumDecl, HeaderName, 7, {{SymbolInfo::ContextType::EnumDecl, "A_ENUM"}, @@ -407,63 +492,83 @@ TEST_F(FindAllSymbolsTest, EnumTest) { } TEST_F(FindAllSymbolsTest, IWYUPrivatePragmaTest) { - static const char Code[] = R"( + static const char Header[] = R"( // IWYU pragma: private, include "bar.h" struct Bar { }; )"; - runFindAllSymbols(Code); + static const char Main[] = R"( + Bar bar; + )"; + runFindAllSymbols(Header, Main); SymbolInfo Symbol = SymbolInfo("Bar", SymbolInfo::SymbolKind::Class, "bar.h", 3, {}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); } TEST_F(FindAllSymbolsTest, MacroTest) { - static const char Code[] = R"( + static const char Header[] = R"( #define X #define Y 1 #define MAX(X, Y) ((X) > (Y) ? (X) : (Y)) )"; - runFindAllSymbols(Code); + static const char Main[] = R"( + #ifdef X + int main() { return MAX(0,Y); } + #endif + )"; + runFindAllSymbols(Header, Main); SymbolInfo Symbol = SymbolInfo("X", SymbolInfo::SymbolKind::Macro, HeaderName, 2, {}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); Symbol = SymbolInfo("Y", SymbolInfo::SymbolKind::Macro, HeaderName, 3, {}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); Symbol = SymbolInfo("MAX", SymbolInfo::SymbolKind::Macro, HeaderName, 4, {}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); } TEST_F(FindAllSymbolsTest, MacroTestWithIWYU) { - static const char Code[] = R"( + static const char Header[] = R"( // IWYU pragma: private, include "bar.h" - #define X + #define X 1 #define Y 1 #define MAX(X, Y) ((X) > (Y) ? (X) : (Y)) )"; - runFindAllSymbols(Code); + static const char Main[] = R"( + #ifdef X + int main() { return MAX(0,Y); } + #endif + )"; + runFindAllSymbols(Header, Main); SymbolInfo Symbol = SymbolInfo("X", SymbolInfo::SymbolKind::Macro, "bar.h", 3, {}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); Symbol = SymbolInfo("Y", SymbolInfo::SymbolKind::Macro, "bar.h", 4, {}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); Symbol = SymbolInfo("MAX", SymbolInfo::SymbolKind::Macro, "bar.h", 5, {}); EXPECT_TRUE(hasSymbol(Symbol)); + EXPECT_TRUE(hasUse(Symbol)); } TEST_F(FindAllSymbolsTest, NoFriendTest) { - static const char Code[] = R"( + static const char Header[] = R"( class WorstFriend { friend void Friend(); friend class BestFriend; }; )"; - runFindAllSymbols(Code); + runFindAllSymbols(Header, ""); SymbolInfo Symbol = SymbolInfo("WorstFriend", SymbolInfo::SymbolKind::Class, HeaderName, 2, {}); EXPECT_TRUE(hasSymbol(Symbol)); |