Index: clang-tools-extra/trunk/include-fixer/InMemorySymbolIndex.h =================================================================== --- clang-tools-extra/trunk/include-fixer/InMemorySymbolIndex.h +++ clang-tools-extra/trunk/include-fixer/InMemorySymbolIndex.h @@ -21,8 +21,7 @@ /// Xref database with fixed content. class InMemorySymbolIndex : public SymbolIndex { public: - InMemorySymbolIndex( - const std::map> &LookupTable); + InMemorySymbolIndex(const std::vector &Symbols); std::vector search(llvm::StringRef Identifier) override; Index: clang-tools-extra/trunk/include-fixer/InMemorySymbolIndex.cpp =================================================================== --- clang-tools-extra/trunk/include-fixer/InMemorySymbolIndex.cpp +++ clang-tools-extra/trunk/include-fixer/InMemorySymbolIndex.cpp @@ -15,24 +15,9 @@ namespace include_fixer { InMemorySymbolIndex::InMemorySymbolIndex( - const std::map> &LookupTable) { - for (const auto &Entry : LookupTable) { - llvm::StringRef Identifier(Entry.first); - llvm::SmallVector Names; - Identifier.split(Names, "::"); - for (const auto &Header : Entry.second) { - std::vector Contexts; - for (auto IdentiferContext = Names.rbegin() + 1; - IdentiferContext != Names.rend(); ++IdentiferContext) { - Contexts.emplace_back(SymbolInfo::ContextType::Namespace, - *IdentiferContext); - } - - SymbolInfo Symbol(Names.back(), SymbolInfo::SymbolKind::Class, Header, - Contexts, 1); - this->LookupTable[Symbol.getName()].push_back(Symbol); - } - } + const std::vector &Symbols) { + for (const auto &Symbol : Symbols) + LookupTable[Symbol.getName()].push_back(Symbol); } std::vector Index: clang-tools-extra/trunk/include-fixer/find-all-symbols/FindAllSymbols.cpp =================================================================== --- clang-tools-extra/trunk/include-fixer/find-all-symbols/FindAllSymbols.cpp +++ clang-tools-extra/trunk/include-fixer/find-all-symbols/FindAllSymbols.cpp @@ -92,7 +92,7 @@ return llvm::None; return SymbolInfo(ND->getNameAsString(), Type, FilePath.str(), - GetContexts(ND), SM.getExpansionLineNumber(Loc)); + SM.getExpansionLineNumber(Loc), GetContexts(ND)); } } // namespace Index: clang-tools-extra/trunk/include-fixer/find-all-symbols/SymbolInfo.h =================================================================== --- clang-tools-extra/trunk/include-fixer/find-all-symbols/SymbolInfo.h +++ clang-tools-extra/trunk/include-fixer/find-all-symbols/SymbolInfo.h @@ -50,7 +50,7 @@ SymbolInfo() : Type(SymbolKind::Unknown), LineNumber(-1) {}; SymbolInfo(llvm::StringRef Name, SymbolKind Type, llvm::StringRef FilePath, - const std::vector &Contexts, int LineNumber); + int LineNumber, const std::vector &Contexts); /// \brief Get symbol name. llvm::StringRef getName() const; Index: clang-tools-extra/trunk/include-fixer/find-all-symbols/SymbolInfo.cpp =================================================================== --- clang-tools-extra/trunk/include-fixer/find-all-symbols/SymbolInfo.cpp +++ clang-tools-extra/trunk/include-fixer/find-all-symbols/SymbolInfo.cpp @@ -70,8 +70,8 @@ namespace find_all_symbols { SymbolInfo::SymbolInfo(llvm::StringRef Name, SymbolKind Type, - llvm::StringRef FilePath, - const std::vector &Contexts, int LineNumber) + llvm::StringRef FilePath, int LineNumber, + const std::vector &Contexts) : Name(Name), Type(Type), FilePath(FilePath), Contexts(Contexts), LineNumber(LineNumber) {} Index: clang-tools-extra/trunk/include-fixer/tool/ClangIncludeFixer.cpp =================================================================== --- clang-tools-extra/trunk/include-fixer/tool/ClangIncludeFixer.cpp +++ clang-tools-extra/trunk/include-fixer/tool/ClangIncludeFixer.cpp @@ -62,18 +62,20 @@ std::map> SymbolsMap; SmallVector SemicolonSplits; StringRef(Input).split(SemicolonSplits, ";"); + std::vector Symbols; for (StringRef Pair : SemicolonSplits) { auto Split = Pair.split('='); std::vector Headers; SmallVector CommaSplits; Split.second.split(CommaSplits, ","); for (StringRef Header : CommaSplits) - Headers.push_back(Header.trim()); - SymbolsMap[Split.first.trim()] = std::move(Headers); + Symbols.push_back(find_all_symbols::SymbolInfo( + Split.first.trim(), + find_all_symbols::SymbolInfo::SymbolKind::Unknown, Header.trim(), 1, + {})); } SymbolIndexMgr->addSymbolIndex( - llvm::make_unique( - std::move(SymbolsMap))); + llvm::make_unique(Symbols)); break; } case yaml: { Index: clang-tools-extra/trunk/unittests/include-fixer/IncludeFixerTest.cpp =================================================================== --- clang-tools-extra/trunk/unittests/include-fixer/IncludeFixerTest.cpp +++ clang-tools-extra/trunk/unittests/include-fixer/IncludeFixerTest.cpp @@ -13,12 +13,13 @@ #include "unittests/Tooling/RewriterTestContext.h" #include "clang/Tooling/Tooling.h" #include "gtest/gtest.h" -using namespace clang; namespace clang { namespace include_fixer { namespace { +using find_all_symbols::SymbolInfo; + static bool runOnCode(tooling::ToolAction *ToolAction, StringRef Code, StringRef FileName, const std::vector &ExtraArgs) { @@ -47,16 +48,21 @@ static std::string runIncludeFixer( StringRef Code, const std::vector &ExtraArgs = std::vector()) { - std::map> SymbolsMap = { - {"std::string", {""}}, - {"std::sting", {"\"sting\""}}, - {"std::string::size_type", {""}}, - {"a::b::foo", {"dir/otherdir/qux.h"}}, + std::vector Symbols = { + SymbolInfo("string", SymbolInfo::SymbolKind::Class, "", 1, + {{SymbolInfo::ContextType::Namespace, "std"}}), + SymbolInfo("sting", SymbolInfo::SymbolKind::Class, "\"sting\"", 1, + {{SymbolInfo::ContextType::Namespace, "std"}}), + SymbolInfo("size_type", SymbolInfo::SymbolKind::Variable, "", 1, + {{SymbolInfo::ContextType::Namespace, "string"}, + {SymbolInfo::ContextType::Namespace, "std"}}), + SymbolInfo("foo", SymbolInfo::SymbolKind::Class, "\"dir/otherdir/qux.h\"", + 1, {{SymbolInfo::ContextType::Namespace, "b"}, + {SymbolInfo::ContextType::Namespace, "a"}}), }; auto SymbolIndexMgr = llvm::make_unique(); SymbolIndexMgr->addSymbolIndex( - llvm::make_unique( - std::move(SymbolsMap))); + llvm::make_unique(Symbols)); std::vector Replacements; IncludeFixerActionFactory Factory(*SymbolIndexMgr, Replacements); Index: clang-tools-extra/trunk/unittests/include-fixer/find-all-symbols/FindAllSymbolsTests.cpp =================================================================== --- clang-tools-extra/trunk/unittests/include-fixer/find-all-symbols/FindAllSymbolsTests.cpp +++ clang-tools-extra/trunk/unittests/include-fixer/find-all-symbols/FindAllSymbolsTests.cpp @@ -89,12 +89,6 @@ MockReporter Reporter; }; -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) { static const char Code[] = R"( extern int xargc; @@ -104,19 +98,17 @@ })"; runFindAllSymbols(Code); - SymbolInfo Symbol = CreateSymbolInfo( - "xargc", SymbolInfo::SymbolKind::Variable, HeaderName, 2, {}); + SymbolInfo Symbol = + SymbolInfo("xargc", SymbolInfo::SymbolKind::Variable, HeaderName, 2, {}); EXPECT_TRUE(hasSymbol(Symbol)); - Symbol = - CreateSymbolInfo("SSSS", SymbolInfo::SymbolKind::Variable, HeaderName, 4, - {{SymbolInfo::ContextType::Namespace, "na"}}); + Symbol = SymbolInfo("SSSS", SymbolInfo::SymbolKind::Variable, HeaderName, 4, + {{SymbolInfo::ContextType::Namespace, "na"}}); EXPECT_TRUE(hasSymbol(Symbol)); - Symbol = - CreateSymbolInfo("XXXX", SymbolInfo::SymbolKind::Variable, HeaderName, 5, - {{SymbolInfo::ContextType::Namespace, "nb"}, - {SymbolInfo::ContextType::Namespace, "na"}}); + Symbol = SymbolInfo("XXXX", SymbolInfo::SymbolKind::Variable, HeaderName, 5, + {{SymbolInfo::ContextType::Namespace, "nb"}, + {SymbolInfo::ContextType::Namespace, "na"}}); EXPECT_TRUE(hasSymbol(Symbol)); } @@ -130,12 +122,12 @@ })"; runFindAllSymbols(Code); - SymbolInfo Symbol = CreateSymbolInfo( - "C_Func", SymbolInfo::SymbolKind::Function, HeaderName, 3, {}); + SymbolInfo Symbol = + SymbolInfo("C_Func", SymbolInfo::SymbolKind::Function, HeaderName, 3, {}); EXPECT_TRUE(hasSymbol(Symbol)); - Symbol = CreateSymbolInfo("C_struct", SymbolInfo::SymbolKind::Class, - HeaderName, 4, {}); + Symbol = + SymbolInfo("C_struct", SymbolInfo::SymbolKind::Class, HeaderName, 4, {}); EXPECT_TRUE(hasSymbol(Symbol)); } @@ -155,17 +147,17 @@ )"; runFindAllSymbols(Code); - SymbolInfo Symbol = CreateSymbolInfo("Glob", SymbolInfo::SymbolKind::Class, - HeaderName, 2, {}); + SymbolInfo Symbol = + SymbolInfo("Glob", SymbolInfo::SymbolKind::Class, HeaderName, 2, {}); EXPECT_TRUE(hasSymbol(Symbol)); - Symbol = CreateSymbolInfo("A", SymbolInfo::SymbolKind::Class, HeaderName, 6, - {{SymbolInfo::ContextType::Namespace, "na"}}); + Symbol = SymbolInfo("A", SymbolInfo::SymbolKind::Class, HeaderName, 6, + {{SymbolInfo::ContextType::Namespace, "na"}}); EXPECT_TRUE(hasSymbol(Symbol)); - Symbol = CreateSymbolInfo("AAA", SymbolInfo::SymbolKind::Class, HeaderName, 7, - {{SymbolInfo::ContextType::Record, "A"}, - {SymbolInfo::ContextType::Namespace, "na"}}); + Symbol = SymbolInfo("AAA", SymbolInfo::SymbolKind::Class, HeaderName, 7, + {{SymbolInfo::ContextType::Record, "A"}, + {SymbolInfo::ContextType::Namespace, "na"}}); EXPECT_FALSE(hasSymbol(Symbol)); } @@ -187,8 +179,8 @@ )"; runFindAllSymbols(Code); - SymbolInfo Symbol = CreateSymbolInfo("T_TEMP", SymbolInfo::SymbolKind::Class, - HeaderName, 3, {}); + SymbolInfo Symbol = + SymbolInfo("T_TEMP", SymbolInfo::SymbolKind::Class, HeaderName, 3, {}); EXPECT_TRUE(hasSymbol(Symbol)); } @@ -209,22 +201,21 @@ runFindAllSymbols(Code); SymbolInfo Symbol = - CreateSymbolInfo("gg", SymbolInfo::SymbolKind::Function, HeaderName, 3, - {{SymbolInfo::ContextType::Namespace, "na"}}); + SymbolInfo("gg", SymbolInfo::SymbolKind::Function, HeaderName, 3, + {{SymbolInfo::ContextType::Namespace, "na"}}); EXPECT_TRUE(hasSymbol(Symbol)); - Symbol = CreateSymbolInfo("f", SymbolInfo::SymbolKind::Function, HeaderName, - 4, {{SymbolInfo::ContextType::Namespace, "na"}}); + Symbol = SymbolInfo("f", SymbolInfo::SymbolKind::Function, HeaderName, 4, + {{SymbolInfo::ContextType::Namespace, "na"}}); EXPECT_TRUE(hasSymbol(Symbol)); - Symbol = - CreateSymbolInfo("SSSFFF", SymbolInfo::SymbolKind::Function, HeaderName, - 5, {{SymbolInfo::ContextType::Namespace, "na"}}); + Symbol = SymbolInfo("SSSFFF", SymbolInfo::SymbolKind::Function, HeaderName, 5, + {{SymbolInfo::ContextType::Namespace, "na"}}); EXPECT_TRUE(hasSymbol(Symbol)); - Symbol = CreateSymbolInfo("fun", SymbolInfo::SymbolKind::Function, HeaderName, - 10, {{SymbolInfo::ContextType::Namespace, "nb"}, - {SymbolInfo::ContextType::Namespace, "na"}}); + Symbol = SymbolInfo("fun", SymbolInfo::SymbolKind::Function, HeaderName, 10, + {{SymbolInfo::ContextType::Namespace, "nb"}, + {SymbolInfo::ContextType::Namespace, "na"}}); EXPECT_TRUE(hasSymbol(Symbol)); } @@ -237,29 +228,29 @@ )"; runFindAllSymbols(Code); - SymbolInfo Symbol = CreateSymbolInfo("X1", SymbolInfo::SymbolKind::Variable, - HeaderName, 2, {}); + SymbolInfo Symbol = + SymbolInfo("X1", SymbolInfo::SymbolKind::Variable, HeaderName, 2, {}); EXPECT_TRUE(hasSymbol(Symbol)); - Symbol = CreateSymbolInfo("X2", SymbolInfo::SymbolKind::Variable, HeaderName, - 3, {{SymbolInfo::ContextType::Namespace, ""}}); + Symbol = SymbolInfo("X2", SymbolInfo::SymbolKind::Variable, HeaderName, 3, + {{SymbolInfo::ContextType::Namespace, ""}}); EXPECT_TRUE(hasSymbol(Symbol)); - Symbol = CreateSymbolInfo("X3", SymbolInfo::SymbolKind::Variable, HeaderName, - 4, {{SymbolInfo::ContextType::Namespace, ""}, - {SymbolInfo::ContextType::Namespace, ""}}); + Symbol = SymbolInfo("X3", SymbolInfo::SymbolKind::Variable, HeaderName, 4, + {{SymbolInfo::ContextType::Namespace, ""}, + {SymbolInfo::ContextType::Namespace, ""}}); EXPECT_TRUE(hasSymbol(Symbol)); - Symbol = CreateSymbolInfo("X4", SymbolInfo::SymbolKind::Variable, HeaderName, - 5, {{SymbolInfo::ContextType::Namespace, "nb"}, - {SymbolInfo::ContextType::Namespace, ""}}); + Symbol = SymbolInfo("X4", SymbolInfo::SymbolKind::Variable, HeaderName, 5, + {{SymbolInfo::ContextType::Namespace, "nb"}, + {SymbolInfo::ContextType::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( + SymbolInfo Symbol = SymbolInfo( "DecayedFunc", SymbolInfo::SymbolKind::Function, HeaderName, 1, {}); EXPECT_TRUE(hasSymbol(Symbol)); } @@ -272,16 +263,16 @@ )"; runFindAllSymbols(Code); - SymbolInfo Symbol = CreateSymbolInfo( - "size_t_", SymbolInfo::SymbolKind::TypedefName, HeaderName, 2, {}); + SymbolInfo Symbol = SymbolInfo("size_t_", SymbolInfo::SymbolKind::TypedefName, + HeaderName, 2, {}); EXPECT_TRUE(hasSymbol(Symbol)); - Symbol = CreateSymbolInfo("X", SymbolInfo::SymbolKind::TypedefName, - HeaderName, 3, {}); + Symbol = + SymbolInfo("X", SymbolInfo::SymbolKind::TypedefName, HeaderName, 3, {}); EXPECT_TRUE(hasSymbol(Symbol)); - Symbol = CreateSymbolInfo("XX", SymbolInfo::SymbolKind::TypedefName, - HeaderName, 4, {}); + Symbol = + SymbolInfo("XX", SymbolInfo::SymbolKind::TypedefName, HeaderName, 4, {}); EXPECT_TRUE(hasSymbol(Symbol)); } @@ -297,45 +288,42 @@ )"; runFindAllSymbols(Code); - SymbolInfo Symbol = CreateSymbolInfo( - "Glob_E", SymbolInfo::SymbolKind::EnumDecl, HeaderName, 2, {}); + SymbolInfo Symbol = + SymbolInfo("Glob_E", SymbolInfo::SymbolKind::EnumDecl, HeaderName, 2, {}); EXPECT_TRUE(hasSymbol(Symbol)); - Symbol = CreateSymbolInfo("G1", SymbolInfo::SymbolKind::EnumConstantDecl, - HeaderName, 2, - {{SymbolInfo::ContextType::EnumDecl, "Glob_E"}}); + Symbol = + SymbolInfo("G1", SymbolInfo::SymbolKind::EnumConstantDecl, HeaderName, 2, + {{SymbolInfo::ContextType::EnumDecl, "Glob_E"}}); EXPECT_TRUE(hasSymbol(Symbol)); - Symbol = CreateSymbolInfo("G2", SymbolInfo::SymbolKind::EnumConstantDecl, - HeaderName, 2, - {{SymbolInfo::ContextType::EnumDecl, "Glob_E"}}); + Symbol = + SymbolInfo("G2", SymbolInfo::SymbolKind::EnumConstantDecl, HeaderName, 2, + {{SymbolInfo::ContextType::EnumDecl, "Glob_E"}}); EXPECT_TRUE(hasSymbol(Symbol)); - Symbol = CreateSymbolInfo("Altitude", SymbolInfo::SymbolKind::EnumDecl, - HeaderName, 3, {}); + Symbol = SymbolInfo("Altitude", SymbolInfo::SymbolKind::EnumDecl, HeaderName, + 3, {}); EXPECT_TRUE(hasSymbol(Symbol)); - Symbol = CreateSymbolInfo("high", SymbolInfo::SymbolKind::EnumConstantDecl, - HeaderName, 3, - {{SymbolInfo::ContextType::EnumDecl, "Altitude"}}); + Symbol = + SymbolInfo("high", SymbolInfo::SymbolKind::EnumConstantDecl, HeaderName, + 3, {{SymbolInfo::ContextType::EnumDecl, "Altitude"}}); EXPECT_FALSE(hasSymbol(Symbol)); - Symbol = CreateSymbolInfo("A1", SymbolInfo::SymbolKind::EnumConstantDecl, - HeaderName, 4, - {{SymbolInfo::ContextType::EnumDecl, ""}}); - EXPECT_TRUE(hasSymbol(Symbol)); - Symbol = CreateSymbolInfo("A2", SymbolInfo::SymbolKind::EnumConstantDecl, - HeaderName, 4, - {{SymbolInfo::ContextType::EnumDecl, ""}}); + Symbol = SymbolInfo("A1", SymbolInfo::SymbolKind::EnumConstantDecl, + HeaderName, 4, {{SymbolInfo::ContextType::EnumDecl, ""}}); + EXPECT_TRUE(hasSymbol(Symbol)); + Symbol = SymbolInfo("A2", SymbolInfo::SymbolKind::EnumConstantDecl, + HeaderName, 4, {{SymbolInfo::ContextType::EnumDecl, ""}}); EXPECT_TRUE(hasSymbol(Symbol)); - Symbol = - CreateSymbolInfo("A_ENUM", SymbolInfo::SymbolKind::EnumDecl, HeaderName, - 7, {{SymbolInfo::ContextType::Record, "A"}}); + Symbol = SymbolInfo("A_ENUM", SymbolInfo::SymbolKind::EnumDecl, HeaderName, 7, + {{SymbolInfo::ContextType::Record, "A"}}); EXPECT_FALSE(hasSymbol(Symbol)); - Symbol = CreateSymbolInfo("X1", SymbolInfo::SymbolKind::EnumDecl, HeaderName, - 7, {{SymbolInfo::ContextType::EnumDecl, "A_ENUM"}, - {SymbolInfo::ContextType::Record, "A"}}); + Symbol = SymbolInfo("X1", SymbolInfo::SymbolKind::EnumDecl, HeaderName, 7, + {{SymbolInfo::ContextType::EnumDecl, "A_ENUM"}, + {SymbolInfo::ContextType::Record, "A"}}); EXPECT_FALSE(hasSymbol(Symbol)); }