From 2dd0e1bca33c2408893f88d33c9c6595cbdc9484 Mon Sep 17 00:00:00 2001 From: Eric Liu Date: Mon, 5 Dec 2016 11:17:04 +0000 Subject: [PATCH] [change-namespace] get changing namespace to global correct. llvm-svn: 288662 --- .../change-namespace/ChangeNamespace.cpp | 7 +++-- .../change-namespace/ChangeNamespaceTests.cpp | 36 ++++++++++++++++++++++ 2 files changed, 41 insertions(+), 2 deletions(-) diff --git a/clang-tools-extra/change-namespace/ChangeNamespace.cpp b/clang-tools-extra/change-namespace/ChangeNamespace.cpp index 7de4690a..c0a8fe0 100644 --- a/clang-tools-extra/change-namespace/ChangeNamespace.cpp +++ b/clang-tools-extra/change-namespace/ChangeNamespace.cpp @@ -210,7 +210,8 @@ std::string wrapCodeInNamespace(StringRef NestedNs, std::string Code) { if (Code.back() != '\n') Code += "\n"; llvm::SmallVector 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 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()) + diff --git a/clang-tools-extra/unittests/change-namespace/ChangeNamespaceTests.cpp b/clang-tools-extra/unittests/change-namespace/ChangeNamespaceTests.cpp index 755d05e..53684be 100644 --- a/clang-tools-extra/unittests/change-namespace/ChangeNamespaceTests.cpp +++ b/clang-tools-extra/unittests/change-namespace/ChangeNamespaceTests.cpp @@ -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 -- 2.7.4