[include-fixer] Remove line number from Symbol identity

Summary:
Remove line number from Symbol identity.

For our purposes (include-fixer and clangd autocomplete), function overloads
within the same header should mostly be treated as a single combined symbol.

We may want to track individual occurrences (line number, full type info)
and aggregate this during mapreduce, but that's not done here.

Reviewers: hokein, bkramer

Subscribers: cfe-commits

Differential Revision: https://reviews.llvm.org/D30685

llvm-svn: 297371
This commit is contained in:
Sam McCall 2017-03-09 10:47:44 +00:00
parent 76630d43f6
commit 573050e703
12 changed files with 178 additions and 208 deletions

View File

@ -333,8 +333,7 @@ IncludeFixerContext IncludeFixerSemaSource::getIncludeFixerContext(
: "\"" + FilePath + "\""), : "\"" + FilePath + "\""),
SourceManager, HeaderSearch); SourceManager, HeaderSearch);
SymbolCandidates.emplace_back(Symbol.getName(), Symbol.getSymbolKind(), SymbolCandidates.emplace_back(Symbol.getName(), Symbol.getSymbolKind(),
MinimizedFilePath, Symbol.getLineNumber(), MinimizedFilePath, Symbol.getContexts());
Symbol.getContexts());
} }
return IncludeFixerContext(FilePath, QuerySymbolInfos, SymbolCandidates); return IncludeFixerContext(FilePath, QuerySymbolInfos, SymbolCandidates);
} }

View File

