[include-fixer] Simplify unittest code.

Summary:
The InMemorySymbolIndex only constructs hard-coded Class symbols from a string
map. The patch provide a flexable way in InMemorySymbolIndex to create a custom
SymbolInfo in the include-fixer unittest.

Reviewers: bkramer

Subscribers: cfe-commits

Differential Revision: http://reviews.llvm.org/D20232

llvm-svn: 269427
This commit is contained in:
Haojian Wu 2016-05-13 15:17:17 +00:00
parent b79ab27853
commit 631e5f23f9
8 changed files with 105 additions and 125 deletions

View File

@ -15,24 +15,9 @@ namespace clang {
namespace include_fixer {
InMemorySymbolIndex::InMemorySymbolIndex(
const std::map<std::string, std::vector<std::string>> &LookupTable) {
for (const auto &Entry : LookupTable) {
llvm::StringRef Identifier(Entry.first);
llvm::SmallVector<llvm::StringRef, 8> Names;
Identifier.split(Names, "::");
for (const auto &Header : Entry.second) {
std::vector<SymbolInfo::Context> 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<SymbolInfo> &Symbols) {
for (const auto &Symbol : Symbols)
LookupTable[Symbol.getName()].push_back(Symbol);
}
std::vector<SymbolInfo>

View File

@ -21,8 +21,7 @@ namespace include_fixer {
/// Xref database with fixed content.
class InMemorySymbolIndex : public SymbolIndex {
public:
InMemorySymbolIndex(
const std::map<std::string, std::vector<std::string>> &LookupTable);
InMemorySymbolIndex(const std::vector<find_all_symbols::SymbolInfo> &Symbols);
std::vector<clang::find_all_symbols::SymbolInfo>
search(llvm::StringRef Identifier) override;

View File

@ -92,7 +92,7 @@ llvm::Optional<SymbolInfo> CreateSymbolInfo(const NamedDecl *ND,
return llvm::None;
return SymbolInfo(ND->getNameAsString(), Type, FilePath.str(),
GetContexts(ND), SM.getExpansionLineNumber(Loc));
SM.getExpansionLineNumber(Loc), GetContexts(ND));
}
} // namespace

View File

@ -70,8 +70,8 @@ namespace clang {
namespace find_all_symbols {
SymbolInfo::SymbolInfo(llvm::StringRef Name, SymbolKind Type,
llvm::StringRef FilePath,
const std::vector<Context> &Contexts, int LineNumber)
llvm::StringRef FilePath, int LineNumber,
const std::vector<Context> &Contexts)
: Name(Name), Type(Type), FilePath(FilePath), Contexts(Contexts),
LineNumber(LineNumber) {}

View File

@ -50,7 +50,7 @@ public:
SymbolInfo() : Type(SymbolKind::Unknown), LineNumber(-1) {};
SymbolInfo(llvm::StringRef Name, SymbolKind Type, llvm::StringRef FilePath,
const std::vector<Context> &Contexts, int LineNumber);
int LineNumber, const std::vector<Context> &Contexts);
/// \brief Get symbol name.
llvm::StringRef getName() const;

View File

@ -62,18 +62,20 @@ int includeFixerMain(int argc, const char **argv) {
std::map<std::string, std::vector<std::string>> SymbolsMap;
SmallVector<StringRef, 4> SemicolonSplits;
StringRef(Input).split(SemicolonSplits, ";");
std::vector<find_all_symbols::SymbolInfo> Symbols;
for (StringRef Pair : SemicolonSplits) {
auto Split = Pair.split('=');
std::vector<std::string> Headers;
SmallVector<StringRef, 4> 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<include_fixer::InMemorySymbolIndex>(
std::move(SymbolsMap)));
llvm::make_unique<include_fixer::InMemorySymbolIndex>(Symbols));
break;
}
case yaml: {

View File

@ -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<std::string> &ExtraArgs) {
@ -47,16 +48,21 @@ 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::map<std::string, std::vector<std::string>> SymbolsMap = {
{"std::string", {"<string>"}},
{"std::sting", {"\"sting\""}},
{"std::string::size_type", {"<string>"}},
{"a::b::foo", {"dir/otherdir/qux.h"}},
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("size_type", SymbolInfo::SymbolKind::Variable, "<string>", 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<include_fixer::SymbolIndexManager>();
SymbolIndexMgr->addSymbolIndex(
llvm::make_unique<include_fixer::InMemorySymbolIndex>(
std::move(SymbolsMap)));
llvm::make_unique<include_fixer::InMemorySymbolIndex>(Symbols));
std::vector<clang::tooling::Replacement> Replacements;
IncludeFixerActionFactory Factory(*SymbolIndexMgr, Replacements);

View File

@ -89,12 +89,6 @@ private:
MockReporter Reporter;
};
SymbolInfo CreateSymbolInfo(StringRef Name, SymbolInfo::SymbolKind Type,
StringRef FilePath, int LineNumber,
const std::vector<SymbolInfo::Context> &Contexts) {
return SymbolInfo(Name, Type, FilePath, Contexts, LineNumber);
}
TEST_F(FindAllSymbolsTest, VariableSymbols) {
static const char Code[] = R"(
extern int xargc;
@ -104,19 +98,17 @@ TEST_F(FindAllSymbolsTest, VariableSymbols) {
})";
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 @@ TEST_F(FindAllSymbolsTest, ExternCSymbols) {
})";
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 @@ TEST_F(FindAllSymbolsTest, CXXRecordSymbols) {
)";
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 @@ TEST_F(FindAllSymbolsTest, CXXRecordSymbolsTemplate) {
)";
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 @@ TEST_F(FindAllSymbolsTest, FunctionSymbols) {
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 @@ TEST_F(FindAllSymbolsTest, NamespaceTest) {
)";
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 @@ TEST_F(FindAllSymbolsTest, CTypedefTest) {
)";
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 @@ TEST_F(FindAllSymbolsTest, EnumTest) {
)";
runFindAllSymbols(Code);
SymbolInfo Symbol = CreateSymbolInfo(
"Glob_E", SymbolInfo::SymbolKind::EnumDecl, HeaderName, 2, {});
EXPECT_TRUE(hasSymbol(Symbol));
Symbol = CreateSymbolInfo("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"}});
EXPECT_TRUE(hasSymbol(Symbol));
Symbol = CreateSymbolInfo("Altitude", SymbolInfo::SymbolKind::EnumDecl,
HeaderName, 3, {});
EXPECT_TRUE(hasSymbol(Symbol));
Symbol = CreateSymbolInfo("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, ""}});
SymbolInfo Symbol =
SymbolInfo("Glob_E", SymbolInfo::SymbolKind::EnumDecl, HeaderName, 2, {});
EXPECT_TRUE(hasSymbol(Symbol));
Symbol =
CreateSymbolInfo("A_ENUM", SymbolInfo::SymbolKind::EnumDecl, HeaderName,
7, {{SymbolInfo::ContextType::Record, "A"}});
SymbolInfo("G1", SymbolInfo::SymbolKind::EnumConstantDecl, HeaderName, 2,
{{SymbolInfo::ContextType::EnumDecl, "Glob_E"}});
EXPECT_TRUE(hasSymbol(Symbol));
Symbol =
SymbolInfo("G2", SymbolInfo::SymbolKind::EnumConstantDecl, HeaderName, 2,
{{SymbolInfo::ContextType::EnumDecl, "Glob_E"}});
EXPECT_TRUE(hasSymbol(Symbol));
Symbol = SymbolInfo("Altitude", SymbolInfo::SymbolKind::EnumDecl, HeaderName,
3, {});
EXPECT_TRUE(hasSymbol(Symbol));
Symbol =
SymbolInfo("high", SymbolInfo::SymbolKind::EnumConstantDecl, HeaderName,
3, {{SymbolInfo::ContextType::EnumDecl, "Altitude"}});
EXPECT_FALSE(hasSymbol(Symbol));
Symbol = CreateSymbolInfo("X1", SymbolInfo::SymbolKind::EnumDecl, HeaderName,
7, {{SymbolInfo::ContextType::EnumDecl, "A_ENUM"},
{SymbolInfo::ContextType::Record, "A"}});
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 = SymbolInfo("A_ENUM", SymbolInfo::SymbolKind::EnumDecl, HeaderName, 7,
{{SymbolInfo::ContextType::Record, "A"}});
EXPECT_FALSE(hasSymbol(Symbol));
Symbol = SymbolInfo("X1", SymbolInfo::SymbolKind::EnumDecl, HeaderName, 7,
{{SymbolInfo::ContextType::EnumDecl, "A_ENUM"},
{SymbolInfo::ContextType::Record, "A"}});
EXPECT_FALSE(hasSymbol(Symbol));
}