EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
}
+TEST_F(ChangeNamespaceTest, MoveIntoExistingNamespaceAndShortenRefs) {
+ std::string Code = "namespace x {\n"
+ "namespace z {\n"
+ "class Z {};\n"
+ "} // namespace z\n"
+ "namespace y {\n"
+ "class T {};\n"
+ "} // namespace y\n"
+ "} // namespace x\n"
+ "namespace na {\n"
+ "class A{};\n"
+ "namespace nb {\n"
+ "class X { A a; x::z::Z zz; x::y::T t; };\n"
+ "} // namespace nb\n"
+ "} // namespace na\n";
+ std::string Expected = "namespace x {\n"
+ "namespace z {\n"
+ "class Z {};\n"
+ "} // namespace z\n"
+ "namespace y {\n"
+ "class T {};\n"
+ "} // namespace y\n"
+ "} // namespace x\n"
+ "namespace na {\n"
+ "class A {};\n\n"
+ "} // namespace na\n"
+ "namespace x {\n"
+ "namespace y {\n"
+ "class X { ::na::A a; z::Z zz; T t; };\n"
+ "} // namespace y\n"
+ "} // namespace x\n";
+ EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
+}
+
TEST_F(ChangeNamespaceTest, SimpleMoveNestedNamespace) {
NewNamespace = "na::x::y";
std::string Code = "namespace na {\n"
"namespace y {\n"
"class C_X {\n"
"public:\n"
- " na::C_A a;\n"
- " na::nc::C_C c;\n"
+ " ::na::C_A a;\n"
+ " ::na::nc::C_C c;\n"
"};\n"
"class C_Y {\n"
" C_X x;\n"
"namespace x {\n"
"namespace y {\n"
"void f() {\n"
- " na::B<na::A> b;\n"
- " na::B<na::nc::C> b_c;\n"
- " na::Two<na::A, na::nc::C> two;\n"
+ " ::na::B<::na::A> b;\n"
+ " ::na::B<::na::nc::C> b_c;\n"
+ " ::na::Two<::na::A, ::na::nc::C> two;\n"
"}\n"
"} // namespace y\n"
"} // namespace x\n";
"namespace y {\n"
"\n"
"class A {\n"
- " na::nb::FWD *fwd;\n"
+ " ::na::nb::FWD *fwd;\n"
"};\n"
"} // namespace y\n"
"} // namespace x\n";
"namespace y {\n"
"\n"
"class A {\n"
- " na::nb::FWD *fwd;\n"
+ " ::na::nb::FWD *fwd;\n"
"};\n"
"template<typename T> class TEMP {};\n"
"} // namespace y\n"
"namespace x {\n"
"namespace y {\n"
"void fwd();\n"
- "void f(na::C_A ca, na::nc::C_C cc) {\n"
- " na::C_A ca_1 = ca;\n"
+ "void f(::na::C_A ca, ::na::nc::C_C cc) {\n"
+ " ::na::C_A ca_1 = ca;\n"
"}\n"
"} // namespace y\n"
"} // namespace x\n";
"namespace x {\n"
"namespace y {\n"
"using ::na::nc::SAME;\n"
- "using YO = na::nd::SAME;\n"
- "typedef na::nd::SAME IDENTICAL;\n"
- "void f(na::nd::SAME Same) {}\n"
+ "using YO = ::na::nd::SAME;\n"
+ "typedef ::na::nd::SAME IDENTICAL;\n"
+ "void f(::na::nd::SAME Same) {}\n"
"} // namespace y\n"
"} // namespace x\n";
EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
"} // namespace na\n"
"namespace x {\n"
"namespace y {\n"
- "class D : public na::Base {\n"
+ "class D : public ::na::Base {\n"
"public:\n"
- " using AA = na::A; using B = na::Base;\n"
+ " using AA = ::na::A; using B = ::na::Base;\n"
" using Base::m; using Base::Base;\n"
"};"
"} // namespace y\n"
"namespace x {\n"
"namespace y {\n"
"class C_X {\n"
- " na::C_A na;\n"
- " na::C_A::Nested nested;\n"
+ " ::na::C_A na;\n"
+ " ::na::C_A::Nested nested;\n"
" void f() {\n"
- " na::C_A::Nested::nestedFunc();\n"
- " int X = na::C_A::Nested::NestedX;\n"
+ " ::na::C_A::Nested::nestedFunc();\n"
+ " int X = ::na::C_A::Nested::NestedX;\n"
" }\n"
"};\n"
"} // namespace y\n"
"} // namespace na\n"
"namespace x {\n"
"namespace y {\n"
- "void f() { na::a_f(); na::static_f(); na::A::f(); }\n"
- "void g() { f(); na::A::g(); }\n"
+ "void f() { ::na::a_f(); ::na::static_f(); ::na::A::f(); }\n"
+ "void g() { f(); ::na::A::g(); }\n"
"} // namespace y\n"
"} // namespace x\n";
EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
"static void s_f() {}\n"
"namespace nb {\n"
"void f() {\n"
- "auto *ref1 = A::f; auto *ref2 = a_f; auto *ref3 = s_f;\n"
+ " auto *ref1 = A::f;\n"
+ " auto *ref2 = a_f;\n"
+ " auto *ref3 = s_f;\n"
"}\n"
"} // namespace nb\n"
"} // namespace na\n";
"namespace x {\n"
"namespace y {\n"
"void f() {\n"
- "auto *ref1 = na::A::f; auto *ref2 = na::a_f; auto *ref3 = na::s_f;\n"
+ " auto *ref1 = ::na::A::f;\n"
+ " auto *ref2 = ::na::a_f;\n"
+ " auto *ref3 = ::na::s_f;\n"
"}\n"
"} // namespace y\n"
"} // namespace x\n";
"namespace y {\n"
"int GlobB;\n"
"void f() {\n"
- " int a = na::GlobA;\n"
- " int b = na::GlobAStatic;\n"
- " int c = na::nc::GlobC;\n"
+ " int a = ::na::GlobA;\n"
+ " int b = ::na::GlobAStatic;\n"
+ " int c = ::na::nc::GlobC;\n"
"}\n"
"} // namespace y\n"
"} // namespace x\n";
"};\n"
"int A::A1 = 0;\n"
"namespace nb {\n"
- "void f() { int a = A::A1; int b = A::A2; }"
+ "void f() {\n"
+ " int a = A::A1; int b = A::A2;\n"
+ "}\n"
"} // namespace nb\n"
"} // namespace na\n";
"} // namespace na\n"
"namespace x {\n"
"namespace y {\n"
- "void f() { int a = na::A::A1; int b = na::A::A2; }"
+ "void f() {\n"
+ " int a = ::na::A::A1; int b = ::na::A::A2;\n"
+ "}\n"
"} // namespace y\n"
"} // namespace x\n";
"} // na\n"
"namespace x {\n"
"namespace y {\n"
- "void d() { nx::f(); }\n"
+ "void d() { ::nx::f(); }\n"
"} // namespace y\n"
"} // namespace x\n";
EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
"} // c\n"
"namespace x {\n"
"namespace y {\n"
- "void d() { f(); nx::g(); }\n"
+ "void d() { f(); ::nx::g(); }\n"
"} // namespace y\n"
"} // namespace x\n"
"} // b\n"
" A() : X(0) {}\n"
" A(int i);\n"
"};\n"
- "A::A(int i) : X(i) { nx::ny::X x(1);}\n"
+ "A::A(int i) : X(i) { ::nx::ny::X x(1);}\n"
"} // namespace y\n"
"} // namespace x\n";
EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
}
+TEST_F(ChangeNamespaceTest, KeepGlobalSpecifier) {
+ std::string Code = "class Glob {};\n"
+ "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"
+ " ::Glob glob_1;\n"
+ " Glob glob_2;\n"
+ " C_A a_1;\n"
+ " ::na::C_A a_2;\n"
+ " nc::C_C c;\n"
+ "};\n"
+ "} // namespace nb\n"
+ "} // namespace na\n";
+ std::string Expected = "class Glob {};\n"
+ "namespace na {\n"
+ "class C_A {};\n"
+ "namespace nc {\n"
+ "class C_C {};"
+ "} // namespace nc\n"
+ "\n"
+ "} // namespace na\n"
+ "namespace x {\n"
+ "namespace y {\n"
+ "class C_X {\n"
+ "public:\n"
+ " ::Glob glob_1;\n"
+ " Glob glob_2;\n"
+ " ::na::C_A a_1;\n"
+ " ::na::C_A a_2;\n"
+ " ::na::nc::C_C c;\n"
+ "};\n"
+ "} // namespace y\n"
+ "} // namespace x\n";
+ EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
+}
+
} // anonymous namespace
} // namespace change_namespace
} // namespace clang