@ -28,8 +28,7 @@ FindAllMacros::CreateMacroSymbol(const Token &MacroNameTok,
if (FilePath.empty()) if (FilePath.empty())
return llvm::None; return llvm::None;
return SymbolInfo(MacroNameTok.getIdentifierInfo()->getName(), return SymbolInfo(MacroNameTok.getIdentifierInfo()->getName(),
SymbolInfo::SymbolKind::Macro, FilePath, SymbolInfo::SymbolKind::Macro, FilePath, {});
SM->getSpellingLineNumber(info->getDefinitionLoc()), {});
} }
void FindAllMacros::MacroDefined(const Token &MacroNameTok, void FindAllMacros::MacroDefined(const Token &MacroNameTok,

View File

@ -109,8 +109,7 @@ CreateSymbolInfo(const NamedDecl *ND, const SourceManager &SM,
std::string FilePath = getIncludePath(SM, Loc, Collector); std::string FilePath = getIncludePath(SM, Loc, Collector);
if (FilePath.empty()) return llvm::None; if (FilePath.empty()) return llvm::None;
return SymbolInfo(ND->getNameAsString(), Type, FilePath, return SymbolInfo(ND->getNameAsString(), Type, FilePath, GetContexts(ND));
SM.getExpansionLineNumber(Loc), GetContexts(ND));
} }
} // namespace } // namespace
@ -196,7 +195,7 @@ void FindAllSymbols::registerMatchers(MatchFinder *MatchFinder) {
anyOf(hasDeclContext(enumDecl(HasNSOrTUCtxMatcher)), ExternCMatcher)); anyOf(hasDeclContext(enumDecl(HasNSOrTUCtxMatcher)), ExternCMatcher));
// Most of the time we care about all matchable decls, or all types. // Most of the time we care about all matchable decls, or all types.
auto Types = namedDecl(anyOf(CRecords, CXXRecords, Enums, Typedefs)); auto Types = namedDecl(anyOf(CRecords, CXXRecords, Enums));
auto Decls = namedDecl(anyOf(CRecords, CXXRecords, Enums, Typedefs, Vars, auto Decls = namedDecl(anyOf(CRecords, CXXRecords, Enums, Typedefs, Vars,
EnumConstants, Functions)); EnumConstants, Functions));
@ -219,8 +218,8 @@ void FindAllSymbols::registerMatchers(MatchFinder *MatchFinder) {
typeLoc(isExpansionInMainFile(), typeLoc(isExpansionInMainFile(),
loc(qualType(hasDeclaration(Types.bind("use"))))), loc(qualType(hasDeclaration(Types.bind("use"))))),
this); this);
// Uses of typedefs: these are transparent to hasDeclaration, so we need to // Uses of typedefs: these are often transparent to hasDeclaration, so we need
// handle them explicitly. // to handle them explicitly.
MatchFinder->addMatcher( MatchFinder->addMatcher(
typeLoc(isExpansionInMainFile(), typeLoc(isExpansionInMainFile(),
loc(typedefType(hasDeclaration(Typedefs.bind("use"))))), loc(typedefType(hasDeclaration(Typedefs.bind("use"))))),

View File

@ -32,7 +32,6 @@ template <> struct MappingTraits<SymbolAndSignals> {
io.mapRequired("Name", Symbol.Symbol.Name); io.mapRequired("Name", Symbol.Symbol.Name);
io.mapRequired("Contexts", Symbol.Symbol.Contexts); io.mapRequired("Contexts", Symbol.Symbol.Contexts);
io.mapRequired("FilePath", Symbol.Symbol.FilePath); io.mapRequired("FilePath", Symbol.Symbol.FilePath);
io.mapRequired("LineNumber", Symbol.Symbol.LineNumber);
io.mapRequired("Type", Symbol.Symbol.Type); io.mapRequired("Type", Symbol.Symbol.Type);
io.mapRequired("Seen", Symbol.Signals.Seen); io.mapRequired("Seen", Symbol.Signals.Seen);
io.mapRequired("Used", Symbol.Signals.Used); io.mapRequired("Used", Symbol.Signals.Used);
@ -74,21 +73,18 @@ namespace clang {
namespace find_all_symbols { namespace find_all_symbols {
SymbolInfo::SymbolInfo(llvm::StringRef Name, SymbolKind Type, SymbolInfo::SymbolInfo(llvm::StringRef Name, SymbolKind Type,
llvm::StringRef FilePath, int LineNumber, llvm::StringRef FilePath,
const std::vector<Context> &Contexts) const std::vector<Context> &Contexts)
: Name(Name), Type(Type), FilePath(FilePath), Contexts(Contexts), : Name(Name), Type(Type), FilePath(FilePath), Contexts(Contexts) {}
LineNumber(LineNumber) {}
bool SymbolInfo::operator==(const SymbolInfo &Symbol) const { bool SymbolInfo::operator==(const SymbolInfo &Symbol) const {
return std::tie(Name, Type, FilePath, LineNumber, Contexts) == return std::tie(Name, Type, FilePath, Contexts) ==
std::tie(Symbol.Name, Symbol.Type, Symbol.FilePath, Symbol.LineNumber, std::tie(Symbol.Name, Symbol.Type, Symbol.FilePath, Symbol.Contexts);
Symbol.Contexts);
} }
bool SymbolInfo::operator<(const SymbolInfo &Symbol) const { bool SymbolInfo::operator<(const SymbolInfo &Symbol) const {
return std::tie(Name, Type, FilePath, LineNumber, Contexts) < return std::tie(Name, Type, FilePath, Contexts) <
std::tie(Symbol.Name, Symbol.Type, Symbol.FilePath, Symbol.LineNumber, std::tie(Symbol.Name, Symbol.Type, Symbol.FilePath, Symbol.Contexts);
Symbol.Contexts);
} }
std::string SymbolInfo::getQualifiedName() const { std::string SymbolInfo::getQualifiedName() const {

View File

@ -20,7 +20,11 @@
namespace clang { namespace clang {
namespace find_all_symbols { namespace find_all_symbols {
/// \brief Contains all information for a Symbol. /// \brief Describes a named symbol from a header.
/// Symbols with the same qualified name and type (e.g. function overloads)
/// that appear in the same header are represented by a single SymbolInfo.
///
/// TODO: keep track of instances, e.g. overload locations and signatures.
class SymbolInfo { class SymbolInfo {
public: public:
/// \brief The SymbolInfo Type. /// \brief The SymbolInfo Type.
@ -66,10 +70,10 @@ public:
// The default constructor is required by YAML traits in // The default constructor is required by YAML traits in
// LLVM_YAML_IS_DOCUMENT_LIST_VECTOR. // LLVM_YAML_IS_DOCUMENT_LIST_VECTOR.
SymbolInfo() : Type(SymbolKind::Unknown), LineNumber(-1) {} SymbolInfo() : Type(SymbolKind::Unknown) {}
SymbolInfo(llvm::StringRef Name, SymbolKind Type, llvm::StringRef FilePath, SymbolInfo(llvm::StringRef Name, SymbolKind Type, llvm::StringRef FilePath,
int LineNumber, const std::vector<Context> &Contexts); const std::vector<Context> &Contexts);
void SetFilePath(llvm::StringRef Path) { FilePath = Path; } void SetFilePath(llvm::StringRef Path) { FilePath = Path; }
@ -90,9 +94,6 @@ public:
return Contexts; return Contexts;
} }
/// \brief Get a 1-based line number of the symbol's declaration.
int getLineNumber() const { return LineNumber; }
bool operator<(const SymbolInfo &Symbol) const; bool operator<(const SymbolInfo &Symbol) const;
bool operator==(const SymbolInfo &Symbol) const; bool operator==(const SymbolInfo &Symbol) const;
@ -121,9 +122,6 @@ private:
/// ///
/// If the symbol is declared in `TranslationUnitDecl`, it has no context. /// If the symbol is declared in `TranslationUnitDecl`, it has no context.
std::vector<Context> Contexts; std::vector<Context> Contexts;
/// \brief The 1-based line number of of the symbol's declaration.
int LineNumber;
}; };
struct SymbolAndSignals { struct SymbolAndSignals {

View File

@ -178,7 +178,7 @@ createSymbolIndexManager(StringRef FilePath) {
for (size_t I = 0, E = CommaSplits.size(); I != E; ++I) for (size_t I = 0, E = CommaSplits.size(); I != E; ++I)
Symbols.push_back( Symbols.push_back(
{SymbolInfo(Split.first.trim(), SymbolInfo::SymbolKind::Unknown, {SymbolInfo(Split.first.trim(), SymbolInfo::SymbolKind::Unknown,
CommaSplits[I].trim(), 1, {}), CommaSplits[I].trim(), {}),
// Use fake "seen" signal for tests, so first header wins. // Use fake "seen" signal for tests, so first header wins.
SymbolInfo::Signals(/*Seen=*/static_cast<unsigned>(E - I), SymbolInfo::Signals(/*Seen=*/static_cast<unsigned>(E - I),
/*Used=*/0)}); /*Used=*/0)});

View File

@ -6,7 +6,6 @@ Contexts:
- ContextType: Namespace - ContextType: Namespace
ContextName: b ContextName: b
FilePath: foo.h FilePath: foo.h
LineNumber: 1
Type: Class Type: Class
Seen: 1 Seen: 1
Used: 0 Used: 0
@ -18,7 +17,6 @@ Contexts:
- ContextType: Namespace - ContextType: Namespace
ContextName: b ContextName: b
FilePath: ../include/bar.h FilePath: ../include/bar.h
LineNumber: 1
Type: Class Type: Class
Seen: 1 Seen: 1
Used: 0 Used: 0
@ -30,7 +28,6 @@ Contexts:
- ContextType: Namespace - ContextType: Namespace
ContextName: b ContextName: b
FilePath: ../include/bar.h FilePath: ../include/bar.h
LineNumber: 2
Type: Class Type: Class
Seen: 3 Seen: 3
Used: 0 Used: 0
@ -42,7 +39,6 @@ Contexts:
- ContextType: Namespace - ContextType: Namespace
ContextName: b ContextName: b
FilePath: ../include/zbar.h FilePath: ../include/zbar.h
LineNumber: 1
Type: Class Type: Class
Seen: 3 Seen: 3
Used: 0 Used: 0
@ -50,7 +46,6 @@ Used: 0
Name: b Name: b
Contexts: Contexts:
FilePath: var.h FilePath: var.h
LineNumber: 1
Type: Variable Type: Variable
Seen: 1 Seen: 1
Used: 0 Used: 0
@ -60,7 +55,6 @@ Contexts:
- ContextType: Namespace - ContextType: Namespace
ContextName: c ContextName: c
FilePath: test/include-fixer/baz.h FilePath: test/include-fixer/baz.h
LineNumber: 1
Type: Class Type: Class
Seen: 1 Seen: 1
Used: 0 Used: 0

View File

@ -4,7 +4,6 @@ Contexts:
- ContextType: Namespace - ContextType: Namespace
ContextName: a ContextName: a
FilePath: foo.h FilePath: foo.h
LineNumber: 1
Type: Class Type: Class
Seen: 1 Seen: 1
Used: 1 Used: 1
@ -15,7 +14,6 @@ Contexts:
- ContextType: Namespace - ContextType: Namespace
ContextName: a ContextName: a
FilePath: ../include/bar.h FilePath: ../include/bar.h
LineNumber: 1
Type: Class Type: Class
Seen: 1 Seen: 1
Used: 2 Used: 2

View File

@ -4,7 +4,6 @@ Contexts:
- ContextType: Namespace - ContextType: Namespace
ContextName: a ContextName: a
FilePath: foo.h FilePath: foo.h
LineNumber: 1
Type: Class Type: Class
Seen: 1 Seen: 1
Used: 2 Used: 2
@ -15,7 +14,6 @@ Contexts:
- ContextType: Namespace - ContextType: Namespace
ContextName: a ContextName: a
FilePath: ../include/barbar.h FilePath: ../include/barbar.h
LineNumber: 1
Type: Class Type: Class
Seen: 1 Seen: 1
Used: 0 Used: 0

View File

@ -7,7 +7,6 @@ Contexts:
- ContextType: Namespace - ContextType: Namespace
ContextName: a ContextName: a
FilePath: ../include/bar.h FilePath: ../include/bar.h
LineNumber: 1
Type: Class Type: Class
Seen: 1 Seen: 1
Used: 1 Used: 1
@ -18,7 +17,6 @@ Contexts:
- ContextType: Namespace - ContextType: Namespace
ContextName: a ContextName: a
FilePath: ../include/barbar.h FilePath: ../include/barbar.h
LineNumber: 1
Type: Class Type: Class
Seen: 1 Seen: 1
Used: 0 Used: 0
@ -29,7 +27,6 @@ Contexts:
- ContextType: Namespace - ContextType: Namespace
ContextName: a ContextName: a
FilePath: foo.h FilePath: foo.h
LineNumber: 1
Type: Class Type: Class
Seen: 2 Seen: 2
Used: 2 Used: 2

View File

@ -54,43 +54,43 @@ static std::string runIncludeFixer(
StringRef Code, StringRef Code,
const std::vector<std::string> &ExtraArgs = std::vector<std::string>()) { const std::vector<std::string> &ExtraArgs = std::vector<std::string>()) {
std::vector<SymbolAndSignals> Symbols = { std::vector<SymbolAndSignals> Symbols = {
{SymbolInfo("string", SymbolInfo::SymbolKind::Class, "<string>", 1, {SymbolInfo("string", SymbolInfo::SymbolKind::Class, "<string>",
{{SymbolInfo::ContextType::Namespace, "std"}}), {{SymbolInfo::ContextType::Namespace, "std"}}),
SymbolInfo::Signals{}}, SymbolInfo::Signals{}},
{SymbolInfo("sting", SymbolInfo::SymbolKind::Class, "\"sting\"", 1, {SymbolInfo("sting", SymbolInfo::SymbolKind::Class, "\"sting\"",
{{SymbolInfo::ContextType::Namespace, "std"}}), {{SymbolInfo::ContextType::Namespace, "std"}}),
SymbolInfo::Signals{}}, SymbolInfo::Signals{}},
{SymbolInfo("foo", SymbolInfo::SymbolKind::Class, {SymbolInfo("foo", SymbolInfo::SymbolKind::Class,
"\"dir/otherdir/qux.h\"", 1, "\"dir/otherdir/qux.h\"",
{{SymbolInfo::ContextType::Namespace, "b"}, {{SymbolInfo::ContextType::Namespace, "b"},
{SymbolInfo::ContextType::Namespace, "a"}}), {SymbolInfo::ContextType::Namespace, "a"}}),
SymbolInfo::Signals{}}, SymbolInfo::Signals{}},
{SymbolInfo("bar", SymbolInfo::SymbolKind::Class, "\"bar.h\"", 1, {SymbolInfo("bar", SymbolInfo::SymbolKind::Class, "\"bar.h\"",
{{SymbolInfo::ContextType::Namespace, "b"}, {{SymbolInfo::ContextType::Namespace, "b"},
{SymbolInfo::ContextType::Namespace, "a"}}), {SymbolInfo::ContextType::Namespace, "a"}}),
SymbolInfo::Signals{}}, SymbolInfo::Signals{}},
{SymbolInfo("bar", SymbolInfo::SymbolKind::Class, "\"bar2.h\"", 1, {SymbolInfo("bar", SymbolInfo::SymbolKind::Class, "\"bar2.h\"",
{{SymbolInfo::ContextType::Namespace, "c"}, {{SymbolInfo::ContextType::Namespace, "c"},
{SymbolInfo::ContextType::Namespace, "a"}}), {SymbolInfo::ContextType::Namespace, "a"}}),
SymbolInfo::Signals{}}, SymbolInfo::Signals{}},
{SymbolInfo("Green", SymbolInfo::SymbolKind::Class, "\"color.h\"", 1, {SymbolInfo("Green", SymbolInfo::SymbolKind::Class, "\"color.h\"",
{{SymbolInfo::ContextType::EnumDecl, "Color"}, {{SymbolInfo::ContextType::EnumDecl, "Color"},
{SymbolInfo::ContextType::Namespace, "b"}, {SymbolInfo::ContextType::Namespace, "b"},
{SymbolInfo::ContextType::Namespace, "a"}}), {SymbolInfo::ContextType::Namespace, "a"}}),
SymbolInfo::Signals{}}, SymbolInfo::Signals{}},
{SymbolInfo("Vector", SymbolInfo::SymbolKind::Class, "\"Vector.h\"", 1, {SymbolInfo("Vector", SymbolInfo::SymbolKind::Class, "\"Vector.h\"",
{{SymbolInfo::ContextType::Namespace, "__a"}, {{SymbolInfo::ContextType::Namespace, "__a"},
{SymbolInfo::ContextType::Namespace, "a"}}), {SymbolInfo::ContextType::Namespace, "a"}}),
SymbolInfo::Signals{/*Seen=*/2, 0}}, SymbolInfo::Signals{/*Seen=*/2, 0}},
{SymbolInfo("Vector", SymbolInfo::SymbolKind::Class, "\"Vector.h\"", 2, {SymbolInfo("Vector", SymbolInfo::SymbolKind::Class, "\"Vector.h\"",
{{SymbolInfo::ContextType::Namespace, "a"}}), {{SymbolInfo::ContextType::Namespace, "a"}}),
SymbolInfo::Signals{/*Seen=*/2, 0}}, SymbolInfo::Signals{/*Seen=*/2, 0}},
{SymbolInfo("StrCat", SymbolInfo::SymbolKind::Class, "\"strcat.h\"", 1, {SymbolInfo("StrCat", SymbolInfo::SymbolKind::Class, "\"strcat.h\"",
{{SymbolInfo::ContextType::Namespace, "str"}}), {{SymbolInfo::ContextType::Namespace, "str"}}),
SymbolInfo::Signals{}}, SymbolInfo::Signals{}},
{SymbolInfo("str", SymbolInfo::SymbolKind::Class, "\"str.h\"", 1, {}), {SymbolInfo("str", SymbolInfo::SymbolKind::Class, "\"str.h\"", {}),
SymbolInfo::Signals{}}, SymbolInfo::Signals{}},
{SymbolInfo("foo2", SymbolInfo::SymbolKind::Class, "\"foo2.h\"", 1, {}), {SymbolInfo("foo2", SymbolInfo::SymbolKind::Class, "\"foo2.h\"", {}),
SymbolInfo::Signals{}}, SymbolInfo::Signals{}},
}; };
auto SymbolIndexMgr = llvm::make_unique<SymbolIndexManager>(); auto SymbolIndexMgr = llvm::make_unique<SymbolIndexManager>();

View File

@ -42,14 +42,14 @@ public:
Symbols[Entry.first] += Entry.second; Symbols[Entry.first] += Entry.second;
} }
bool hasSymbol(const SymbolInfo &Symbol) const { int seen(const SymbolInfo &Symbol) const {
auto it = Symbols.find(Symbol); auto it = Symbols.find(Symbol);
return it != Symbols.end() && it->second.Seen > 0; return it == Symbols.end() ? 0 : it->second.Seen;
} }
bool hasUse(const SymbolInfo &Symbol) const { int used(const SymbolInfo &Symbol) const {
auto it = Symbols.find(Symbol); auto it = Symbols.find(Symbol);
return it != Symbols.end() && it->second.Used > 0; return it == Symbols.end() ? 0 : it->second.Used;
} }
private: private:
@ -58,11 +58,9 @@ private:
class FindAllSymbolsTest : public ::testing::Test { class FindAllSymbolsTest : public ::testing::Test {
public: public:
bool hasSymbol(const SymbolInfo &Symbol) { int seen(const SymbolInfo &Symbol) { return Reporter.seen(Symbol); }
return Reporter.hasSymbol(Symbol);
}
bool hasUse(const SymbolInfo &Symbol) { return Reporter.hasUse(Symbol); } int used(const SymbolInfo &Symbol) { return Reporter.used(Symbol); }
bool runFindAllSymbols(StringRef HeaderCode, StringRef MainCode) { bool runFindAllSymbols(StringRef HeaderCode, StringRef MainCode) {
llvm::IntrusiveRefCntPtr<vfs::InMemoryFileSystem> InMemoryFileSystem( llvm::IntrusiveRefCntPtr<vfs::InMemoryFileSystem> InMemoryFileSystem(
@ -86,9 +84,9 @@ public:
std::string InternalCode = std::string InternalCode =
"#include \"private.inc\"\nclass Internal {};"; "#include \"private.inc\"\nclass Internal {};";
SymbolInfo InternalSymbol("Internal", SymbolInfo::SymbolKind::Class, SymbolInfo InternalSymbol("Internal", SymbolInfo::SymbolKind::Class,
TopHeader, 2, {}); TopHeader, {});
SymbolInfo IncSymbol("IncHeaderClass", SymbolInfo::SymbolKind::Class, SymbolInfo IncSymbol("IncHeaderClass", SymbolInfo::SymbolKind::Class,
TopHeader, 1, {}); TopHeader, {});
InMemoryFileSystem->addFile( InMemoryFileSystem->addFile(
IncHeader, 0, llvm::MemoryBuffer::getMemBuffer(IncHeaderCode)); IncHeader, 0, llvm::MemoryBuffer::getMemBuffer(IncHeaderCode));
InMemoryFileSystem->addFile(InternalHeader, 0, InMemoryFileSystem->addFile(InternalHeader, 0,
@ -120,19 +118,19 @@ public:
InMemoryFileSystem->addFile( InMemoryFileSystem->addFile(
DirtyHeader, 0, llvm::MemoryBuffer::getMemBuffer(DirtyHeaderContent)); DirtyHeader, 0, llvm::MemoryBuffer::getMemBuffer(DirtyHeaderContent));
SymbolInfo DirtyMacro("INTERNAL", SymbolInfo::SymbolKind::Macro, SymbolInfo DirtyMacro("INTERNAL", SymbolInfo::SymbolKind::Macro,
CleanHeader, 1, {}); CleanHeader, {});
SymbolInfo DirtySymbol("ExtraInternal", SymbolInfo::SymbolKind::Class, SymbolInfo DirtySymbol("ExtraInternal", SymbolInfo::SymbolKind::Class,
CleanHeader, 2, {}); CleanHeader, {});
#endif // _MSC_VER && __MINGW32__ #endif // _MSC_VER && __MINGW32__
Content += "\n" + MainCode.str(); Content += "\n" + MainCode.str();
InMemoryFileSystem->addFile(FileName, 0, InMemoryFileSystem->addFile(FileName, 0,
llvm::MemoryBuffer::getMemBuffer(Content)); llvm::MemoryBuffer::getMemBuffer(Content));
Invocation.run(); Invocation.run();
EXPECT_TRUE(hasSymbol(InternalSymbol)); EXPECT_EQ(1, seen(InternalSymbol));
EXPECT_TRUE(hasSymbol(IncSymbol)); EXPECT_EQ(1, seen(IncSymbol));
#if !defined(_MSC_VER) && !defined(__MINGW32__) #if !defined(_MSC_VER) && !defined(__MINGW32__)
EXPECT_TRUE(hasSymbol(DirtySymbol)); EXPECT_EQ(1, seen(DirtySymbol));
EXPECT_TRUE(hasSymbol(DirtyMacro)); EXPECT_EQ(1, seen(DirtyMacro));
#endif // _MSC_VER && __MINGW32__ #endif // _MSC_VER && __MINGW32__
return true; return true;
} }
@ -155,20 +153,20 @@ TEST_F(FindAllSymbolsTest, VariableSymbols) {
runFindAllSymbols(Header, Main); runFindAllSymbols(Header, Main);
SymbolInfo Symbol = SymbolInfo Symbol =
SymbolInfo("xargc", SymbolInfo::SymbolKind::Variable, HeaderName, 2, {}); SymbolInfo("xargc", SymbolInfo::SymbolKind::Variable, HeaderName, {});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
Symbol = SymbolInfo("SSSS", SymbolInfo::SymbolKind::Variable, HeaderName, 4, Symbol = SymbolInfo("SSSS", SymbolInfo::SymbolKind::Variable, HeaderName,
{{SymbolInfo::ContextType::Namespace, "na"}}); {{SymbolInfo::ContextType::Namespace, "na"}});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
Symbol = SymbolInfo("XXXX", SymbolInfo::SymbolKind::Variable, HeaderName, 5, Symbol = SymbolInfo("XXXX", SymbolInfo::SymbolKind::Variable, HeaderName,
{{SymbolInfo::ContextType::Namespace, "nb"}, {{SymbolInfo::ContextType::Namespace, "nb"},
{SymbolInfo::ContextType::Namespace, "na"}}); {SymbolInfo::ContextType::Namespace, "na"}});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
} }
TEST_F(FindAllSymbolsTest, ExternCSymbols) { TEST_F(FindAllSymbolsTest, ExternCSymbols) {
@ -188,14 +186,14 @@ TEST_F(FindAllSymbolsTest, ExternCSymbols) {
runFindAllSymbols(Header, Main); runFindAllSymbols(Header, Main);
SymbolInfo Symbol = SymbolInfo Symbol =
SymbolInfo("C_Func", SymbolInfo::SymbolKind::Function, HeaderName, 3, {}); SymbolInfo("C_Func", SymbolInfo::SymbolKind::Function, HeaderName, {});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
Symbol = Symbol =
SymbolInfo("C_struct", SymbolInfo::SymbolKind::Class, HeaderName, 4, {}); SymbolInfo("C_struct", SymbolInfo::SymbolKind::Class, HeaderName, {});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
} }
TEST_F(FindAllSymbolsTest, CXXRecordSymbols) { TEST_F(FindAllSymbolsTest, CXXRecordSymbols) {
@ -219,20 +217,20 @@ TEST_F(FindAllSymbolsTest, CXXRecordSymbols) {
runFindAllSymbols(Header, Main); runFindAllSymbols(Header, Main);
SymbolInfo Symbol = SymbolInfo Symbol =
SymbolInfo("Glob", SymbolInfo::SymbolKind::Class, HeaderName, 2, {}); SymbolInfo("Glob", SymbolInfo::SymbolKind::Class, HeaderName, {});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
Symbol = SymbolInfo("A", SymbolInfo::SymbolKind::Class, HeaderName, 6, Symbol = SymbolInfo("A", SymbolInfo::SymbolKind::Class, HeaderName,
{{SymbolInfo::ContextType::Namespace, "na"}}); {{SymbolInfo::ContextType::Namespace, "na"}});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
Symbol = SymbolInfo("AAA", SymbolInfo::SymbolKind::Class, HeaderName, 7, Symbol = SymbolInfo("AAA", SymbolInfo::SymbolKind::Class, HeaderName,
{{SymbolInfo::ContextType::Record, "A"}, {{SymbolInfo::ContextType::Record, "A"},
{SymbolInfo::ContextType::Namespace, "na"}}); {SymbolInfo::ContextType::Namespace, "na"}});
EXPECT_FALSE(hasSymbol(Symbol)); EXPECT_EQ(0, seen(Symbol));
EXPECT_FALSE(hasUse(Symbol)); EXPECT_EQ(0, used(Symbol));
} }
TEST_F(FindAllSymbolsTest, CXXRecordSymbolsTemplate) { TEST_F(FindAllSymbolsTest, CXXRecordSymbolsTemplate) {
@ -257,9 +255,9 @@ TEST_F(FindAllSymbolsTest, CXXRecordSymbolsTemplate) {
runFindAllSymbols(Header, Main); runFindAllSymbols(Header, Main);
SymbolInfo Symbol = SymbolInfo Symbol =
SymbolInfo("T_TEMP", SymbolInfo::SymbolKind::Class, HeaderName, 3, {}); SymbolInfo("T_TEMP", SymbolInfo::SymbolKind::Class, HeaderName, {});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
} }
TEST_F(FindAllSymbolsTest, DontIgnoreTemplatePartialSpecialization) { TEST_F(FindAllSymbolsTest, DontIgnoreTemplatePartialSpecialization) {
@ -274,14 +272,10 @@ TEST_F(FindAllSymbolsTest, DontIgnoreTemplatePartialSpecialization) {
)"; )";
runFindAllSymbols(Code, ""); runFindAllSymbols(Code, "");
SymbolInfo Symbol = SymbolInfo Symbol =
SymbolInfo("Class", SymbolInfo::SymbolKind::Class, HeaderName, 4, {}); SymbolInfo("Class", SymbolInfo::SymbolKind::Class, HeaderName, {});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
Symbol = Symbol = SymbolInfo("f", SymbolInfo::SymbolKind::Function, HeaderName, {});
SymbolInfo("f", SymbolInfo::SymbolKind::Function, HeaderName, 7, {}); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasSymbol(Symbol));
Symbol =
SymbolInfo("f", SymbolInfo::SymbolKind::Function, HeaderName, 8, {});
EXPECT_FALSE(hasSymbol(Symbol));
} }
TEST_F(FindAllSymbolsTest, FunctionSymbols) { TEST_F(FindAllSymbolsTest, FunctionSymbols) {
@ -309,26 +303,26 @@ TEST_F(FindAllSymbolsTest, FunctionSymbols) {
runFindAllSymbols(Header, Main); runFindAllSymbols(Header, Main);
SymbolInfo Symbol = SymbolInfo Symbol =
SymbolInfo("gg", SymbolInfo::SymbolKind::Function, HeaderName, 3, SymbolInfo("gg", SymbolInfo::SymbolKind::Function, HeaderName,
{{SymbolInfo::ContextType::Namespace, "na"}}); {{SymbolInfo::ContextType::Namespace, "na"}});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
Symbol = SymbolInfo("f", SymbolInfo::SymbolKind::Function, HeaderName, 4, Symbol = SymbolInfo("f", SymbolInfo::SymbolKind::Function, HeaderName,
{{SymbolInfo::ContextType::Namespace, "na"}}); {{SymbolInfo::ContextType::Namespace, "na"}});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
Symbol = SymbolInfo("SSSFFF", SymbolInfo::SymbolKind::Function, HeaderName, 5, Symbol = SymbolInfo("SSSFFF", SymbolInfo::SymbolKind::Function, HeaderName,
{{SymbolInfo::ContextType::Namespace, "na"}}); {{SymbolInfo::ContextType::Namespace, "na"}});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
Symbol = SymbolInfo("fun", SymbolInfo::SymbolKind::Function, HeaderName, 10, Symbol = SymbolInfo("fun", SymbolInfo::SymbolKind::Function, HeaderName,
{{SymbolInfo::ContextType::Namespace, "nb"}, {{SymbolInfo::ContextType::Namespace, "nb"},
{SymbolInfo::ContextType::Namespace, "na"}}); {SymbolInfo::ContextType::Namespace, "na"}});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
} }
TEST_F(FindAllSymbolsTest, NamespaceTest) { TEST_F(FindAllSymbolsTest, NamespaceTest) {
@ -350,31 +344,31 @@ TEST_F(FindAllSymbolsTest, NamespaceTest) {
runFindAllSymbols(Header, Main); runFindAllSymbols(Header, Main);
SymbolInfo Symbol = SymbolInfo Symbol =
SymbolInfo("X1", SymbolInfo::SymbolKind::Variable, HeaderName, 2, {}); SymbolInfo("X1", SymbolInfo::SymbolKind::Variable, HeaderName, {});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
Symbol = SymbolInfo("X2", SymbolInfo::SymbolKind::Variable, HeaderName, 3, Symbol = SymbolInfo("X2", SymbolInfo::SymbolKind::Variable, HeaderName,
{{SymbolInfo::ContextType::Namespace, ""}}); {{SymbolInfo::ContextType::Namespace, ""}});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
Symbol = SymbolInfo("X3", SymbolInfo::SymbolKind::Variable, HeaderName, 4, Symbol = SymbolInfo("X3", SymbolInfo::SymbolKind::Variable, HeaderName,
{{SymbolInfo::ContextType::Namespace, ""}, {{SymbolInfo::ContextType::Namespace, ""},
{SymbolInfo::ContextType::Namespace, ""}}); {SymbolInfo::ContextType::Namespace, ""}});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
Symbol = SymbolInfo("X4", SymbolInfo::SymbolKind::Variable, HeaderName, 5, Symbol = SymbolInfo("X4", SymbolInfo::SymbolKind::Variable, HeaderName,
{{SymbolInfo::ContextType::Namespace, "nb"}, {{SymbolInfo::ContextType::Namespace, "nb"},
{SymbolInfo::ContextType::Namespace, ""}}); {SymbolInfo::ContextType::Namespace, ""}});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
Symbol = SymbolInfo("X5", SymbolInfo::SymbolKind::Variable, HeaderName, 6, Symbol = SymbolInfo("X5", SymbolInfo::SymbolKind::Variable, HeaderName,
{{SymbolInfo::ContextType::Namespace, "na"}}); {{SymbolInfo::ContextType::Namespace, "na"}});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
} }
TEST_F(FindAllSymbolsTest, DecayedTypeTest) { TEST_F(FindAllSymbolsTest, DecayedTypeTest) {
@ -382,9 +376,9 @@ TEST_F(FindAllSymbolsTest, DecayedTypeTest) {
static const char Main[] = R"(int main() { DecayedFunc(nullptr, nullptr); })"; static const char Main[] = R"(int main() { DecayedFunc(nullptr, nullptr); })";
runFindAllSymbols(Header, Main); runFindAllSymbols(Header, Main);
SymbolInfo Symbol = SymbolInfo( SymbolInfo Symbol = SymbolInfo(
"DecayedFunc", SymbolInfo::SymbolKind::Function, HeaderName, 1, {}); "DecayedFunc", SymbolInfo::SymbolKind::Function, HeaderName, {});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
} }
TEST_F(FindAllSymbolsTest, CTypedefTest) { TEST_F(FindAllSymbolsTest, CTypedefTest) {
@ -402,19 +396,18 @@ TEST_F(FindAllSymbolsTest, CTypedefTest) {
runFindAllSymbols(Header, Main); runFindAllSymbols(Header, Main);
SymbolInfo Symbol = SymbolInfo("size_t_", SymbolInfo::SymbolKind::TypedefName, SymbolInfo Symbol = SymbolInfo("size_t_", SymbolInfo::SymbolKind::TypedefName,
HeaderName, 2, {}); HeaderName, {});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
Symbol = SymbolInfo("X", SymbolInfo::SymbolKind::TypedefName, HeaderName, {});
EXPECT_EQ(1, seen(Symbol));
EXPECT_EQ(1, used(Symbol));
Symbol = Symbol =
SymbolInfo("X", SymbolInfo::SymbolKind::TypedefName, HeaderName, 3, {}); SymbolInfo("XX", SymbolInfo::SymbolKind::TypedefName, HeaderName, {});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
Symbol =
SymbolInfo("XX", SymbolInfo::SymbolKind::TypedefName, HeaderName, 4, {});
EXPECT_TRUE(hasSymbol(Symbol));
EXPECT_TRUE(hasUse(Symbol));
} }
TEST_F(FindAllSymbolsTest, EnumTest) { TEST_F(FindAllSymbolsTest, EnumTest) {
@ -438,57 +431,56 @@ TEST_F(FindAllSymbolsTest, EnumTest) {
runFindAllSymbols(Header, Main); runFindAllSymbols(Header, Main);
SymbolInfo Symbol = SymbolInfo Symbol =
SymbolInfo("Glob_E", SymbolInfo::SymbolKind::EnumDecl, HeaderName, 2, {}); SymbolInfo("Glob_E", SymbolInfo::SymbolKind::EnumDecl, HeaderName, {});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_FALSE(hasUse(Symbol)); EXPECT_EQ(0, used(Symbol));
Symbol = Symbol =
SymbolInfo("G1", SymbolInfo::SymbolKind::EnumConstantDecl, HeaderName, 2, SymbolInfo("G1", SymbolInfo::SymbolKind::EnumConstantDecl, HeaderName,
{{SymbolInfo::ContextType::EnumDecl, "Glob_E"}}); {{SymbolInfo::ContextType::EnumDecl, "Glob_E"}});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
Symbol = Symbol =
SymbolInfo("G2", SymbolInfo::SymbolKind::EnumConstantDecl, HeaderName, 2, SymbolInfo("G2", SymbolInfo::SymbolKind::EnumConstantDecl, HeaderName,
{{SymbolInfo::ContextType::EnumDecl, "Glob_E"}}); {{SymbolInfo::ContextType::EnumDecl, "Glob_E"}});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
Symbol = SymbolInfo("Altitude", SymbolInfo::SymbolKind::EnumDecl, HeaderName, Symbol =
3, {}); SymbolInfo("Altitude", SymbolInfo::SymbolKind::EnumDecl, HeaderName, {});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
Symbol = Symbol =
SymbolInfo("high", SymbolInfo::SymbolKind::EnumConstantDecl, HeaderName, SymbolInfo("high", SymbolInfo::SymbolKind::EnumConstantDecl, HeaderName,
3, {{SymbolInfo::ContextType::EnumDecl, "Altitude"}}); {{SymbolInfo::ContextType::EnumDecl, "Altitude"}});
EXPECT_FALSE(hasSymbol(Symbol)); EXPECT_EQ(0, seen(Symbol));
EXPECT_FALSE(hasUse(Symbol)); EXPECT_EQ(0, used(Symbol));
Symbol = SymbolInfo("A1", SymbolInfo::SymbolKind::EnumConstantDecl, Symbol = SymbolInfo("A1", SymbolInfo::SymbolKind::EnumConstantDecl,
HeaderName, 4, {{SymbolInfo::ContextType::EnumDecl, ""}}); HeaderName, {{SymbolInfo::ContextType::EnumDecl, ""}});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
Symbol = SymbolInfo("A2", SymbolInfo::SymbolKind::EnumConstantDecl, Symbol = SymbolInfo("A2", SymbolInfo::SymbolKind::EnumConstantDecl,
HeaderName, 4, {{SymbolInfo::ContextType::EnumDecl, ""}}); HeaderName, {{SymbolInfo::ContextType::EnumDecl, ""}});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
Symbol = SymbolInfo("", SymbolInfo::SymbolKind::EnumDecl, HeaderName, 4, {}); Symbol = SymbolInfo("", SymbolInfo::SymbolKind::EnumDecl, HeaderName, {});
EXPECT_FALSE(hasSymbol(Symbol)); EXPECT_EQ(0, seen(Symbol));
EXPECT_FALSE(hasUse(Symbol)); EXPECT_EQ(0, used(Symbol));
Symbol = SymbolInfo("A_ENUM", SymbolInfo::SymbolKind::EnumDecl, HeaderName, 7, Symbol = SymbolInfo("A_ENUM", SymbolInfo::SymbolKind::EnumDecl, HeaderName,
{{SymbolInfo::ContextType::Record, "A"}}); {{SymbolInfo::ContextType::Record, "A"}});
EXPECT_FALSE(hasSymbol(Symbol)); EXPECT_EQ(0, seen(Symbol));
EXPECT_FALSE(hasUse(Symbol)); EXPECT_EQ(0, used(Symbol));
Symbol = SymbolInfo("X1", SymbolInfo::SymbolKind::EnumDecl, HeaderName, 7, Symbol = SymbolInfo("X1", SymbolInfo::SymbolKind::EnumDecl, HeaderName,
{{SymbolInfo::ContextType::EnumDecl, "A_ENUM"}, {{SymbolInfo::ContextType::EnumDecl, "A_ENUM"},
{SymbolInfo::ContextType::Record, "A"}}); {SymbolInfo::ContextType::Record, "A"}});
EXPECT_FALSE(hasSymbol(Symbol)); EXPECT_EQ(0, seen(Symbol));
Symbol = Symbol = SymbolInfo("DECL", SymbolInfo::SymbolKind::EnumDecl, HeaderName, {});
SymbolInfo("DECL", SymbolInfo::SymbolKind::EnumDecl, HeaderName, 9, {}); EXPECT_EQ(0, seen(Symbol));
EXPECT_FALSE(hasSymbol(Symbol));
} }
TEST_F(FindAllSymbolsTest, IWYUPrivatePragmaTest) { TEST_F(FindAllSymbolsTest, IWYUPrivatePragmaTest) {
@ -503,9 +495,9 @@ TEST_F(FindAllSymbolsTest, IWYUPrivatePragmaTest) {
runFindAllSymbols(Header, Main); runFindAllSymbols(Header, Main);
SymbolInfo Symbol = SymbolInfo Symbol =
SymbolInfo("Bar", SymbolInfo::SymbolKind::Class, "bar.h", 3, {}); SymbolInfo("Bar", SymbolInfo::SymbolKind::Class, "bar.h", {});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
} }
TEST_F(FindAllSymbolsTest, MacroTest) { TEST_F(FindAllSymbolsTest, MacroTest) {
@ -521,17 +513,17 @@ TEST_F(FindAllSymbolsTest, MacroTest) {
)"; )";
runFindAllSymbols(Header, Main); runFindAllSymbols(Header, Main);
SymbolInfo Symbol = SymbolInfo Symbol =
SymbolInfo("X", SymbolInfo::SymbolKind::Macro, HeaderName, 2, {}); SymbolInfo("X", SymbolInfo::SymbolKind::Macro, HeaderName, {});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
Symbol = SymbolInfo("Y", SymbolInfo::SymbolKind::Macro, HeaderName, 3, {}); Symbol = SymbolInfo("Y", SymbolInfo::SymbolKind::Macro, HeaderName, {});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
Symbol = SymbolInfo("MAX", SymbolInfo::SymbolKind::Macro, HeaderName, 4, {}); Symbol = SymbolInfo("MAX", SymbolInfo::SymbolKind::Macro, HeaderName, {});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
} }
TEST_F(FindAllSymbolsTest, MacroTestWithIWYU) { TEST_F(FindAllSymbolsTest, MacroTestWithIWYU) {
@ -548,17 +540,17 @@ TEST_F(FindAllSymbolsTest, MacroTestWithIWYU) {
)"; )";
runFindAllSymbols(Header, Main); runFindAllSymbols(Header, Main);
SymbolInfo Symbol = SymbolInfo Symbol =
SymbolInfo("X", SymbolInfo::SymbolKind::Macro, "bar.h", 3, {}); SymbolInfo("X", SymbolInfo::SymbolKind::Macro, "bar.h", {});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
Symbol = SymbolInfo("Y", SymbolInfo::SymbolKind::Macro, "bar.h", 4, {}); Symbol = SymbolInfo("Y", SymbolInfo::SymbolKind::Macro, "bar.h", {});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
Symbol = SymbolInfo("MAX", SymbolInfo::SymbolKind::Macro, "bar.h", 5, {}); Symbol = SymbolInfo("MAX", SymbolInfo::SymbolKind::Macro, "bar.h", {});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
EXPECT_TRUE(hasUse(Symbol)); EXPECT_EQ(1, used(Symbol));
} }
TEST_F(FindAllSymbolsTest, NoFriendTest) { TEST_F(FindAllSymbolsTest, NoFriendTest) {
@ -569,17 +561,17 @@ TEST_F(FindAllSymbolsTest, NoFriendTest) {
}; };
)"; )";
runFindAllSymbols(Header, ""); runFindAllSymbols(Header, "");
SymbolInfo Symbol = SymbolInfo("WorstFriend", SymbolInfo::SymbolKind::Class, SymbolInfo Symbol =
HeaderName, 2, {}); SymbolInfo("WorstFriend", SymbolInfo::SymbolKind::Class, HeaderName, {});
EXPECT_TRUE(hasSymbol(Symbol)); EXPECT_EQ(1, seen(Symbol));
Symbol = SymbolInfo("Friend", SymbolInfo::SymbolKind::Function, HeaderName, Symbol =
3, {}); SymbolInfo("Friend", SymbolInfo::SymbolKind::Function, HeaderName, {});
EXPECT_FALSE(hasSymbol(Symbol)); EXPECT_EQ(0, seen(Symbol));
Symbol = SymbolInfo("BestFriend", SymbolInfo::SymbolKind::Class, HeaderName, Symbol =
4, {}); SymbolInfo("BestFriend", SymbolInfo::SymbolKind::Class, HeaderName, {});
EXPECT_FALSE(hasSymbol(Symbol)); EXPECT_EQ(0, seen(Symbol));
} }
} // namespace find_all_symbols } // namespace find_all_symbols