[change-namespace] get changing namespace to global correct.

llvm-svn: 288662
This commit is contained in:
Eric Liu 2016-12-05 11:17:04 +00:00
parent 7a6252158e
commit 2dd0e1bca3
2 changed files with 41 additions and 2 deletions

View File

@ -210,7 +210,8 @@ std::string wrapCodeInNamespace(StringRef NestedNs, std::string Code) {
if (Code.back() != '\n')
Code += "\n";
llvm::SmallVector<StringRef, 4> NsSplitted;
NestedNs.split(NsSplitted, "::");
NestedNs.split(NsSplitted, "::", /*MaxSplit=*/-1,
/*KeepEmpty=*/false);
while (!NsSplitted.empty()) {
// FIXME: consider code style for comments.
Code = ("namespace " + NsSplitted.back() + " {\n" + Code +
@ -272,7 +273,9 @@ void ChangeNamespaceTool::registerMatchers(ast_matchers::MatchFinder *Finder) {
// be "a::b". Declarations in this namespace will not be visible in the new
// namespace. If DiffOldNamespace is empty, Prefix will be a invalid name "-".
llvm::SmallVector<llvm::StringRef, 4> DiffOldNsSplitted;
llvm::StringRef(DiffOldNamespace).split(DiffOldNsSplitted, "::");
llvm::StringRef(DiffOldNamespace)
.split(DiffOldNsSplitted, "::", /*MaxSplit=*/-1,
/*KeepEmpty=*/false);
std::string Prefix = "-";
if (!DiffOldNsSplitted.empty())
Prefix = (StringRef(FullOldNs).drop_back(DiffOldNamespace.size()) +

View File

@ -1114,6 +1114,42 @@ TEST_F(ChangeNamespaceTest, DerivedClassWithConstructorsAndTypeRefs) {
EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
}
TEST_F(ChangeNamespaceTest, MoveToGlobalNamespace) {
NewNamespace = "";
std::string Code = "namespace na {\n"
"class C_A {};\n"
"namespace nc {\n"
"class C_C {};"
"} // namespace nc\n"
"namespace nb {\n"
"class C_X {\n"
"public:\n"
" C_A a;\n"
" nc::C_C c;\n"
"};\n"
"class C_Y {\n"
" C_X x;\n"
"};\n"
"} // namespace nb\n"
"} // namespace na\n";
std::string Expected = "namespace na {\n"
"class C_A {};\n"
"namespace nc {\n"
"class C_C {};"
"} // namespace nc\n"
"\n"
"} // namespace na\n"
"class C_X {\n"
"public:\n"
" na::C_A a;\n"
" na::nc::C_C c;\n"
"};\n"
"class C_Y {\n"
" C_X x;\n"
"};\n";
EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
}
} // anonymous namespace
} // namespace change_namespace
} // namespace clang