1 //===-- ChangeNamespaceTests.cpp - Change namespace unit tests ---*- C++ -*-===//
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
9 #include "ChangeNamespace.h"
10 #include "unittests/Tooling/RewriterTestContext.h"
11 #include "clang/ASTMatchers/ASTMatchFinder.h"
12 #include "clang/Basic/FileManager.h"
13 #include "clang/Basic/FileSystemOptions.h"
14 #include "clang/Format/Format.h"
15 #include "clang/Frontend/CompilerInstance.h"
16 #include "clang/Frontend/PCHContainerOperations.h"
17 #include "clang/Tooling/Refactoring.h"
18 #include "clang/Tooling/Tooling.h"
19 #include "llvm/ADT/IntrusiveRefCntPtr.h"
20 #include "llvm/ADT/StringRef.h"
21 #include "llvm/Support/MemoryBuffer.h"
22 #include "llvm/Support/VirtualFileSystem.h"
23 #include "gtest/gtest.h"
29 namespace change_namespace
{
32 class ChangeNamespaceTest
: public ::testing::Test
{
34 std::string
runChangeNamespaceOnCode(llvm::StringRef Code
) {
35 clang::RewriterTestContext Context
;
36 clang::FileID ID
= Context
.createInMemoryFile(FileName
, Code
);
38 std::map
<std::string
, tooling::Replacements
> FileToReplacements
;
39 change_namespace::ChangeNamespaceTool
NamespaceTool(
40 OldNamespace
, NewNamespace
, FilePattern
,
41 /*AllowedSymbolPatterns*/ {}, &FileToReplacements
);
42 ast_matchers::MatchFinder Finder
;
43 NamespaceTool
.registerMatchers(&Finder
);
44 std::unique_ptr
<tooling::FrontendActionFactory
> Factory
=
45 tooling::newFrontendActionFactory(&Finder
);
46 if (!tooling::runToolOnCodeWithArgs(Factory
->create(), Code
, {"-std=c++11"},
49 formatAndApplyAllReplacements(FileToReplacements
, Context
.Rewrite
);
50 return format(Context
.getRewrittenText(ID
));
53 std::string
format(llvm::StringRef Code
) {
54 tooling::Replacements Replaces
= format::reformat(
55 format::getLLVMStyle(), Code
, {tooling::Range(0, Code
.size())});
56 auto ChangedCode
= tooling::applyAllReplacements(Code
, Replaces
);
57 EXPECT_TRUE(static_cast<bool>(ChangedCode
));
59 llvm::errs() << llvm::toString(ChangedCode
.takeError());
66 std::string FileName
= "input.cc";
67 std::string OldNamespace
= "na::nb";
68 std::string NewNamespace
= "x::y";
69 std::string FilePattern
= "input.cc";
72 TEST_F(ChangeNamespaceTest
, NoMatchingNamespace
) {
73 std::string Code
= "namespace na {\n"
77 "} // namespace na\n";
78 std::string Expected
= "namespace na {\n"
82 "} // namespace na\n";
83 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
86 TEST_F(ChangeNamespaceTest
, SimpleMoveWithoutTypeRefs
) {
87 std::string Code
= "namespace na {\n"
91 "} // namespace na\n";
92 std::string Expected
= "\n\n"
98 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
101 TEST_F(ChangeNamespaceTest
, NewNsNestedInOldNs
) {
102 NewNamespace
= "na::nb::nc";
103 std::string Code
= "namespace na {\n"
106 "} // namespace nb\n"
107 "} // namespace na\n";
108 std::string Expected
= "namespace na {\n"
112 "} // namespace nc\n"
113 "} // namespace nb\n"
114 "} // namespace na\n";
115 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
118 TEST_F(ChangeNamespaceTest
, NewNsNestedInOldNsWithSurroundingNewLines
) {
119 NewNamespace
= "na::nb::nc";
120 std::string Code
= "namespace na {\n"
125 "} // namespace nb\n"
126 "} // namespace na\n";
127 std::string Expected
= "namespace na {\n"
133 "} // namespace nc\n"
134 "} // namespace nb\n"
135 "} // namespace na\n";
136 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
139 TEST_F(ChangeNamespaceTest
, MoveOldNsWithSurroundingNewLines
) {
140 NewNamespace
= "nx::ny";
141 std::string Code
= "namespace na {\n"
146 "} // namespace nb\n"
147 "} // namespace na\n";
148 std::string Expected
= "\n\n"
154 "} // namespace ny\n"
155 "} // namespace nx\n";
156 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
159 TEST_F(ChangeNamespaceTest
, NewNsNestedInOldNsWithRefs
) {
160 NewNamespace
= "na::nb::nc";
161 std::string Code
= "namespace na {\n"
166 "void f() { A a; B b; }\n"
167 "} // namespace nb\n"
168 "} // namespace na\n";
169 std::string Expected
= "namespace na {\n"
175 "void f() { A a; B b; }\n"
176 "} // namespace nc\n"
177 "} // namespace nb\n"
178 "} // namespace na\n";
179 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
182 TEST_F(ChangeNamespaceTest
, SimpleMoveIntoAnotherNestedNamespace
) {
183 NewNamespace
= "na::nc";
184 std::string Code
= "namespace na {\n"
187 "} // namespace nb\n"
188 "} // namespace na\n";
189 std::string Expected
= "namespace na {\n"
193 "} // namespace nc\n"
194 "} // namespace na\n";
195 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
198 TEST_F(ChangeNamespaceTest
, MoveIntoAnotherNestedNamespaceWithRef
) {
199 NewNamespace
= "na::nc";
200 std::string Code
= "namespace na {\n"
203 "class X { A a; };\n"
204 "} // namespace nb\n"
205 "} // namespace na\n";
206 std::string Expected
= "namespace na {\n"
210 "class X { A a; };\n"
211 "} // namespace nc\n"
212 "} // namespace na\n";
213 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
216 TEST_F(ChangeNamespaceTest
, MoveIntoExistingNamespaceAndShortenRefs
) {
217 std::string Code
= "namespace x {\n"
228 "class X { A a; x::z::Z zz; x::y::T t; };\n"
229 "} // namespace nb\n"
230 "} // namespace na\n";
231 std::string Expected
= "namespace x {\n"
241 "} // namespace na\n"
244 "class X { na::A a; z::Z zz; T t; };\n"
246 "} // namespace x\n";
247 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
250 TEST_F(ChangeNamespaceTest
, SimpleMoveNestedNamespace
) {
251 NewNamespace
= "na::x::y";
252 std::string Code
= "namespace na {\n"
256 "} // namespace nb\n"
257 "} // namespace na\n";
258 std::string Expected
= "namespace na {\n"
266 "} // namespace na\n";
267 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
270 TEST_F(ChangeNamespaceTest
, SimpleMoveWithTypeRefs
) {
271 std::string Code
= "namespace na {\n"
275 "} // namespace nc\n"
285 "} // namespace nb\n"
286 "} // namespace na\n";
287 std::string Expected
= "namespace na {\n"
291 "} // namespace nc\n"
293 "} // namespace na\n"
305 "} // namespace x\n";
306 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
309 TEST_F(ChangeNamespaceTest
, TypeLocInTemplateSpecialization
) {
310 std::string Code
= "namespace na {\n"
312 "template <typename T>\n"
314 "template <typename T1, typename T2>\n"
316 "namespace nc { class C {}; }\n"
324 " Two<A, nc::C> two;\n"
328 std::string Expected
= "namespace na {\n"
330 "template <typename T>\n"
332 "template <typename T1, typename T2>\n"
334 "namespace nc { class C {}; }\n"
342 " na::B<na::nc::C> b_c;\n"
343 " na::Two<na::A, na::nc::C> two;\n"
346 "} // namespace x\n";
347 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
350 TEST_F(ChangeNamespaceTest
, LeaveForwardDeclarationBehind
) {
351 std::string Code
= "namespace na {\n"
358 "} // namespace nb\n"
359 "} // namespace na\n";
360 std::string Expected
= "namespace na {\n"
364 "} // namespace nb\n"
365 "} // namespace na\n"
370 " na::nb::FWD *fwd;\n"
373 "} // namespace x\n";
374 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
377 TEST_F(ChangeNamespaceTest
, InsertForwardDeclsProperly
) {
378 std::string Code
= "namespace na {\n"
387 "} // namespace nb\n"
388 "} // namespace na\n";
389 std::string Expected
= "namespace na {\n"
393 "} // namespace nb\n"
394 "} // namespace na\n"
399 " na::nb::FWD *fwd;\n"
403 "} // namespace x\n";
404 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
407 TEST_F(ChangeNamespaceTest
, TemplateClassForwardDeclaration
) {
408 std::string Code
= "namespace na {\n"
411 "template<typename T> class FWD_TEMP;\n"
415 "template<typename T> class TEMP {};\n"
416 "} // namespace nb\n"
417 "} // namespace na\n";
418 std::string Expected
= "namespace na {\n"
421 "template<typename T> class FWD_TEMP;\n"
422 "} // namespace nb\n"
423 "} // namespace na\n"
428 " na::nb::FWD *fwd;\n"
430 "template<typename T> class TEMP {};\n"
432 "} // namespace x\n";
433 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
436 TEST_F(ChangeNamespaceTest
, DontMoveForwardDeclarationInClass
) {
437 std::string Code
= "namespace na {\n"
442 " template<typename T> class FWD_TEMP;\n"
444 "} // namespace nb\n"
445 "} // namespace na\n";
446 std::string Expected
= "\n\n"
452 " template<typename T> class FWD_TEMP;\n"
455 "} // namespace x\n";
456 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
459 TEST_F(ChangeNamespaceTest
, MoveFunctions
) {
460 std::string Code
= "namespace na {\n"
464 "} // namespace nc\n"
467 "void f(C_A ca, nc::C_C cc) {\n"
470 "} // namespace nb\n"
471 "} // namespace na\n";
473 std::string Expected
= "namespace na {\n"
477 "} // namespace nc\n"
479 "} // namespace na\n"
483 "void f(na::C_A ca, na::nc::C_C cc) {\n"
484 " na::C_A ca_1 = ca;\n"
487 "} // namespace x\n";
488 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
491 TEST_F(ChangeNamespaceTest
, FixUsingShadowDecl
) {
492 std::string Code
= "class GLOB {};\n"
493 "using BLOG = GLOB;\n"
503 "using YO = nd::SAME;\n"
504 "typedef nd::SAME IDENTICAL;\n"
505 "void f(nd::SAME Same) {}\n"
506 "} // namespace nb\n"
507 "} // namespace na\n";
509 std::string Expected
= "class GLOB {};\n"
510 "using BLOG = GLOB;\n"
519 "} // namespace na\n"
522 "using ::na::nc::SAME;\n"
523 "using YO = na::nd::SAME;\n"
524 "typedef na::nd::SAME IDENTICAL;\n"
525 "void f(na::nd::SAME Same) {}\n"
527 "} // namespace x\n";
528 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
531 TEST_F(ChangeNamespaceTest
, DontFixUsingShadowDeclInClasses
) {
532 std::string Code
= "namespace na {\n"
534 "class Base { public: Base() {} void m() {} };\n"
536 "class D : public Base {\n"
538 " using AA = A; using B = Base;\n"
539 " using Base::m; using Base::Base;\n"
541 "} // namespace nb\n"
542 "} // namespace na\n";
544 std::string Expected
= "namespace na {\n"
546 "class Base { public: Base() {} void m() {} };\n"
548 "} // namespace na\n"
551 "class D : public na::Base {\n"
553 " using AA = na::A; using B = na::Base;\n"
554 " using Base::m; using Base::Base;\n"
557 "} // namespace x\n";
558 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
561 TEST_F(ChangeNamespaceTest
, TypeInNestedNameSpecifier
) {
568 " static int NestedX;\n"
569 " static void nestedFunc() {}\n"
575 " C_A::Nested nested;\n"
577 " C_A::Nested::nestedFunc();\n"
578 " int X = C_A::Nested::NestedX;\n"
581 "} // namespace nb\n"
582 "} // namespace na\n";
583 std::string Expected
=
589 " static int NestedX;\n"
590 " static void nestedFunc() {}\n"
594 "} // namespace na\n"
599 " na::C_A::Nested nested;\n"
601 " na::C_A::Nested::nestedFunc();\n"
602 " int X = na::C_A::Nested::NestedX;\n"
606 "} // namespace x\n";
607 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
610 TEST_F(ChangeNamespaceTest
, FixFunctionNameSpecifiers
) {
615 " static void f() {}\n"
616 " static void g();\n"
620 "static void static_f() {}\n"
622 "void f() { a_f(); static_f(); A::f(); }\n"
623 "void g() { f(); A::g(); }\n"
624 "} // namespace nb\n"
625 "} // namespace na\n";
626 std::string Expected
=
630 " static void f() {}\n"
631 " static void g();\n"
635 "static void static_f() {}\n"
637 "} // namespace na\n"
640 "void f() { na::a_f(); na::static_f(); na::A::f(); }\n"
641 "void g() { f(); na::A::g(); }\n"
643 "} // namespace x\n";
644 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
647 TEST_F(ChangeNamespaceTest
, FixOverloadedOperatorFunctionNameSpecifiers
) {
653 " bool operator==(const A &RHS) const { return x == RHS.x; }\n"
655 "bool operator<(const A &LHS, const A &RHS) { return LHS.x == RHS.x; }\n"
659 " auto f = operator<;\n"
660 " return (x == y) && (x < y) && (operator<(x, y));\n"
662 "} // namespace nb\n"
663 "} // namespace na\n";
664 std::string Expected
=
669 " bool operator==(const A &RHS) const { return x == RHS.x; }\n"
671 "bool operator<(const A &LHS, const A &RHS) { return LHS.x == RHS.x; }\n"
673 "} // namespace na\n"
678 " auto f = na::operator<;\n"
679 // FIXME: function calls to overloaded operators are not fixed now even if
680 // they are referenced by qualified names.
681 " return (x == y) && (x < y) && (operator<(x,y));\n"
684 "} // namespace x\n";
685 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
688 TEST_F(ChangeNamespaceTest
, FixNonCallingFunctionReferences
) {
689 std::string Code
= "namespace na {\n"
692 " static void f() {}\n"
695 "static void s_f() {}\n"
698 " auto *ref1 = A::f;\n"
699 " auto *ref2 = a_f;\n"
700 " auto *ref3 = s_f;\n"
702 "} // namespace nb\n"
703 "} // namespace na\n";
704 std::string Expected
=
708 " static void f() {}\n"
711 "static void s_f() {}\n"
713 "} // namespace na\n"
717 " auto *ref1 = na::A::f;\n"
718 " auto *ref2 = na::a_f;\n"
719 " auto *ref3 = na::s_f;\n"
722 "} // namespace x\n";
723 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
726 TEST_F(ChangeNamespaceTest
, MoveAndFixGlobalVariables
) {
727 std::string Code
= "namespace na {\n"
729 "static int GlobAStatic = 0;\n"
730 "namespace nc { int GlobC; }\n"
735 " int b = GlobAStatic;\n"
736 " int c = nc::GlobC;\n"
738 "} // namespace nb\n"
739 "} // namespace na\n";
741 std::string Expected
= "namespace na {\n"
743 "static int GlobAStatic = 0;\n"
744 "namespace nc { int GlobC; }\n"
746 "} // namespace na\n"
751 " int a = na::GlobA;\n"
752 " int b = na::GlobAStatic;\n"
753 " int c = na::nc::GlobC;\n"
756 "} // namespace x\n";
758 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
761 TEST_F(ChangeNamespaceTest
, DoNotFixStaticVariableOfClass
) {
762 std::string Code
= "namespace na {\n"
771 " int a = A::A1; int b = A::A2;\n"
773 "} // namespace nb\n"
774 "} // namespace na\n";
776 std::string Expected
= "namespace na {\n"
784 "} // namespace na\n"
788 " int a = na::A::A1; int b = na::A::A2;\n"
791 "} // namespace x\n";
793 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
796 TEST_F(ChangeNamespaceTest
, NoMisplaceAtEOF
) {
797 std::string Code
= "namespace na {\n"
803 std::string Expected
= "namespace na {\n"
813 "} // namespace x\n";
814 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
817 TEST_F(ChangeNamespaceTest
, CommentsBeforeMovedClass
) {
818 std::string Code
= "namespace na {\n"
821 "// Wild comments.\n"
824 "// More comments.\n"
826 " // Private comments.\n"
831 std::string Expected
= "\n"
836 "// Wild comments.\n"
839 "// More comments.\n"
841 " // Private comments.\n"
845 "} // namespace x\n";
846 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
849 TEST_F(ChangeNamespaceTest
, UsingShadowDeclInGlobal
) {
850 std::string Code
= "namespace glob {\n"
854 "using glob::Glob;\n"
855 "using glob::GFunc;\n"
858 "void f() { Glob g; GFunc(); }\n"
859 "} // namespace nb\n"
860 "} // namespace na\n";
862 std::string Expected
= "namespace glob {\n"
866 "using glob::Glob;\n"
867 "using glob::GFunc;\n"
871 "void f() { Glob g; GFunc(); }\n"
873 "} // namespace x\n";
874 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
877 TEST_F(ChangeNamespaceTest
, UsingShadowDeclsInAnonymousNamespaces
) {
878 std::string Code
= "namespace util {\n"
885 "using ::util::Util;\n"
886 "using ::util::func;\n"
887 "void f() { Util u; func(); }\n"
889 "} // namespace nb\n"
890 "} // namespace na\n";
892 std::string Expected
= "namespace util {\n"
895 "} // namespace util\n"
900 "using ::util::Util;\n"
901 "using ::util::func;\n"
902 "void f() { Util u; func(); }\n"
905 "} // namespace x\n";
906 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
909 TEST_F(ChangeNamespaceTest
, UsingNamespaceInGlobal
) {
910 std::string Code
= "namespace glob {\n"
913 "using namespace glob;\n"
916 "void f() { Glob g; }\n"
917 "} // namespace nb\n"
918 "} // namespace na\n";
920 std::string Expected
= "namespace glob {\n"
923 "using namespace glob;\n"
927 "void f() { Glob g; }\n"
929 "} // namespace x\n";
930 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
933 TEST_F(ChangeNamespaceTest
, NamespaceAliasInGlobal
) {
934 std::string Code
= "namespace glob {\n"
937 "namespace glob2 { class Glob2 {}; }\n"
938 "namespace gl = glob;\n"
939 "namespace gl2 = glob2;\n"
942 "void f() { gl::Glob g; gl2::Glob2 g2; }\n"
943 "} // namespace nb\n"
944 "} // namespace na\n";
946 std::string Expected
=
950 "namespace glob2 { class Glob2 {}; }\n"
951 "namespace gl = glob;\n"
952 "namespace gl2 = glob2;\n"
956 "void f() { gl::Glob g; gl2::Glob2 g2; }\n"
958 "} // namespace x\n";
959 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
962 TEST_F(ChangeNamespaceTest
, NamespaceAliasInNamespace
) {
963 std::string Code
= "namespace glob {\n"
968 "namespace gl = glob;\n"
969 "void f() { gl::Glob g; }\n"
970 "} // namespace nb\n"
971 "} // namespace na\n";
973 std::string Expected
= "namespace glob {\n"
979 "namespace gl = glob;\n"
980 "void f() { gl::Glob g; }\n"
982 "} // namespace x\n";
983 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
986 TEST_F(ChangeNamespaceTest
, NamespaceAliasInAncestorNamespace
) {
987 NewNamespace
= "na::nx";
988 std::string Code
= "namespace glob {\n"
991 "namespace other { namespace gl = glob; }\n"
993 "namespace ga = glob;\n"
995 "void f() { ga::Glob g; }\n"
996 "} // namespace nb\n"
997 "} // namespace na\n";
999 std::string Expected
= "namespace glob {\n"
1002 "namespace other { namespace gl = glob; }\n"
1004 "namespace ga = glob;\n"
1007 "void f() { ga::Glob g; }\n"
1008 "} // namespace nx\n"
1009 "} // namespace na\n";
1010 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1013 TEST_F(ChangeNamespaceTest
, NamespaceAliasInOtherNamespace
) {
1014 std::string Code
= "namespace glob {\n"
1017 "namespace other { namespace gl = glob; }\n"
1019 "namespace ga = glob;\n"
1021 "void f() { glob::Glob g; }\n"
1022 "} // namespace nb\n"
1023 "} // namespace na\n";
1025 std::string Expected
= "namespace glob {\n"
1028 "namespace other { namespace gl = glob; }\n"
1030 "namespace ga = glob;\n"
1032 "} // namespace na\n"
1035 "void f() { glob::Glob g; }\n"
1036 "} // namespace y\n"
1037 "} // namespace x\n";
1038 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1041 TEST_F(ChangeNamespaceTest
, UsingDeclAfterReference
) {
1042 std::string Code
= "namespace glob {\n"
1047 "void f() { glob::Glob g; }\n"
1048 "} // namespace nb\n"
1049 "} // namespace na\n"
1050 "using glob::Glob;\n"
1051 "using namespace glob;\n";
1053 std::string Expected
= "namespace glob {\n"
1059 "void f() { glob::Glob g; }\n"
1060 "} // namespace y\n"
1061 "} // namespace x\n"
1062 "using glob::Glob;\n"
1063 "using namespace glob;\n";
1064 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1067 TEST_F(ChangeNamespaceTest
, UsingNamespaceAfterReference
) {
1068 NewNamespace
= "na::nc";
1069 std::string Code
= "namespace glob {\n"
1074 "void f() { glob::Glob g; }\n"
1075 "} // namespace nb\n"
1076 "using namespace glob;\n"
1077 "} // namespace na\n";
1079 std::string Expected
= "namespace glob {\n"
1085 "void f() { glob::Glob g; }\n"
1086 "} // namespace nc\n"
1087 "using namespace glob;\n"
1088 "} // namespace na\n";
1089 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1092 TEST_F(ChangeNamespaceTest
, UsingNamespaceAndUsingShadowInGlobal
) {
1093 std::string Code
= "namespace glob1 {\n"
1094 "namespace glob2 {\n"
1098 "using glob1::glob2::Glob;\n"
1099 "using namespace glob1;\n"
1102 "void f() { Glob g; }\n"
1103 "} // namespace nb\n"
1104 "} // namespace na\n";
1106 std::string Expected
= "namespace glob1 {\n"
1107 "namespace glob2 {\n"
1111 "using glob1::glob2::Glob;\n"
1112 "using namespace glob1;\n"
1116 "void f() { Glob g; }\n"
1117 "} // namespace y\n"
1118 "} // namespace x\n";
1119 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1122 TEST_F(ChangeNamespaceTest
, UsingAliasInGlobal
) {
1123 std::string Code
= "namespace glob {\n"
1126 "using GLB = glob::Glob;\n"
1127 "using BLG = glob::Glob;\n"
1130 "void f() { GLB g; BLG blg; }\n"
1131 "} // namespace nb\n"
1132 "} // namespace na\n";
1134 std::string Expected
= "namespace glob {\n"
1137 "using GLB = glob::Glob;\n"
1138 "using BLG = glob::Glob;\n"
1142 "void f() { GLB g; BLG blg; }\n"
1143 "} // namespace y\n"
1144 "} // namespace x\n";
1145 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1148 TEST_F(ChangeNamespaceTest
, UsingShadowDeclAndMovedNamespace
) {
1149 std::string Code
= "namespace na { class C_A {};\n }\n"
1157 "} // namespace nb\n"
1158 "} // namespace na\n";
1159 std::string Expected
= "namespace na { class C_A {};\n }\n"
1168 "} // namespace y\n"
1169 "} // namespace x\n";
1170 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1173 TEST_F(ChangeNamespaceTest
, UsingNamespaceDeclAndMovedNamespace
) {
1174 std::string Code
= "namespace na { class C_A {};\n }\n"
1175 "using namespace na;\n"
1182 "} // namespace nb\n"
1183 "} // namespace na\n";
1184 std::string Expected
= "namespace na { class C_A {};\n }\n"
1185 "using namespace na;\n"
1193 "} // namespace y\n"
1194 "} // namespace x\n";
1195 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1198 TEST_F(ChangeNamespaceTest
, UsingShadowDeclInFunction
) {
1199 std::string Code
= "namespace glob {\n"
1205 " using glob::Glob;\n"
1208 "} // namespace nb\n"
1209 "} // namespace na\n";
1211 std::string Expected
= "namespace glob {\n"
1218 " using ::glob::Glob;\n"
1221 "} // namespace y\n"
1222 "} // namespace x\n";
1223 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1226 TEST_F(ChangeNamespaceTest
, UsingShadowDeclInClass
) {
1227 std::string Code
= "namespace na { class C_A {}; }\n"
1231 " using ::na::C_A;\n"
1234 "} // namespace nb\n"
1235 "} // namespace na\n";
1236 std::string Expected
= "namespace na { class C_A {}; }\n"
1241 " using ::na::C_A;\n"
1244 "} // namespace y\n"
1245 "} // namespace x\n";
1246 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1249 TEST_F(ChangeNamespaceTest
, UsingDeclInMovedNamespace
) {
1250 std::string Code
= "namespace nx { void f(); }\n"
1254 "void d() { f(); }\n"
1258 std::string Expected
= "namespace nx { void f(); }\n"
1265 "void d() { nx::f(); }\n"
1266 "} // namespace y\n"
1267 "} // namespace x\n";
1268 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1271 TEST_F(ChangeNamespaceTest
, UsingDeclInMovedNamespaceNotNested
) {
1272 OldNamespace
= "na";
1273 std::string Code
= "namespace nx { void f(); }\n"
1276 "void d() { f(); }\n"
1279 std::string Expected
= "namespace nx { void f(); }\n"
1284 "void d() { f(); }\n"
1285 "} // namespace y\n"
1286 "} // namespace x\n";
1287 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1290 TEST_F(ChangeNamespaceTest
, UsingDeclInMovedNamespaceMultiNested
) {
1291 OldNamespace
= "a::b::c::d";
1292 NewNamespace
= "a::b::x::y";
1293 std::string Code
= "namespace nx { void f(); void g(); }\n"
1300 "void d() { f(); g(); }\n"
1306 std::string Expected
= "namespace nx { void f(); void g(); }\n"
1316 "void d() { f(); nx::g(); }\n"
1317 "} // namespace y\n"
1318 "} // namespace x\n"
1321 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1324 TEST_F(ChangeNamespaceTest
, UsingShadowDeclInTheParentOfOldNamespace
) {
1325 OldNamespace
= "nb::nc";
1326 NewNamespace
= "nb::nd";
1327 std::string Code
= "namespace na { class A {}; }\n"
1331 "void d() { A a; }\n"
1335 std::string Expected
= "namespace na { class A {}; }\n"
1340 "void d() { A a; }\n"
1341 "} // namespace nd\n"
1343 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1346 TEST_F(ChangeNamespaceTest
, UsingShadowDeclInOldNamespace
) {
1347 OldNamespace
= "nb";
1348 NewNamespace
= "nc";
1349 std::string Code
= "namespace na { class A {}; }\n"
1352 "void d() { A a; }\n"
1353 "struct X { A a; };\n"
1356 std::string Expected
= "namespace na { class A {}; }\n"
1360 "void d() { A a; }\n"
1361 "struct X { A a; };\n"
1362 "} // namespace nc\n";
1363 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1366 TEST_F(ChangeNamespaceTest
, UsingShadowDeclOfTemplateClass
) {
1367 OldNamespace
= "nb";
1368 NewNamespace
= "nc";
1369 std::string Code
= "namespace na {\n"
1370 "template <typename T>\n"
1371 "class A { T t; };\n"
1372 "} // namespace na\n"
1375 "void d() { A<int> a; }\n"
1378 std::string Expected
= "namespace na {\n"
1379 "template <typename T>\n"
1380 "class A { T t; };\n"
1381 "} // namespace na\n"
1385 "void d() { A<int> a; }\n"
1386 "} // namespace nc\n";
1387 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1390 TEST_F(ChangeNamespaceTest
, UsingShadowDeclOfTemplateFunction
) {
1391 OldNamespace
= "nb";
1392 NewNamespace
= "nc";
1393 std::string Code
= "namespace na {\n"
1394 "template <typename T>\n"
1395 "void f() { T t; };\n"
1396 "} // namespace na\n"
1399 "void d() { f<int>(); }\n"
1402 std::string Expected
= "namespace na {\n"
1403 "template <typename T>\n"
1404 "void f() { T t; };\n"
1405 "} // namespace na\n"
1409 "void d() { f<int>(); }\n"
1410 "} // namespace nc\n";
1411 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1414 TEST_F(ChangeNamespaceTest
, UsingAliasDecl
) {
1416 "namespace nx { namespace ny { class X {}; } }\n"
1419 "using Y = nx::ny::X;\n"
1420 "void f() { Y y; }\n"
1421 "} // namespace nb\n"
1422 "} // namespace na\n";
1424 std::string Expected
= "namespace nx { namespace ny { class X {}; } }\n"
1428 "using Y = nx::ny::X;\n"
1429 "void f() { Y y; }\n"
1430 "} // namespace y\n"
1431 "} // namespace x\n";
1432 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1435 TEST_F(ChangeNamespaceTest
, UsingAliasDeclInGlobal
) {
1437 "namespace nx { namespace ny { class X {}; } }\n"
1438 "using Y = nx::ny::X;\n"
1441 "void f() { Y y; }\n"
1442 "} // namespace nb\n"
1443 "} // namespace na\n";
1445 std::string Expected
= "namespace nx { namespace ny { class X {}; } }\n"
1446 "using Y = nx::ny::X;\n"
1450 "void f() { Y y; }\n"
1451 "} // namespace y\n"
1452 "} // namespace x\n";
1453 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1457 TEST_F(ChangeNamespaceTest
, TypedefAliasDecl
) {
1459 "namespace nx { namespace ny { class X {}; } }\n"
1462 "typedef nx::ny::X Y;\n"
1463 "void f() { Y y; }\n"
1464 "} // namespace nb\n"
1465 "} // namespace na\n";
1467 std::string Expected
= "namespace nx { namespace ny { class X {}; } }\n"
1471 "typedef nx::ny::X Y;\n"
1472 "void f() { Y y; }\n"
1473 "} // namespace y\n"
1474 "} // namespace x\n";
1475 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1478 TEST_F(ChangeNamespaceTest
, DerivedClassWithConstructors
) {
1480 "namespace nx { namespace ny { class X { public: X(int i) {} }; } }\n"
1483 "class A : public nx::ny::X {\n"
1488 "A::A(int i) : X(i) {}\n"
1489 "} // namespace nb\n"
1490 "} // namespace na\n";
1491 std::string Expected
=
1492 "namespace nx { namespace ny { class X { public: X(int i) {} }; } }\n"
1496 "class A : public nx::ny::X {\n"
1501 "A::A(int i) : X(i) {}\n"
1502 "} // namespace y\n"
1503 "} // namespace x\n";
1504 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1507 TEST_F(ChangeNamespaceTest
, DerivedClassWithQualifiedConstructors
) {
1509 "namespace nx { namespace ny { class X { public: X(int i) {} }; } }\n"
1512 "class A : public nx::ny::X {\n"
1514 " A() : X::X(0) {}\n"
1517 "A::A(int i) : X::X(i) {}\n"
1518 "} // namespace nb\n"
1519 "} // namespace na\n";
1520 std::string Expected
=
1521 "namespace nx { namespace ny { class X { public: X(int i) {} }; } }\n"
1525 "class A : public nx::ny::X {\n"
1527 " A() : X::X(0) {}\n"
1530 "A::A(int i) : X::X(i) {}\n"
1531 "} // namespace y\n"
1532 "} // namespace x\n";
1533 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1536 TEST_F(ChangeNamespaceTest
, DerivedClassWithConstructorsAndTypeRefs
) {
1538 "namespace nx { namespace ny { class X { public: X(int i) {} }; } }\n"
1541 "class A : public nx::ny::X {\n"
1546 "A::A(int i) : X(i) { X x(1);}\n"
1547 "} // namespace nb\n"
1548 "} // namespace na\n";
1549 std::string Expected
=
1550 "namespace nx { namespace ny { class X { public: X(int i) {} }; } }\n"
1554 "class A : public nx::ny::X {\n"
1559 "A::A(int i) : X(i) { nx::ny::X x(1);}\n"
1560 "} // namespace y\n"
1561 "} // namespace x\n";
1562 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1565 TEST_F(ChangeNamespaceTest
, MoveToGlobalNamespace
) {
1567 std::string Code
= "namespace na {\n"
1571 "} // namespace nc\n"
1581 "} // namespace nb\n"
1582 "} // namespace na\n";
1583 std::string Expected
= "namespace na {\n"
1587 "} // namespace nc\n"
1589 "} // namespace na\n"
1598 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1601 TEST_F(ChangeNamespaceTest
, KeepGlobalSpecifier
) {
1602 std::string Code
= "class Glob {};\n"
1607 "} // namespace nc\n"
1617 "} // namespace nb\n"
1618 "} // namespace na\n";
1619 std::string Expected
= "class Glob {};\n"
1624 "} // namespace nc\n"
1626 "} // namespace na\n"
1637 "} // namespace y\n"
1638 "} // namespace x\n";
1639 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1642 TEST_F(ChangeNamespaceTest
, UsingAliasInTemplate
) {
1643 NewNamespace
= "na::nb::nc";
1644 std::string Code
= "namespace some_ns {\n"
1645 "template <typename T, typename S>\n"
1647 "} // namespace some_ns\n"
1649 "template<typename P>\n"
1650 "using GG = some_ns::G<int, P>;\n"
1651 "} // namespace na\n"
1657 "} // namespace nb\n"
1658 "} // namespace na\n";
1659 std::string Expected
= "namespace some_ns {\n"
1660 "template <typename T, typename S>\n"
1662 "} // namespace some_ns\n"
1664 "template<typename P>\n"
1665 "using GG = some_ns::G<int, P>;\n"
1666 "} // namespace na\n"
1673 "} // namespace nc\n"
1674 "} // namespace nb\n"
1675 "} // namespace na\n";
1676 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1679 TEST_F(ChangeNamespaceTest
, TemplateUsingAliasInBaseClass
) {
1680 NewNamespace
= "na::nb::nc";
1681 std::string Code
= "namespace some_ns {\n"
1682 "template <typename T, typename S>\n"
1684 "} // namespace some_ns\n"
1688 " template<typename P>\n"
1689 " using GG = some_ns::G<int, P>;\n"
1691 " struct Nested {};\n"
1693 "class Derived : public Base {};\n"
1694 "} // namespace na\n"
1698 " Derived::GG<float> g;\n"
1699 " const Derived::GG<int> gg;\n"
1700 " const Derived::GG<int>* gg_ptr;\n"
1701 " struct Derived::Nested nested;\n"
1702 " const struct Derived::Nested *nested_ptr;\n"
1704 "} // namespace nb\n"
1705 "} // namespace na\n";
1706 std::string Expected
= "namespace some_ns {\n"
1707 "template <typename T, typename S>\n"
1709 "} // namespace some_ns\n"
1713 " template<typename P>\n"
1714 " using GG = some_ns::G<int, P>;\n"
1716 " struct Nested {};\n"
1718 "class Derived : public Base {};\n"
1719 "} // namespace na\n"
1724 " Derived::GG<float> g;\n"
1725 " const Derived::GG<int> gg;\n"
1726 " const Derived::GG<int>* gg_ptr;\n"
1727 " struct Derived::Nested nested;\n"
1728 " const struct Derived::Nested *nested_ptr;\n"
1730 "} // namespace nc\n"
1731 "} // namespace nb\n"
1732 "} // namespace na\n";
1733 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1736 TEST_F(ChangeNamespaceTest
, ExistingNamespaceConflictWithNewNamespace
) {
1737 OldNamespace
= "nx";
1738 NewNamespace
= "ny::na::nc";
1739 std::string Code
= "namespace na {\n"
1741 "} // namespace na\n"
1744 "} // namespace nb\n"
1747 " na::A a; nb::B b;\n"
1749 "} // namespace nx\n";
1750 std::string Expected
= "namespace na {\n"
1752 "} // namespace na\n"
1755 "} // namespace nb\n"
1761 " ::na::A a; nb::B b;\n"
1763 "} // namespace nc\n"
1764 "} // namespace na\n"
1765 "} // namespace ny\n";
1766 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1769 TEST_F(ChangeNamespaceTest
, SymbolConflictWithNewNamespace
) {
1770 OldNamespace
= "nx";
1771 NewNamespace
= "ny::na::nc";
1772 std::string Code
= "namespace na {\n"
1776 "} // namespace nb\n"
1777 "} // namespace na\n"
1783 " na::A a; na::nb::B b;\n"
1786 "} // namespace nx\n";
1787 std::string Expected
= "namespace na {\n"
1791 "} // namespace nb\n"
1792 "} // namespace na\n"
1801 " ::na::A a; ::na::nb::B b;\n"
1804 "} // namespace nc\n"
1805 "} // namespace na\n"
1806 "} // namespace ny\n";
1807 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1810 TEST_F(ChangeNamespaceTest
, ShortenNamespaceSpecifier
) {
1811 OldNamespace
= "nx";
1812 NewNamespace
= "ny::na";
1813 std::string Code
= "class G {};\n"
1818 "namespace nc { class C {}; } // namespace nc\n"
1819 "}\n // namespace na\n"
1820 "}\n // namespace ny\n"
1823 " G g; ny::Y y; ny::na::A a; ny::na::nc::C c;\n"
1825 "} // namespace nx\n";
1826 std::string Expected
= "class G {};\n"
1831 "namespace nc { class C {}; } // namespace nc\n"
1832 "}\n // namespace na\n"
1833 "}\n // namespace ny\n"
1838 " G g; Y y; A a; nc::C c;\n"
1840 "} // namespace na\n"
1841 "} // namespace ny\n";
1842 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1845 TEST_F(ChangeNamespaceTest
, ShortenNamespaceSpecifierInAnonymousNamespace
) {
1846 OldNamespace
= "nx";
1847 NewNamespace
= "ny::na";
1848 std::string Code
= "class G {};\n"
1853 "namespace nc { class C {}; } // namespace nc\n"
1854 "}\n // namespace na\n"
1855 "}\n // namespace ny\n"
1859 " G g; ::ny::Y y; ::ny::na::A a; ::ny::na::nc::C c;\n"
1862 "} // namespace nx\n";
1863 std::string Expected
= "class G {};\n"
1868 "namespace nc { class C {}; } // namespace nc\n"
1869 "}\n // namespace na\n"
1870 "}\n // namespace ny\n"
1876 " G g; Y y; A a; nc::C c;\n"
1879 "} // namespace na\n"
1880 "} // namespace ny\n";
1881 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1884 TEST_F(ChangeNamespaceTest
, SimpleMoveEnum
) {
1885 std::string Code
= "namespace na {\n"
1887 "enum class X { X1, X2 };\n"
1888 "enum Y { Y1, Y2 };\n"
1889 "} // namespace nb\n"
1890 "} // namespace na\n";
1891 std::string Expected
= "\n\nnamespace x {\n"
1893 "enum class X { X1, X2 };\n"
1894 "enum Y { Y1, Y2 };\n"
1895 "} // namespace y\n"
1896 "} // namespace x\n";
1898 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1901 TEST_F(ChangeNamespaceTest
, ReferencesToEnums
) {
1902 std::string Code
= "enum Glob { G1, G2 };\n"
1904 "enum class X { X1 };\n"
1905 "enum Y { Y1, Y2 };\n"
1908 " Glob g1 = Glob::G1;\n"
1914 "} // namespace nb\n"
1915 "} // namespace na\n";
1916 std::string Expected
= "enum Glob { G1, G2 };\n"
1918 "enum class X { X1 };\n"
1919 "enum Y { Y1, Y2 };\n"
1921 "} // namespace na\n"
1925 " Glob g1 = Glob::G1;\n"
1927 " na::X x1 = na::X::X1;\n"
1928 " na::Y y1 = na::Y::Y1;\n"
1929 " na::Y y2 = na::Y2;\n"
1931 "} // namespace y\n"
1932 "} // namespace x\n";
1934 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1937 TEST_F(ChangeNamespaceTest
, NoRedundantEnumUpdate
) {
1938 std::string Code
= "namespace ns {\n"
1939 "enum class X { X1 };\n"
1940 "enum Y { Y1, Y2 };\n"
1941 "} // namespace ns\n"
1945 " ns::X x1 = ns::X::X1;\n"
1946 " ns::Y y1 = ns::Y::Y1;\n"
1947 " ns::Y y2 = ns::Y2;\n"
1949 "} // namespace nb\n"
1950 "} // namespace na\n";
1951 std::string Expected
= "namespace ns {\n"
1952 "enum class X { X1 };\n"
1953 "enum Y { Y1, Y2 };\n"
1954 "} // namespace ns\n"
1959 " ns::X x1 = ns::X::X1;\n"
1960 " ns::Y y1 = ns::Y::Y1;\n"
1961 " ns::Y y2 = ns::Y2;\n"
1963 "} // namespace y\n"
1964 "} // namespace x\n";
1967 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
1970 TEST_F(ChangeNamespaceTest
, EnumsAndUsingShadows
) {
1971 std::string Code
= "namespace ns {\n"
1972 "enum class X { X1 };\n"
1973 "enum Y { Y1, Y2, Y3 };\n"
1974 "} // namespace ns\n"
1977 "using ns::Y::Y2;\n"
1978 "using ns::Y::Y3;\n"
1987 "} // namespace nb\n"
1988 "} // namespace na\n";
1989 std::string Expected
= "namespace ns {\n"
1990 "enum class X { X1 };\n"
1991 "enum Y { Y1, Y2, Y3 };\n"
1992 "} // namespace ns\n"
1995 "using ns::Y::Y2;\n"
1996 "using ns::Y::Y3;\n"
2006 "} // namespace y\n"
2007 "} // namespace x\n";
2009 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
2012 TEST_F(ChangeNamespaceTest
, EnumsAndAliases
) {
2013 std::string Code
= "namespace ns {\n"
2014 "enum class X { X1 };\n"
2015 "enum Y { Y1, Y2, Y3 };\n"
2016 "} // namespace ns\n"
2017 "typedef ns::X TX;\n"
2018 "typedef ns::Y TY;\n"
2019 "using UX = ns::X;\n"
2020 "using UY = ns::Y;\n"
2024 " ns::X x1 = ns::X::X1;\n"
2025 " TX tx1 = TX::X1;\n"
2026 " UX ux1 = UX::X1;\n"
2027 " ns::Y y1 = ns::Y::Y1;\n"
2028 " TY ty1 = TY::Y1;\n"
2029 " UY uy1 = UY::Y1;\n"
2031 "} // namespace nb\n"
2032 "} // namespace na\n";
2033 std::string Expected
= "namespace ns {\n"
2034 "enum class X { X1 };\n"
2035 "enum Y { Y1, Y2, Y3 };\n"
2036 "} // namespace ns\n"
2037 "typedef ns::X TX;\n"
2038 "typedef ns::Y TY;\n"
2039 "using UX = ns::X;\n"
2040 "using UY = ns::Y;\n"
2045 " ns::X x1 = ns::X::X1;\n"
2046 " TX tx1 = TX::X1;\n"
2047 " UX ux1 = UX::X1;\n"
2048 " ns::Y y1 = ns::Y::Y1;\n"
2049 " TY ty1 = TY::Y1;\n"
2050 " UY uy1 = UY::Y1;\n"
2052 "} // namespace y\n"
2053 "} // namespace x\n";
2055 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
2058 TEST_F(ChangeNamespaceTest
, EnumInClass
) {
2059 std::string Code
= "namespace na {\n"
2060 "struct X { enum E { E1 }; };\n"
2063 " X::E e = X::E1;\n"
2064 " X::E ee = X::E::E1;\n"
2066 "} // namespace nb\n"
2067 "} // namespace na\n";
2068 std::string Expected
= "namespace na {\n"
2069 "struct X { enum E { E1 }; };\n"
2071 "} // namespace na\n"
2075 " na::X::E e = na::X::E1;\n"
2076 " na::X::E ee = na::X::E::E1;\n"
2078 "} // namespace y\n"
2079 "} // namespace x\n";
2081 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
2084 TEST_F(ChangeNamespaceTest
, TypeAsTemplateParameter
) {
2085 std::string Code
= "namespace na {\n"
2088 "template <typename TT>\n"
2089 "void TempTemp(const TT& t) {\n"
2092 "template <typename T>\n"
2093 "void Temp(const T& t) {\n"
2102 "} // namespace nb\n"
2103 "} // namespace na\n";
2104 std::string Expected
= "namespace na {\n"
2107 "} // namespace na\n"
2110 "template <typename TT>\n"
2111 "void TempTemp(const TT& t) {\n"
2114 "template <typename T>\n"
2115 "void Temp(const T& t) {\n"
2124 "} // namespace y\n"
2125 "} // namespace x\n";
2127 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
2130 TEST_F(ChangeNamespaceTest
, DefaultMoveConstructors
) {
2131 std::string Code
= "namespace na {\n"
2135 " // Allow move only.\n"
2136 " B(B&&) = default;\n"
2137 " B& operator=(B&&) = default;\n"
2138 " B(const B&) = delete;\n"
2139 " B& operator=(const B&) = delete;\n"
2143 "} // namespace na\n"
2149 " A(A&&) = default;\n"
2150 " A& operator=(A&&) = default;\n"
2153 " A(const A&) = delete;\n"
2154 " A& operator=(const A&) = delete;\n"
2156 "void f() { A a; a = A(); A aa = A(); }\n"
2157 "} // namespace nb\n"
2158 "} // namespace na\n";
2159 std::string Expected
= "namespace na {\n"
2163 " // Allow move only.\n"
2164 " B(B&&) = default;\n"
2165 " B& operator=(B&&) = default;\n"
2166 " B(const B&) = delete;\n"
2167 " B& operator=(const B&) = delete;\n"
2171 "} // namespace na\n"
2178 " A(A&&) = default;\n"
2179 " A& operator=(A&&) = default;\n"
2182 " A(const A&) = delete;\n"
2183 " A& operator=(const A&) = delete;\n"
2185 "void f() { A a; a = A(); A aa = A(); }\n"
2186 "} // namespace y\n"
2187 "} // namespace x\n";
2188 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
2191 TEST_F(ChangeNamespaceTest
, InjectedClassNameInFriendDecl
) {
2194 std::string Code
= "namespace a{\n"
2195 "template <typename T>\n"
2203 "} // namespace a\n"
2205 "class D : public a::Base<D> {\n"
2207 " friend class Base<D>;\n"
2217 "} // namespace d\n";
2218 std::string Expected
= "namespace a{\n"
2219 "template <typename T>\n"
2227 "} // namespace a\n"
2230 "class D : public a::Base<D> {\n"
2232 " friend class a::Base<D>;\n"
2242 "} // namespace e\n";
2243 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
2246 TEST_F(ChangeNamespaceTest
, FullyQualifyConflictNamespace
) {
2248 "namespace x { namespace util { class Some {}; } }\n"
2249 "namespace x { namespace y {namespace base { class Base {}; } } }\n"
2250 "namespace util { class Status {}; }\n"
2251 "namespace base { class Base {}; }\n"
2255 " util::Status s1; x::util::Some s2;\n"
2256 " base::Base b1; x::y::base::Base b2;\n"
2258 "} // namespace nb\n"
2259 "} // namespace na\n";
2261 std::string Expected
=
2262 "namespace x { namespace util { class Some {}; } }\n"
2263 "namespace x { namespace y {namespace base { class Base {}; } } }\n"
2264 "namespace util { class Status {}; }\n"
2265 "namespace base { class Base {}; }\n"
2270 " ::util::Status s1; util::Some s2;\n"
2271 " ::base::Base b1; base::Base b2;\n"
2273 "} // namespace y\n"
2274 "} // namespace x\n";
2276 EXPECT_EQ(format(Expected
), runChangeNamespaceOnCode(Code
));
2279 } // anonymous namespace
2280 } // namespace change_namespace
2281 } // namespace clang