Index: include-fixer/InMemoryXrefsDB.cpp =================================================================== --- include-fixer/InMemoryXrefsDB.cpp +++ include-fixer/InMemoryXrefsDB.cpp @@ -21,17 +21,16 @@ llvm::SmallVector Names; Identifier.split(Names, "::"); for (const auto &Header : Entry.second) { - // FIXME: create a complete instance with static member function when it - // is implemented. - SymbolInfo Info; - Info.Name = Names.back(); - Info.FilePath = Header; + std::vector Contexts; for (auto IdentiferContext = Names.rbegin() + 1; IdentiferContext != Names.rend(); ++IdentiferContext) { - Info.Contexts.push_back( - {SymbolInfo::ContextType::Namespace, *IdentiferContext}); + Contexts.emplace_back( + SymbolInfo::ContextType::Namespace, *IdentiferContext); } - this->LookupTable[Info.Name].push_back(Info); + + SymbolInfo Symbol( + Names.back(), SymbolInfo::Class, Header, Contexts, 1); + this->LookupTable[Symbol.getName()].push_back(Symbol); } } } Index: include-fixer/XrefsDBManager.cpp =================================================================== --- include-fixer/XrefsDBManager.cpp +++ include-fixer/XrefsDBManager.cpp @@ -36,13 +36,13 @@ std::vector Results; for (const auto &Symbol : Symbols) { // Match the identifier name without qualifier. - if (Symbol.Name == Names.back()) { + if (Symbol.getName() == Names.back()) { bool IsMatched = true; - auto SymbolContext = Symbol.Contexts.begin(); + auto SymbolContext = Symbol.getContexts().begin(); // Match the remaining context names. for (auto IdentiferContext = Names.rbegin() + 1; IdentiferContext != Names.rend() && - SymbolContext != Symbol.Contexts.end(); + SymbolContext != Symbol.getContexts().end(); ++IdentiferContext, ++SymbolContext) { if (SymbolContext->second != *IdentiferContext) { IsMatched = false; @@ -56,10 +56,10 @@ // need to be changed. // FIXME: if the file path is a system header name, we want to use angle // brackets. - Results.push_back( - (Symbol.FilePath[0] == '"' || Symbol.FilePath[0] == '<') - ? Symbol.FilePath - : "\"" + Symbol.FilePath + "\""); + std::string FilePath = Symbol.getFilePath().str(); + Results.push_back((FilePath[0] == '"' || FilePath[0] == '<') + ? FilePath + : "\"" + FilePath + "\""); } } } Index: include-fixer/YamlXrefsDB.cpp =================================================================== --- include-fixer/YamlXrefsDB.cpp +++ include-fixer/YamlXrefsDB.cpp @@ -50,7 +50,7 @@ std::vector YamlXrefsDB::search(llvm::StringRef Identifier) { std::vector Results; for (const auto &Symbol : Symbols) { - if (Symbol.Name == Identifier) + if (Symbol.getName() == Identifier) Results.push_back(Symbol); } return Results; Index: include-fixer/find-all-symbols/FindAllSymbols.cpp =================================================================== --- include-fixer/find-all-symbols/FindAllSymbols.cpp +++ include-fixer/find-all-symbols/FindAllSymbols.cpp @@ -15,6 +15,7 @@ #include "clang/ASTMatchers/ASTMatchFinder.h" #include "clang/ASTMatchers/ASTMatchers.h" #include "clang/Tooling/Tooling.h" +#include "llvm/ADT/Optional.h" #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" @@ -23,7 +24,8 @@ namespace clang { namespace find_all_symbols { namespace { -void SetContext(const NamedDecl *ND, SymbolInfo *Symbol) { +std::vector GetContexts(const NamedDecl *ND) { + std::vector Contexts; for (const auto *Context = ND->getDeclContext(); Context; Context = Context->getParent()) { if (llvm::isa(Context) || @@ -33,54 +35,65 @@ assert(llvm::isa(Context) && "Expect Context to be a NamedDecl"); if (const auto *NSD = dyn_cast(Context)) { - Symbol->Contexts.emplace_back( - SymbolInfo::Namespace, - NSD->isAnonymousNamespace() ? "" : NSD->getName().str()); + Contexts.emplace_back(SymbolInfo::Namespace, NSD->isAnonymousNamespace() + ? "" + : NSD->getName().str()); } else { const auto *RD = cast(Context); - Symbol->Contexts.emplace_back(SymbolInfo::Record, RD->getName().str()); + Contexts.emplace_back(SymbolInfo::Record, RD->getName().str()); } } + return Contexts; } -bool SetCommonInfo(const MatchFinder::MatchResult &Result, - const NamedDecl *ND, SymbolInfo *Symbol) { - SetContext(ND, Symbol); - - Symbol->Name = ND->getNameAsString(); +llvm::Optional CreateSymbolInfo(const NamedDecl *ND, + const SourceManager &SM) { + SymbolInfo::SymbolKind Type; + if (llvm::isa(ND)) { + Type = SymbolInfo::Variable; + } else if (llvm::isa(ND)) { + Type = SymbolInfo::Function; + } else if (llvm::isa(ND)) { + Type = SymbolInfo::TypedefName; + } else { + assert(llvm::isa(ND) && "Matched decl must be one of VarDecl, " + "FunctionDecl, TypedefNameDecl and " + "RecordDecl!"); + // C-style record decl can have empty name, e.g "struct { ... } var;". + if (ND->getName().empty()) + return llvm::None; + Type = SymbolInfo::Class; + } - const SourceManager *SM = Result.SourceManager; - SourceLocation Loc = SM->getExpansionLoc(ND->getLocation()); + SourceLocation Loc = SM.getExpansionLoc(ND->getLocation()); if (!Loc.isValid()) { llvm::errs() << "Declaration " << ND->getNameAsString() << "(" << ND->getDeclKindName() << ") has invalid declaration location."; - return false; + return llvm::None; } - - Symbol->LineNumber = SM->getExpansionLineNumber(Loc); - - llvm::StringRef FilePath = SM->getFilename(Loc); + llvm::StringRef FilePath = SM.getFilename(Loc); if (FilePath.empty()) - return false; + return llvm::None; llvm::SmallString<128> AbsolutePath; if (llvm::sys::path::is_absolute(FilePath)) { AbsolutePath = FilePath; } else { - auto WorkingDir = SM->getFileManager() + auto WorkingDir = SM.getFileManager() .getVirtualFileSystem() ->getCurrentWorkingDirectory(); if (!WorkingDir) - return false; + return llvm::None; AbsolutePath = *WorkingDir; llvm::sys::path::append(AbsolutePath, FilePath); } llvm::sys::path::remove_dots(AbsolutePath, true); - Symbol->FilePath = AbsolutePath.str(); - return true; + return SymbolInfo(ND->getNameAsString(), Type, AbsolutePath.str(), + GetContexts(ND), SM.getExpansionLineNumber(Loc)); } + } // namespace void FindAllSymbols::registerMatchers(MatchFinder *MatchFinder) { @@ -173,39 +186,10 @@ assert(ND && "Matched declaration must be a NamedDecl!"); const SourceManager *SM = Result.SourceManager; - SymbolInfo Symbol; - if (!SetCommonInfo(Result, ND, &Symbol)) - return; - - if (const auto *VD = llvm::dyn_cast(ND)) { - Symbol.Type = SymbolInfo::Variable; - SymbolInfo::VariableInfo VI; - VI.Type = VD->getType().getAsString(); - Symbol.VariableInfos = VI; - } else if (const auto *FD = llvm::dyn_cast(ND)) { - Symbol.Type = SymbolInfo::Function; - SymbolInfo::FunctionInfo FI; - FI.ReturnType = FD->getReturnType().getAsString(); - for (const auto *Param : FD->params()) - FI.ParameterTypes.push_back(Param->getType().getAsString()); - Symbol.FunctionInfos = FI; - } else if (const auto *TD = llvm::dyn_cast(ND)) { - Symbol.Type = SymbolInfo::TypedefName; - SymbolInfo::TypedefNameInfo TI; - TI.UnderlyingType = TD->getUnderlyingType().getAsString(); - Symbol.TypedefNameInfos = TI; - } else { - assert( - llvm::isa(ND) && - "Matched decl must be one of VarDecl, FunctionDecl, and RecordDecl!"); - // C-style record decl can have empty name, e.g "struct { ... } var;". - if (ND->getName().empty()) - return; - Symbol.Type = SymbolInfo::Class; - } - - const FileEntry *FE = SM->getFileEntryForID(SM->getMainFileID()); - Reporter->reportResult(FE->getName(), Symbol); + llvm::Optional Symbol = CreateSymbolInfo(ND, *SM); + if (Symbol) + Reporter->reportResult( + SM->getFileEntryForID(SM->getMainFileID())->getName(), *Symbol); } } // namespace find_all_symbols Index: include-fixer/find-all-symbols/SymbolInfo.h =================================================================== --- include-fixer/find-all-symbols/SymbolInfo.h +++ include-fixer/find-all-symbols/SymbolInfo.h @@ -12,6 +12,7 @@ #include "llvm/ADT/Optional.h" #include "llvm/ADT/StringRef.h" +#include "llvm/Support/YAMLTraits.h" #include "llvm/Support/raw_ostream.h" #include #include @@ -21,20 +22,55 @@ namespace find_all_symbols { /// \brief Contains all information for a Symbol. -// FIXME: add static members for creating complete instances. -struct SymbolInfo { +class SymbolInfo { +public: + /// \brief The SymbolInfo Type. enum SymbolKind { Function, Class, Variable, TypedefName, + Unknown, }; + /// \brief The Context Type. enum ContextType { Namespace, // Symbols declared in a namespace. Record, // Symbols declared in a class. }; + /// \brief A pair of . + typedef std::pair Context; + + // The default constructor is required by YAML traits in + // LLVM_YAML_IS_DOCUMENT_LIST_VECTOR. + SymbolInfo() : Type(Unknown), LineNumber(-1){}; + + SymbolInfo(llvm::StringRef Name, SymbolKind Type, llvm::StringRef FilePath, + const std::vector &Contexts, int LineNumber); + + /// \brief Get symbol name. + llvm::StringRef getName() const; + + /// \brief Get symbol type. + SymbolKind getSymbolKind() const; + + /// \brief Get the file path where symbol comes from + llvm::StringRef getFilePath() const; + + /// \brief Get symbol contexts. + const std::vector &getContexts() const; + + /// \brief Get a 1-based line number of the symbol's declaration. + int getLineNumber() const; + + bool operator<(const SymbolInfo &Symbol) const; + + bool operator==(const SymbolInfo &Symbol) const; + +private: + friend struct llvm::yaml::MappingTraits; + /// \brief Identifier name. std::string Name; @@ -44,9 +80,6 @@ /// \brief The file path where the symbol comes from. std::string FilePath; - /// \brief A pair of . - typedef std::pair Context; - /// \brief Contains information about symbol contexts. Context information is /// stored from the inner-most level to outer-most level. /// @@ -61,32 +94,6 @@ /// \brief The 1-based line number of of the symbol's declaration. int LineNumber; - - struct FunctionInfo { - std::string ReturnType; - std::vector ParameterTypes; - }; - - struct TypedefNameInfo { - std::string UnderlyingType; - }; - - struct VariableInfo { - std::string Type; - }; - - /// \brief The function information. - llvm::Optional FunctionInfos; - - /// \brief The typedef information. - llvm::Optional TypedefNameInfos; - - /// \brief The variable information. - llvm::Optional VariableInfos; - - bool operator==(const SymbolInfo &Symbol) const; - - bool operator<(const SymbolInfo &Symbol) const; }; /// \brief Write SymbolInfos to a stream (YAML format). Index: include-fixer/find-all-symbols/SymbolInfo.cpp =================================================================== --- include-fixer/find-all-symbols/SymbolInfo.cpp +++ include-fixer/find-all-symbols/SymbolInfo.cpp @@ -33,9 +33,6 @@ io.mapRequired("FilePath", Symbol.FilePath); io.mapRequired("LineNumber", Symbol.LineNumber); io.mapRequired("Type", Symbol.Type); - io.mapOptional("Variable", Symbol.VariableInfos); - io.mapOptional("Function", Symbol.FunctionInfos); - io.mapOptional("TypedefName", Symbol.TypedefNameInfos); } }; @@ -62,39 +59,40 @@ } }; -template <> struct MappingTraits { - static void mapping(IO &io, SymbolInfo::FunctionInfo &Value) { - io.mapRequired("ReturnType", Value.ReturnType); - io.mapRequired("ParameterTypes", Value.ParameterTypes); - } -}; - -template <> struct MappingTraits { - static void mapping(IO &io, SymbolInfo::VariableInfo &Value) { - io.mapRequired("VariableType", Value.Type); - } -}; - -template <> struct MappingTraits { - static void mapping(IO &io, SymbolInfo::TypedefNameInfo &Value) { - io.mapRequired("TypedefNameType", Value.UnderlyingType); - } -}; - } // namespace yaml } // namespace llvm namespace clang { namespace find_all_symbols { +SymbolInfo::SymbolInfo(llvm::StringRef Name, SymbolKind Type, + llvm::StringRef FilePath, + const std::vector &Contexts, int LineNumber) + : Name(Name), Type(Type), FilePath(FilePath), Contexts(Contexts), + LineNumber(LineNumber) {} + +llvm::StringRef SymbolInfo::getName() const { return Name; } + +SymbolKind SymbolInfo::getSymbolKind() const { return Type; } + +llvm::StringRef SymbolInfo::getFilePath() const { return FilePath; } + +const std::vector &SymbolInfo::getContexts() const { + return Contexts; +} + +int SymbolInfo::getLineNumber() const { return LineNumber; } + bool SymbolInfo::operator==(const SymbolInfo &Symbol) const { - return Name == Symbol.Name && FilePath == Symbol.FilePath && - LineNumber == Symbol.LineNumber && Contexts == Symbol.Contexts; + return std::tie(Name, Type, FilePath, LineNumber, Contexts) == + std::tie(Symbol.Name, Symbol.Type, Symbol.FilePath, Symbol.LineNumber, + Symbol.Contexts); } bool SymbolInfo::operator<(const SymbolInfo &Symbol) const { - return std::tie(Name, FilePath, LineNumber) < - std::tie(Symbol.Name, Symbol.FilePath, Symbol.LineNumber); + auto LHS = std::tie(Name, FilePath, LineNumber); + auto RHS = std::tie(Symbol.Name, Symbol.FilePath, Symbol.LineNumber); + return LHS != RHS ? LHS < RHS : Contexts < Symbol.Contexts; } bool WriteSymbolInfosToStream(llvm::raw_ostream &OS, Index: unittests/include-fixer/find-all-symbols/FindAllSymbolsTests.cpp =================================================================== --- unittests/include-fixer/find-all-symbols/FindAllSymbolsTests.cpp +++ unittests/include-fixer/find-all-symbols/FindAllSymbolsTests.cpp @@ -46,18 +46,6 @@ return false; } - bool getSymbolExtraInfo(SymbolInfo *Symbol) { - for (const auto &S : Symbols) { - if (S == *Symbol) { - Symbol->FunctionInfos = S.FunctionInfos; - Symbol->TypedefNameInfos = S.TypedefNameInfos; - Symbol->VariableInfos = S.VariableInfos; - return true; - } - } - return false; - } - private: std::vector Symbols; }; @@ -68,10 +56,6 @@ return Reporter.hasSymbol(Symbol); } - bool getSymbolExtraInfo(SymbolInfo &Symbol) { - return Reporter.getSymbolExtraInfo(&Symbol); - } - bool runFindAllSymbols(StringRef Code) { FindAllSymbols matcher(&Reporter); clang::ast_matchers::MatchFinder MatchFinder; @@ -87,7 +71,7 @@ clang::tooling::newFrontendActionFactory(&MatchFinder); tooling::ToolInvocation Invocation( {std::string("find_all_symbols"), std::string("-fsyntax-only"), - FileName}, + std::string("-std=c++11"), FileName}, Factory->create(), Files.get(), std::make_shared()); @@ -105,17 +89,10 @@ MockReporter Reporter; }; -SymbolInfo -CreateSymbolInfo(StringRef Name, SymbolInfo::SymbolKind Type, - const std::string FilePath, int LineNumber, - const std::vector &Contexts) { - SymbolInfo Symbol; - Symbol.Name = Name; - Symbol.Type = Type; - Symbol.FilePath = FilePath; - Symbol.LineNumber = LineNumber; - Symbol.Contexts = Contexts; - return Symbol; +SymbolInfo CreateSymbolInfo(StringRef Name, SymbolInfo::SymbolKind Type, + StringRef FilePath, int LineNumber, + const std::vector &Contexts) { + return SymbolInfo(Name, Type, FilePath, Contexts, LineNumber); } TEST_F(FindAllSymbolsTest, VariableSymbols) { @@ -127,29 +104,18 @@ })"; runFindAllSymbols(Code); - { - SymbolInfo Symbol = - CreateSymbolInfo("xargc", SymbolInfo::Variable, HeaderName, 2, {}); - EXPECT_TRUE(hasSymbol(Symbol)); - getSymbolExtraInfo(Symbol); - EXPECT_EQ("int", Symbol.VariableInfos.getValue().Type); - } - { - SymbolInfo Symbol = - CreateSymbolInfo("SSSS", SymbolInfo::Variable, HeaderName, 4, - {{SymbolInfo::Namespace, "na"}}); - EXPECT_TRUE(hasSymbol(Symbol)); - getSymbolExtraInfo(Symbol); - EXPECT_EQ("_Bool", Symbol.VariableInfos.getValue().Type); - } - { - SymbolInfo Symbol = CreateSymbolInfo( - "XXXX", SymbolInfo::Variable, HeaderName, 5, - {{SymbolInfo::Namespace, "nb"}, {SymbolInfo::Namespace, "na"}}); - EXPECT_TRUE(hasSymbol(Symbol)); - getSymbolExtraInfo(Symbol); - EXPECT_EQ("const long long *", Symbol.VariableInfos.getValue().Type); - } + SymbolInfo Symbol = + CreateSymbolInfo("xargc", SymbolInfo::Variable, HeaderName, 2, {}); + EXPECT_TRUE(hasSymbol(Symbol)); + + Symbol = CreateSymbolInfo("SSSS", SymbolInfo::Variable, HeaderName, 4, + {{SymbolInfo::Namespace, "na"}}); + EXPECT_TRUE(hasSymbol(Symbol)); + + Symbol = CreateSymbolInfo( + "XXXX", SymbolInfo::Variable, HeaderName, 5, + {{SymbolInfo::Namespace, "nb"}, {SymbolInfo::Namespace, "na"}}); + EXPECT_TRUE(hasSymbol(Symbol)); } TEST_F(FindAllSymbolsTest, ExternCSymbols) { @@ -162,19 +128,12 @@ })"; runFindAllSymbols(Code); - { - SymbolInfo Symbol = - CreateSymbolInfo("C_Func", SymbolInfo::Function, HeaderName, 3, {}); - EXPECT_TRUE(hasSymbol(Symbol)); - getSymbolExtraInfo(Symbol); - EXPECT_EQ("int", Symbol.FunctionInfos.getValue().ReturnType); - EXPECT_TRUE(Symbol.FunctionInfos.getValue().ParameterTypes.empty()); - } - { - SymbolInfo Symbol = - CreateSymbolInfo("C_struct", SymbolInfo::Class, HeaderName, 4, {}); - EXPECT_TRUE(hasSymbol(Symbol)); - } + SymbolInfo Symbol = + CreateSymbolInfo("C_Func", SymbolInfo::Function, HeaderName, 3, {}); + EXPECT_TRUE(hasSymbol(Symbol)); + + Symbol = CreateSymbolInfo("C_struct", SymbolInfo::Class, HeaderName, 4, {}); + EXPECT_TRUE(hasSymbol(Symbol)); } TEST_F(FindAllSymbolsTest, CXXRecordSymbols) { @@ -193,16 +152,13 @@ )"; runFindAllSymbols(Code); - { - SymbolInfo Symbol = - CreateSymbolInfo("Glob", SymbolInfo::Class, HeaderName, 2, {}); - EXPECT_TRUE(hasSymbol(Symbol)); - } - { - SymbolInfo Symbol = CreateSymbolInfo("A", SymbolInfo::Class, HeaderName, 6, - {{SymbolInfo::Namespace, "na"}}); - EXPECT_TRUE(hasSymbol(Symbol)); - } + SymbolInfo Symbol = + CreateSymbolInfo("Glob", SymbolInfo::Class, HeaderName, 2, {}); + EXPECT_TRUE(hasSymbol(Symbol)); + + Symbol = CreateSymbolInfo("A", SymbolInfo::Class, HeaderName, 6, + {{SymbolInfo::Namespace, "na"}}); + EXPECT_TRUE(hasSymbol(Symbol)); } TEST_F(FindAllSymbolsTest, CXXRecordSymbolsTemplate) { @@ -223,11 +179,9 @@ )"; runFindAllSymbols(Code); - { - SymbolInfo Symbol = - CreateSymbolInfo("T_TEMP", SymbolInfo::Class, HeaderName, 3, {}); - EXPECT_TRUE(hasSymbol(Symbol)); - } + SymbolInfo Symbol = + CreateSymbolInfo("T_TEMP", SymbolInfo::Class, HeaderName, 3, {}); + EXPECT_TRUE(hasSymbol(Symbol)); } TEST_F(FindAllSymbolsTest, FunctionSymbols) { @@ -246,43 +200,22 @@ )"; runFindAllSymbols(Code); - { - SymbolInfo Symbol = CreateSymbolInfo("gg", SymbolInfo::Class, HeaderName, 3, - {{SymbolInfo::Namespace, "na"}}); - EXPECT_TRUE(hasSymbol(Symbol)); - getSymbolExtraInfo(Symbol); - EXPECT_EQ("int", Symbol.FunctionInfos.getValue().ReturnType); - EXPECT_EQ(1u, Symbol.FunctionInfos.getValue().ParameterTypes.size()); - EXPECT_EQ("int", Symbol.FunctionInfos.getValue().ParameterTypes[0]); - } - { - SymbolInfo Symbol = CreateSymbolInfo("f", SymbolInfo::Class, HeaderName, 4, - {{SymbolInfo::Namespace, "na"}}); - EXPECT_TRUE(hasSymbol(Symbol)); - getSymbolExtraInfo(Symbol); - EXPECT_EQ("int", Symbol.FunctionInfos.getValue().ReturnType); - EXPECT_EQ(1u, Symbol.FunctionInfos.getValue().ParameterTypes.size()); - EXPECT_EQ("const int &", Symbol.FunctionInfos.getValue().ParameterTypes[0]); - } - { - SymbolInfo Symbol = - CreateSymbolInfo("SSSFFF", SymbolInfo::Class, HeaderName, 5, - {{SymbolInfo::Namespace, "na"}}); - EXPECT_TRUE(hasSymbol(Symbol)); - getSymbolExtraInfo(Symbol); - EXPECT_EQ("void", Symbol.FunctionInfos.getValue().ReturnType); - EXPECT_TRUE(Symbol.FunctionInfos.getValue().ParameterTypes.empty()); - } - { - SymbolInfo Symbol = CreateSymbolInfo( - "fun", SymbolInfo::Class, HeaderName, 10, - {{SymbolInfo::Namespace, "nb"}, {SymbolInfo::Namespace, "na"}}); - EXPECT_TRUE(hasSymbol(Symbol)); - getSymbolExtraInfo(Symbol); - EXPECT_EQ("void", Symbol.FunctionInfos.getValue().ReturnType); - EXPECT_EQ(1u, Symbol.FunctionInfos.getValue().ParameterTypes.size()); - EXPECT_EQ("T", Symbol.FunctionInfos.getValue().ParameterTypes[0]); - } + SymbolInfo Symbol = CreateSymbolInfo("gg", SymbolInfo::Function, HeaderName, + 3, {{SymbolInfo::Namespace, "na"}}); + EXPECT_TRUE(hasSymbol(Symbol)); + + Symbol = CreateSymbolInfo("f", SymbolInfo::Function, HeaderName, 4, + {{SymbolInfo::Namespace, "na"}}); + EXPECT_TRUE(hasSymbol(Symbol)); + + Symbol = CreateSymbolInfo("SSSFFF", SymbolInfo::Function, HeaderName, 5, + {{SymbolInfo::Namespace, "na"}}); + EXPECT_TRUE(hasSymbol(Symbol)); + + Symbol = CreateSymbolInfo( + "fun", SymbolInfo::Function, HeaderName, 10, + {{SymbolInfo::Namespace, "nb"}, {SymbolInfo::Namespace, "na"}}); + EXPECT_TRUE(hasSymbol(Symbol)); } TEST_F(FindAllSymbolsTest, NamespaceTest) { @@ -294,49 +227,31 @@ )"; runFindAllSymbols(Code); - { - SymbolInfo Symbol = - CreateSymbolInfo("X1", SymbolInfo::Variable, HeaderName, 2, {}); - EXPECT_TRUE(hasSymbol(Symbol)); - getSymbolExtraInfo(Symbol); - EXPECT_EQ("int", Symbol.VariableInfos.getValue().Type); - } - { - SymbolInfo Symbol = CreateSymbolInfo("X2", SymbolInfo::Variable, HeaderName, - 3, {{SymbolInfo::Namespace, ""}}); - EXPECT_TRUE(hasSymbol(Symbol)); - getSymbolExtraInfo(Symbol); - EXPECT_EQ("int", Symbol.VariableInfos.getValue().Type); - } - { - SymbolInfo Symbol = CreateSymbolInfo( - "X3", SymbolInfo::Variable, HeaderName, 4, - {{SymbolInfo::Namespace, ""}, {SymbolInfo::Namespace, ""}}); - EXPECT_TRUE(hasSymbol(Symbol)); - getSymbolExtraInfo(Symbol); - EXPECT_EQ("int", Symbol.VariableInfos.getValue().Type); - } - { - SymbolInfo Symbol = CreateSymbolInfo( - "X4", SymbolInfo::Variable, HeaderName, 5, - {{SymbolInfo::Namespace, "nb"}, {SymbolInfo::Namespace, ""}}); - EXPECT_TRUE(hasSymbol(Symbol)); - getSymbolExtraInfo(Symbol); - EXPECT_EQ("int", Symbol.VariableInfos.getValue().Type); - } + SymbolInfo Symbol = + CreateSymbolInfo("X1", SymbolInfo::Variable, HeaderName, 2, {}); + EXPECT_TRUE(hasSymbol(Symbol)); + + Symbol = CreateSymbolInfo("X2", SymbolInfo::Variable, HeaderName, 3, + {{SymbolInfo::Namespace, ""}}); + EXPECT_TRUE(hasSymbol(Symbol)); + + Symbol = CreateSymbolInfo( + "X3", SymbolInfo::Variable, HeaderName, 4, + {{SymbolInfo::Namespace, ""}, {SymbolInfo::Namespace, ""}}); + EXPECT_TRUE(hasSymbol(Symbol)); + + Symbol = CreateSymbolInfo( + "X4", SymbolInfo::Variable, HeaderName, 5, + {{SymbolInfo::Namespace, "nb"}, {SymbolInfo::Namespace, ""}}); + EXPECT_TRUE(hasSymbol(Symbol)); } TEST_F(FindAllSymbolsTest, DecayedTypeTest) { static const char Code[] = "void DecayedFunc(int x[], int y[10]) {}"; runFindAllSymbols(Code); SymbolInfo Symbol = - CreateSymbolInfo("DecayedFunc", SymbolInfo::Class, HeaderName, 1, {}); + CreateSymbolInfo("DecayedFunc", SymbolInfo::Function, HeaderName, 1, {}); EXPECT_TRUE(hasSymbol(Symbol)); - getSymbolExtraInfo(Symbol); - EXPECT_EQ("void", Symbol.FunctionInfos.getValue().ReturnType); - EXPECT_EQ(2u, Symbol.FunctionInfos.getValue().ParameterTypes.size()); - EXPECT_EQ("int *", Symbol.FunctionInfos.getValue().ParameterTypes[0]); - EXPECT_EQ("int *", Symbol.FunctionInfos.getValue().ParameterTypes[1]); } TEST_F(FindAllSymbolsTest, CTypedefTest) { @@ -347,28 +262,15 @@ )"; runFindAllSymbols(Code); - { - SymbolInfo Symbol = - CreateSymbolInfo("size_t_", SymbolInfo::TypedefName, HeaderName, 2, {}); - EXPECT_TRUE(hasSymbol(Symbol)); - getSymbolExtraInfo(Symbol); - EXPECT_EQ("unsigned int", - Symbol.TypedefNameInfos.getValue().UnderlyingType); - } - { - SymbolInfo Symbol = - CreateSymbolInfo("X", SymbolInfo::TypedefName, HeaderName, 3, {}); - EXPECT_TRUE(hasSymbol(Symbol)); - getSymbolExtraInfo(Symbol); - EXPECT_EQ("struct X", Symbol.TypedefNameInfos.getValue().UnderlyingType); - } - { - SymbolInfo Symbol = - CreateSymbolInfo("XX", SymbolInfo::TypedefName, HeaderName, 4, {}); - EXPECT_TRUE(hasSymbol(Symbol)); - getSymbolExtraInfo(Symbol); - EXPECT_EQ("X", Symbol.TypedefNameInfos.getValue().UnderlyingType); - } + SymbolInfo Symbol = + CreateSymbolInfo("size_t_", SymbolInfo::TypedefName, HeaderName, 2, {}); + EXPECT_TRUE(hasSymbol(Symbol)); + + Symbol = CreateSymbolInfo("X", SymbolInfo::TypedefName, HeaderName, 3, {}); + EXPECT_TRUE(hasSymbol(Symbol)); + + Symbol = CreateSymbolInfo("XX", SymbolInfo::TypedefName, HeaderName, 4, {}); + EXPECT_TRUE(hasSymbol(Symbol)); } } // namespace find_all_symbols