annotate clang-tools-extra/unittests/clang-change-namespace/ChangeNamespaceTests.cpp @ 201:a96fbbdf2d0f

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Fri, 04 Jun 2021 21:07:06 +0900
parents 1d019706d866
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===-- ChangeNamespaceTests.cpp - Change namespace unit tests ---*- C++ -*-===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8
anatofuz
parents:
diff changeset
9 #include "ChangeNamespace.h"
anatofuz
parents:
diff changeset
10 #include "unittests/Tooling/RewriterTestContext.h"
anatofuz
parents:
diff changeset
11 #include "clang/ASTMatchers/ASTMatchFinder.h"
anatofuz
parents:
diff changeset
12 #include "clang/Basic/FileManager.h"
anatofuz
parents:
diff changeset
13 #include "clang/Basic/FileSystemOptions.h"
anatofuz
parents:
diff changeset
14 #include "clang/Format/Format.h"
anatofuz
parents:
diff changeset
15 #include "clang/Frontend/CompilerInstance.h"
anatofuz
parents:
diff changeset
16 #include "clang/Frontend/PCHContainerOperations.h"
anatofuz
parents:
diff changeset
17 #include "clang/Tooling/Refactoring.h"
anatofuz
parents:
diff changeset
18 #include "clang/Tooling/Tooling.h"
anatofuz
parents:
diff changeset
19 #include "llvm/ADT/IntrusiveRefCntPtr.h"
anatofuz
parents:
diff changeset
20 #include "llvm/ADT/StringRef.h"
anatofuz
parents:
diff changeset
21 #include "llvm/Support/MemoryBuffer.h"
anatofuz
parents:
diff changeset
22 #include "llvm/Support/VirtualFileSystem.h"
anatofuz
parents:
diff changeset
23 #include "gtest/gtest.h"
anatofuz
parents:
diff changeset
24 #include <memory>
anatofuz
parents:
diff changeset
25 #include <string>
anatofuz
parents:
diff changeset
26 #include <vector>
anatofuz
parents:
diff changeset
27
anatofuz
parents:
diff changeset
28 namespace clang {
anatofuz
parents:
diff changeset
29 namespace change_namespace {
anatofuz
parents:
diff changeset
30 namespace {
anatofuz
parents:
diff changeset
31
anatofuz
parents:
diff changeset
32 class ChangeNamespaceTest : public ::testing::Test {
anatofuz
parents:
diff changeset
33 public:
anatofuz
parents:
diff changeset
34 std::string runChangeNamespaceOnCode(llvm::StringRef Code) {
anatofuz
parents:
diff changeset
35 clang::RewriterTestContext Context;
anatofuz
parents:
diff changeset
36 clang::FileID ID = Context.createInMemoryFile(FileName, Code);
anatofuz
parents:
diff changeset
37
anatofuz
parents:
diff changeset
38 std::map<std::string, tooling::Replacements> FileToReplacements;
anatofuz
parents:
diff changeset
39 change_namespace::ChangeNamespaceTool NamespaceTool(
anatofuz
parents:
diff changeset
40 OldNamespace, NewNamespace, FilePattern,
anatofuz
parents:
diff changeset
41 /*WhiteListedSymbolPatterns*/ {}, &FileToReplacements);
anatofuz
parents:
diff changeset
42 ast_matchers::MatchFinder Finder;
anatofuz
parents:
diff changeset
43 NamespaceTool.registerMatchers(&Finder);
anatofuz
parents:
diff changeset
44 std::unique_ptr<tooling::FrontendActionFactory> Factory =
anatofuz
parents:
diff changeset
45 tooling::newFrontendActionFactory(&Finder);
anatofuz
parents:
diff changeset
46 if (!tooling::runToolOnCodeWithArgs(Factory->create(), Code, {"-std=c++11"},
anatofuz
parents:
diff changeset
47 FileName))
anatofuz
parents:
diff changeset
48 return "";
anatofuz
parents:
diff changeset
49 formatAndApplyAllReplacements(FileToReplacements, Context.Rewrite);
anatofuz
parents:
diff changeset
50 return format(Context.getRewrittenText(ID));
anatofuz
parents:
diff changeset
51 }
anatofuz
parents:
diff changeset
52
anatofuz
parents:
diff changeset
53 std::string format(llvm::StringRef Code) {
anatofuz
parents:
diff changeset
54 tooling::Replacements Replaces = format::reformat(
anatofuz
parents:
diff changeset
55 format::getLLVMStyle(), Code, {tooling::Range(0, Code.size())});
anatofuz
parents:
diff changeset
56 auto ChangedCode = tooling::applyAllReplacements(Code, Replaces);
anatofuz
parents:
diff changeset
57 EXPECT_TRUE(static_cast<bool>(ChangedCode));
anatofuz
parents:
diff changeset
58 if (!ChangedCode) {
anatofuz
parents:
diff changeset
59 llvm::errs() << llvm::toString(ChangedCode.takeError());
anatofuz
parents:
diff changeset
60 return "";
anatofuz
parents:
diff changeset
61 }
anatofuz
parents:
diff changeset
62 return *ChangedCode;
anatofuz
parents:
diff changeset
63 }
anatofuz
parents:
diff changeset
64
anatofuz
parents:
diff changeset
65 protected:
anatofuz
parents:
diff changeset
66 std::string FileName = "input.cc";
anatofuz
parents:
diff changeset
67 std::string OldNamespace = "na::nb";
anatofuz
parents:
diff changeset
68 std::string NewNamespace = "x::y";
anatofuz
parents:
diff changeset
69 std::string FilePattern = "input.cc";
anatofuz
parents:
diff changeset
70 };
anatofuz
parents:
diff changeset
71
anatofuz
parents:
diff changeset
72 TEST_F(ChangeNamespaceTest, NoMatchingNamespace) {
anatofuz
parents:
diff changeset
73 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
74 "namespace nx {\n"
anatofuz
parents:
diff changeset
75 "class A {};\n"
anatofuz
parents:
diff changeset
76 "} // namespace nx\n"
anatofuz
parents:
diff changeset
77 "} // namespace na\n";
anatofuz
parents:
diff changeset
78 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
79 "namespace nx {\n"
anatofuz
parents:
diff changeset
80 "class A {};\n"
anatofuz
parents:
diff changeset
81 "} // namespace nx\n"
anatofuz
parents:
diff changeset
82 "} // namespace na\n";
anatofuz
parents:
diff changeset
83 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
84 }
anatofuz
parents:
diff changeset
85
anatofuz
parents:
diff changeset
86 TEST_F(ChangeNamespaceTest, SimpleMoveWithoutTypeRefs) {
anatofuz
parents:
diff changeset
87 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
88 "namespace nb {\n"
anatofuz
parents:
diff changeset
89 "class A {};\n"
anatofuz
parents:
diff changeset
90 "} // namespace nb\n"
anatofuz
parents:
diff changeset
91 "} // namespace na\n";
anatofuz
parents:
diff changeset
92 std::string Expected = "\n\n"
anatofuz
parents:
diff changeset
93 "namespace x {\n"
anatofuz
parents:
diff changeset
94 "namespace y {\n"
anatofuz
parents:
diff changeset
95 "class A {};\n"
anatofuz
parents:
diff changeset
96 "} // namespace y\n"
anatofuz
parents:
diff changeset
97 "} // namespace x\n";
anatofuz
parents:
diff changeset
98 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
99 }
anatofuz
parents:
diff changeset
100
anatofuz
parents:
diff changeset
101 TEST_F(ChangeNamespaceTest, NewNsNestedInOldNs) {
anatofuz
parents:
diff changeset
102 NewNamespace = "na::nb::nc";
anatofuz
parents:
diff changeset
103 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
104 "namespace nb {\n"
anatofuz
parents:
diff changeset
105 "class A {};\n"
anatofuz
parents:
diff changeset
106 "} // namespace nb\n"
anatofuz
parents:
diff changeset
107 "} // namespace na\n";
anatofuz
parents:
diff changeset
108 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
109 "namespace nb {\n"
anatofuz
parents:
diff changeset
110 "namespace nc {\n"
anatofuz
parents:
diff changeset
111 "class A {};\n"
anatofuz
parents:
diff changeset
112 "} // namespace nc\n"
anatofuz
parents:
diff changeset
113 "} // namespace nb\n"
anatofuz
parents:
diff changeset
114 "} // namespace na\n";
anatofuz
parents:
diff changeset
115 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
116 }
anatofuz
parents:
diff changeset
117
anatofuz
parents:
diff changeset
118 TEST_F(ChangeNamespaceTest, NewNsNestedInOldNsWithSurroundingNewLines) {
anatofuz
parents:
diff changeset
119 NewNamespace = "na::nb::nc";
anatofuz
parents:
diff changeset
120 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
121 "namespace nb {\n"
anatofuz
parents:
diff changeset
122 "\n"
anatofuz
parents:
diff changeset
123 "class A {};\n"
anatofuz
parents:
diff changeset
124 "\n"
anatofuz
parents:
diff changeset
125 "} // namespace nb\n"
anatofuz
parents:
diff changeset
126 "} // namespace na\n";
anatofuz
parents:
diff changeset
127 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
128 "namespace nb {\n"
anatofuz
parents:
diff changeset
129 "namespace nc {\n"
anatofuz
parents:
diff changeset
130 "\n"
anatofuz
parents:
diff changeset
131 "class A {};\n"
anatofuz
parents:
diff changeset
132 "\n"
anatofuz
parents:
diff changeset
133 "} // namespace nc\n"
anatofuz
parents:
diff changeset
134 "} // namespace nb\n"
anatofuz
parents:
diff changeset
135 "} // namespace na\n";
anatofuz
parents:
diff changeset
136 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
137 }
anatofuz
parents:
diff changeset
138
anatofuz
parents:
diff changeset
139 TEST_F(ChangeNamespaceTest, MoveOldNsWithSurroundingNewLines) {
anatofuz
parents:
diff changeset
140 NewNamespace = "nx::ny";
anatofuz
parents:
diff changeset
141 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
142 "namespace nb {\n"
anatofuz
parents:
diff changeset
143 "\n"
anatofuz
parents:
diff changeset
144 "class A {};\n"
anatofuz
parents:
diff changeset
145 "\n"
anatofuz
parents:
diff changeset
146 "} // namespace nb\n"
anatofuz
parents:
diff changeset
147 "} // namespace na\n";
anatofuz
parents:
diff changeset
148 std::string Expected = "\n\n"
anatofuz
parents:
diff changeset
149 "namespace nx {\n"
anatofuz
parents:
diff changeset
150 "namespace ny {\n"
anatofuz
parents:
diff changeset
151 "\n"
anatofuz
parents:
diff changeset
152 "class A {};\n"
anatofuz
parents:
diff changeset
153 "\n"
anatofuz
parents:
diff changeset
154 "} // namespace ny\n"
anatofuz
parents:
diff changeset
155 "} // namespace nx\n";
anatofuz
parents:
diff changeset
156 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
157 }
anatofuz
parents:
diff changeset
158
anatofuz
parents:
diff changeset
159 TEST_F(ChangeNamespaceTest, NewNsNestedInOldNsWithRefs) {
anatofuz
parents:
diff changeset
160 NewNamespace = "na::nb::nc";
anatofuz
parents:
diff changeset
161 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
162 "class A {};\n"
anatofuz
parents:
diff changeset
163 "namespace nb {\n"
anatofuz
parents:
diff changeset
164 "class B {};\n"
anatofuz
parents:
diff changeset
165 "class C {};\n"
anatofuz
parents:
diff changeset
166 "void f() { A a; B b; }\n"
anatofuz
parents:
diff changeset
167 "} // namespace nb\n"
anatofuz
parents:
diff changeset
168 "} // namespace na\n";
anatofuz
parents:
diff changeset
169 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
170 "class A {};\n"
anatofuz
parents:
diff changeset
171 "namespace nb {\n"
anatofuz
parents:
diff changeset
172 "namespace nc {\n"
anatofuz
parents:
diff changeset
173 "class B {};\n"
anatofuz
parents:
diff changeset
174 "class C {};\n"
anatofuz
parents:
diff changeset
175 "void f() { A a; B b; }\n"
anatofuz
parents:
diff changeset
176 "} // namespace nc\n"
anatofuz
parents:
diff changeset
177 "} // namespace nb\n"
anatofuz
parents:
diff changeset
178 "} // namespace na\n";
anatofuz
parents:
diff changeset
179 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
180 }
anatofuz
parents:
diff changeset
181
anatofuz
parents:
diff changeset
182 TEST_F(ChangeNamespaceTest, SimpleMoveIntoAnotherNestedNamespace) {
anatofuz
parents:
diff changeset
183 NewNamespace = "na::nc";
anatofuz
parents:
diff changeset
184 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
185 "namespace nb {\n"
anatofuz
parents:
diff changeset
186 "class A {};\n"
anatofuz
parents:
diff changeset
187 "} // namespace nb\n"
anatofuz
parents:
diff changeset
188 "} // namespace na\n";
anatofuz
parents:
diff changeset
189 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
190 "\n"
anatofuz
parents:
diff changeset
191 "namespace nc {\n"
anatofuz
parents:
diff changeset
192 "class A {};\n"
anatofuz
parents:
diff changeset
193 "} // namespace nc\n"
anatofuz
parents:
diff changeset
194 "} // namespace na\n";
anatofuz
parents:
diff changeset
195 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
196 }
anatofuz
parents:
diff changeset
197
anatofuz
parents:
diff changeset
198 TEST_F(ChangeNamespaceTest, MoveIntoAnotherNestedNamespaceWithRef) {
anatofuz
parents:
diff changeset
199 NewNamespace = "na::nc";
anatofuz
parents:
diff changeset
200 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
201 "class A {};\n"
anatofuz
parents:
diff changeset
202 "namespace nb {\n"
anatofuz
parents:
diff changeset
203 "class X { A a; };\n"
anatofuz
parents:
diff changeset
204 "} // namespace nb\n"
anatofuz
parents:
diff changeset
205 "} // namespace na\n";
anatofuz
parents:
diff changeset
206 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
207 "class A {};\n"
anatofuz
parents:
diff changeset
208 "\n"
anatofuz
parents:
diff changeset
209 "namespace nc {\n"
anatofuz
parents:
diff changeset
210 "class X { A a; };\n"
anatofuz
parents:
diff changeset
211 "} // namespace nc\n"
anatofuz
parents:
diff changeset
212 "} // namespace na\n";
anatofuz
parents:
diff changeset
213 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
214 }
anatofuz
parents:
diff changeset
215
anatofuz
parents:
diff changeset
216 TEST_F(ChangeNamespaceTest, MoveIntoExistingNamespaceAndShortenRefs) {
anatofuz
parents:
diff changeset
217 std::string Code = "namespace x {\n"
anatofuz
parents:
diff changeset
218 "namespace z {\n"
anatofuz
parents:
diff changeset
219 "class Z {};\n"
anatofuz
parents:
diff changeset
220 "} // namespace z\n"
anatofuz
parents:
diff changeset
221 "namespace y {\n"
anatofuz
parents:
diff changeset
222 "class T {};\n"
anatofuz
parents:
diff changeset
223 "} // namespace y\n"
anatofuz
parents:
diff changeset
224 "} // namespace x\n"
anatofuz
parents:
diff changeset
225 "namespace na {\n"
anatofuz
parents:
diff changeset
226 "class A{};\n"
anatofuz
parents:
diff changeset
227 "namespace nb {\n"
anatofuz
parents:
diff changeset
228 "class X { A a; x::z::Z zz; x::y::T t; };\n"
anatofuz
parents:
diff changeset
229 "} // namespace nb\n"
anatofuz
parents:
diff changeset
230 "} // namespace na\n";
anatofuz
parents:
diff changeset
231 std::string Expected = "namespace x {\n"
anatofuz
parents:
diff changeset
232 "namespace z {\n"
anatofuz
parents:
diff changeset
233 "class Z {};\n"
anatofuz
parents:
diff changeset
234 "} // namespace z\n"
anatofuz
parents:
diff changeset
235 "namespace y {\n"
anatofuz
parents:
diff changeset
236 "class T {};\n"
anatofuz
parents:
diff changeset
237 "} // namespace y\n"
anatofuz
parents:
diff changeset
238 "} // namespace x\n"
anatofuz
parents:
diff changeset
239 "namespace na {\n"
anatofuz
parents:
diff changeset
240 "class A {};\n\n"
anatofuz
parents:
diff changeset
241 "} // namespace na\n"
anatofuz
parents:
diff changeset
242 "namespace x {\n"
anatofuz
parents:
diff changeset
243 "namespace y {\n"
anatofuz
parents:
diff changeset
244 "class X { na::A a; z::Z zz; T t; };\n"
anatofuz
parents:
diff changeset
245 "} // namespace y\n"
anatofuz
parents:
diff changeset
246 "} // namespace x\n";
anatofuz
parents:
diff changeset
247 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
248 }
anatofuz
parents:
diff changeset
249
anatofuz
parents:
diff changeset
250 TEST_F(ChangeNamespaceTest, SimpleMoveNestedNamespace) {
anatofuz
parents:
diff changeset
251 NewNamespace = "na::x::y";
anatofuz
parents:
diff changeset
252 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
253 "class A {};\n"
anatofuz
parents:
diff changeset
254 "namespace nb {\n"
anatofuz
parents:
diff changeset
255 "class B {};\n"
anatofuz
parents:
diff changeset
256 "} // namespace nb\n"
anatofuz
parents:
diff changeset
257 "} // namespace na\n";
anatofuz
parents:
diff changeset
258 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
259 "class A {};\n"
anatofuz
parents:
diff changeset
260 "\n"
anatofuz
parents:
diff changeset
261 "namespace x {\n"
anatofuz
parents:
diff changeset
262 "namespace y {\n"
anatofuz
parents:
diff changeset
263 "class B {};\n"
anatofuz
parents:
diff changeset
264 "} // namespace y\n"
anatofuz
parents:
diff changeset
265 "} // namespace x\n"
anatofuz
parents:
diff changeset
266 "} // namespace na\n";
anatofuz
parents:
diff changeset
267 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
268 }
anatofuz
parents:
diff changeset
269
anatofuz
parents:
diff changeset
270 TEST_F(ChangeNamespaceTest, SimpleMoveWithTypeRefs) {
anatofuz
parents:
diff changeset
271 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
272 "class C_A {};\n"
anatofuz
parents:
diff changeset
273 "namespace nc {\n"
anatofuz
parents:
diff changeset
274 "class C_C {};"
anatofuz
parents:
diff changeset
275 "} // namespace nc\n"
anatofuz
parents:
diff changeset
276 "namespace nb {\n"
anatofuz
parents:
diff changeset
277 "class C_X {\n"
anatofuz
parents:
diff changeset
278 "public:\n"
anatofuz
parents:
diff changeset
279 " C_A a;\n"
anatofuz
parents:
diff changeset
280 " nc::C_C c;\n"
anatofuz
parents:
diff changeset
281 "};\n"
anatofuz
parents:
diff changeset
282 "class C_Y {\n"
anatofuz
parents:
diff changeset
283 " C_X x;\n"
anatofuz
parents:
diff changeset
284 "};\n"
anatofuz
parents:
diff changeset
285 "} // namespace nb\n"
anatofuz
parents:
diff changeset
286 "} // namespace na\n";
anatofuz
parents:
diff changeset
287 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
288 "class C_A {};\n"
anatofuz
parents:
diff changeset
289 "namespace nc {\n"
anatofuz
parents:
diff changeset
290 "class C_C {};"
anatofuz
parents:
diff changeset
291 "} // namespace nc\n"
anatofuz
parents:
diff changeset
292 "\n"
anatofuz
parents:
diff changeset
293 "} // namespace na\n"
anatofuz
parents:
diff changeset
294 "namespace x {\n"
anatofuz
parents:
diff changeset
295 "namespace y {\n"
anatofuz
parents:
diff changeset
296 "class C_X {\n"
anatofuz
parents:
diff changeset
297 "public:\n"
anatofuz
parents:
diff changeset
298 " na::C_A a;\n"
anatofuz
parents:
diff changeset
299 " na::nc::C_C c;\n"
anatofuz
parents:
diff changeset
300 "};\n"
anatofuz
parents:
diff changeset
301 "class C_Y {\n"
anatofuz
parents:
diff changeset
302 " C_X x;\n"
anatofuz
parents:
diff changeset
303 "};\n"
anatofuz
parents:
diff changeset
304 "} // namespace y\n"
anatofuz
parents:
diff changeset
305 "} // namespace x\n";
anatofuz
parents:
diff changeset
306 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
307 }
anatofuz
parents:
diff changeset
308
anatofuz
parents:
diff changeset
309 TEST_F(ChangeNamespaceTest, TypeLocInTemplateSpecialization) {
anatofuz
parents:
diff changeset
310 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
311 "class A {};\n"
anatofuz
parents:
diff changeset
312 "template <typename T>\n"
anatofuz
parents:
diff changeset
313 "class B {};\n"
anatofuz
parents:
diff changeset
314 "template <typename T1, typename T2>\n"
anatofuz
parents:
diff changeset
315 "class Two {};\n"
anatofuz
parents:
diff changeset
316 "namespace nc { class C {}; }\n"
anatofuz
parents:
diff changeset
317 "} // na\n"
anatofuz
parents:
diff changeset
318 "\n"
anatofuz
parents:
diff changeset
319 "namespace na {\n"
anatofuz
parents:
diff changeset
320 "namespace nb {\n"
anatofuz
parents:
diff changeset
321 "void f() {\n"
anatofuz
parents:
diff changeset
322 " B<A> b;\n"
anatofuz
parents:
diff changeset
323 " B<nc::C> b_c;\n"
anatofuz
parents:
diff changeset
324 " Two<A, nc::C> two;\n"
anatofuz
parents:
diff changeset
325 "}\n"
anatofuz
parents:
diff changeset
326 "} // nb\n"
anatofuz
parents:
diff changeset
327 "} // na\n";
anatofuz
parents:
diff changeset
328 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
329 "class A {};\n"
anatofuz
parents:
diff changeset
330 "template <typename T>\n"
anatofuz
parents:
diff changeset
331 "class B {};\n"
anatofuz
parents:
diff changeset
332 "template <typename T1, typename T2>\n"
anatofuz
parents:
diff changeset
333 "class Two {};\n"
anatofuz
parents:
diff changeset
334 "namespace nc { class C {}; }\n"
anatofuz
parents:
diff changeset
335 "} // na\n"
anatofuz
parents:
diff changeset
336 "\n"
anatofuz
parents:
diff changeset
337 "\n"
anatofuz
parents:
diff changeset
338 "namespace x {\n"
anatofuz
parents:
diff changeset
339 "namespace y {\n"
anatofuz
parents:
diff changeset
340 "void f() {\n"
anatofuz
parents:
diff changeset
341 " na::B<na::A> b;\n"
anatofuz
parents:
diff changeset
342 " na::B<na::nc::C> b_c;\n"
anatofuz
parents:
diff changeset
343 " na::Two<na::A, na::nc::C> two;\n"
anatofuz
parents:
diff changeset
344 "}\n"
anatofuz
parents:
diff changeset
345 "} // namespace y\n"
anatofuz
parents:
diff changeset
346 "} // namespace x\n";
anatofuz
parents:
diff changeset
347 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
348 }
anatofuz
parents:
diff changeset
349
anatofuz
parents:
diff changeset
350 TEST_F(ChangeNamespaceTest, LeaveForwardDeclarationBehind) {
anatofuz
parents:
diff changeset
351 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
352 "namespace nb {\n"
anatofuz
parents:
diff changeset
353 "class FWD;\n"
anatofuz
parents:
diff changeset
354 "class FWD2;\n"
anatofuz
parents:
diff changeset
355 "class A {\n"
anatofuz
parents:
diff changeset
356 " FWD *fwd;\n"
anatofuz
parents:
diff changeset
357 "};\n"
anatofuz
parents:
diff changeset
358 "} // namespace nb\n"
anatofuz
parents:
diff changeset
359 "} // namespace na\n";
anatofuz
parents:
diff changeset
360 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
361 "namespace nb {\n"
anatofuz
parents:
diff changeset
362 "class FWD;\n"
anatofuz
parents:
diff changeset
363 "class FWD2;\n"
anatofuz
parents:
diff changeset
364 "} // namespace nb\n"
anatofuz
parents:
diff changeset
365 "} // namespace na\n"
anatofuz
parents:
diff changeset
366 "namespace x {\n"
anatofuz
parents:
diff changeset
367 "namespace y {\n"
anatofuz
parents:
diff changeset
368 "\n"
anatofuz
parents:
diff changeset
369 "class A {\n"
anatofuz
parents:
diff changeset
370 " na::nb::FWD *fwd;\n"
anatofuz
parents:
diff changeset
371 "};\n"
anatofuz
parents:
diff changeset
372 "} // namespace y\n"
anatofuz
parents:
diff changeset
373 "} // namespace x\n";
anatofuz
parents:
diff changeset
374 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
375 }
anatofuz
parents:
diff changeset
376
anatofuz
parents:
diff changeset
377 TEST_F(ChangeNamespaceTest, InsertForwardDeclsProperly) {
anatofuz
parents:
diff changeset
378 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
379 "namespace nb {\n"
anatofuz
parents:
diff changeset
380 "\n"
anatofuz
parents:
diff changeset
381 "class FWD;\n"
anatofuz
parents:
diff changeset
382 "class FWD2;\n"
anatofuz
parents:
diff changeset
383 "class A {\n"
anatofuz
parents:
diff changeset
384 " FWD *fwd;\n"
anatofuz
parents:
diff changeset
385 "};\n"
anatofuz
parents:
diff changeset
386 "\n"
anatofuz
parents:
diff changeset
387 "} // namespace nb\n"
anatofuz
parents:
diff changeset
388 "} // namespace na\n";
anatofuz
parents:
diff changeset
389 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
390 "namespace nb {\n"
anatofuz
parents:
diff changeset
391 "class FWD;\n"
anatofuz
parents:
diff changeset
392 "class FWD2;\n"
anatofuz
parents:
diff changeset
393 "} // namespace nb\n"
anatofuz
parents:
diff changeset
394 "} // namespace na\n"
anatofuz
parents:
diff changeset
395 "namespace x {\n"
anatofuz
parents:
diff changeset
396 "namespace y {\n"
anatofuz
parents:
diff changeset
397 "\n"
anatofuz
parents:
diff changeset
398 "class A {\n"
anatofuz
parents:
diff changeset
399 " na::nb::FWD *fwd;\n"
anatofuz
parents:
diff changeset
400 "};\n"
anatofuz
parents:
diff changeset
401 "\n"
anatofuz
parents:
diff changeset
402 "} // namespace y\n"
anatofuz
parents:
diff changeset
403 "} // namespace x\n";
anatofuz
parents:
diff changeset
404 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
405 }
anatofuz
parents:
diff changeset
406
anatofuz
parents:
diff changeset
407 TEST_F(ChangeNamespaceTest, TemplateClassForwardDeclaration) {
anatofuz
parents:
diff changeset
408 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
409 "namespace nb {\n"
anatofuz
parents:
diff changeset
410 "class FWD;\n"
anatofuz
parents:
diff changeset
411 "template<typename T> class FWD_TEMP;\n"
anatofuz
parents:
diff changeset
412 "class A {\n"
anatofuz
parents:
diff changeset
413 " FWD *fwd;\n"
anatofuz
parents:
diff changeset
414 "};\n"
anatofuz
parents:
diff changeset
415 "template<typename T> class TEMP {};\n"
anatofuz
parents:
diff changeset
416 "} // namespace nb\n"
anatofuz
parents:
diff changeset
417 "} // namespace na\n";
anatofuz
parents:
diff changeset
418 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
419 "namespace nb {\n"
anatofuz
parents:
diff changeset
420 "class FWD;\n"
anatofuz
parents:
diff changeset
421 "template<typename T> class FWD_TEMP;\n"
anatofuz
parents:
diff changeset
422 "} // namespace nb\n"
anatofuz
parents:
diff changeset
423 "} // namespace na\n"
anatofuz
parents:
diff changeset
424 "namespace x {\n"
anatofuz
parents:
diff changeset
425 "namespace y {\n"
anatofuz
parents:
diff changeset
426 "\n"
anatofuz
parents:
diff changeset
427 "class A {\n"
anatofuz
parents:
diff changeset
428 " na::nb::FWD *fwd;\n"
anatofuz
parents:
diff changeset
429 "};\n"
anatofuz
parents:
diff changeset
430 "template<typename T> class TEMP {};\n"
anatofuz
parents:
diff changeset
431 "} // namespace y\n"
anatofuz
parents:
diff changeset
432 "} // namespace x\n";
anatofuz
parents:
diff changeset
433 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
434 }
anatofuz
parents:
diff changeset
435
anatofuz
parents:
diff changeset
436 TEST_F(ChangeNamespaceTest, DontMoveForwardDeclarationInClass) {
anatofuz
parents:
diff changeset
437 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
438 "namespace nb {\n"
anatofuz
parents:
diff changeset
439 "class A {\n"
anatofuz
parents:
diff changeset
440 " class FWD;\n"
anatofuz
parents:
diff changeset
441 " FWD *fwd;\n"
anatofuz
parents:
diff changeset
442 " template<typename T> class FWD_TEMP;\n"
anatofuz
parents:
diff changeset
443 "};\n"
anatofuz
parents:
diff changeset
444 "} // namespace nb\n"
anatofuz
parents:
diff changeset
445 "} // namespace na\n";
anatofuz
parents:
diff changeset
446 std::string Expected = "\n\n"
anatofuz
parents:
diff changeset
447 "namespace x {\n"
anatofuz
parents:
diff changeset
448 "namespace y {\n"
anatofuz
parents:
diff changeset
449 "class A {\n"
anatofuz
parents:
diff changeset
450 " class FWD;\n"
anatofuz
parents:
diff changeset
451 " FWD *fwd;\n"
anatofuz
parents:
diff changeset
452 " template<typename T> class FWD_TEMP;\n"
anatofuz
parents:
diff changeset
453 "};\n"
anatofuz
parents:
diff changeset
454 "} // namespace y\n"
anatofuz
parents:
diff changeset
455 "} // namespace x\n";
anatofuz
parents:
diff changeset
456 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
457 }
anatofuz
parents:
diff changeset
458
anatofuz
parents:
diff changeset
459 TEST_F(ChangeNamespaceTest, MoveFunctions) {
anatofuz
parents:
diff changeset
460 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
461 "class C_A {};\n"
anatofuz
parents:
diff changeset
462 "namespace nc {\n"
anatofuz
parents:
diff changeset
463 "class C_C {};"
anatofuz
parents:
diff changeset
464 "} // namespace nc\n"
anatofuz
parents:
diff changeset
465 "namespace nb {\n"
anatofuz
parents:
diff changeset
466 "void fwd();\n"
anatofuz
parents:
diff changeset
467 "void f(C_A ca, nc::C_C cc) {\n"
anatofuz
parents:
diff changeset
468 " C_A ca_1 = ca;\n"
anatofuz
parents:
diff changeset
469 "}\n"
anatofuz
parents:
diff changeset
470 "} // namespace nb\n"
anatofuz
parents:
diff changeset
471 "} // namespace na\n";
anatofuz
parents:
diff changeset
472
anatofuz
parents:
diff changeset
473 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
474 "class C_A {};\n"
anatofuz
parents:
diff changeset
475 "namespace nc {\n"
anatofuz
parents:
diff changeset
476 "class C_C {};"
anatofuz
parents:
diff changeset
477 "} // namespace nc\n"
anatofuz
parents:
diff changeset
478 "\n"
anatofuz
parents:
diff changeset
479 "} // namespace na\n"
anatofuz
parents:
diff changeset
480 "namespace x {\n"
anatofuz
parents:
diff changeset
481 "namespace y {\n"
anatofuz
parents:
diff changeset
482 "void fwd();\n"
anatofuz
parents:
diff changeset
483 "void f(na::C_A ca, na::nc::C_C cc) {\n"
anatofuz
parents:
diff changeset
484 " na::C_A ca_1 = ca;\n"
anatofuz
parents:
diff changeset
485 "}\n"
anatofuz
parents:
diff changeset
486 "} // namespace y\n"
anatofuz
parents:
diff changeset
487 "} // namespace x\n";
anatofuz
parents:
diff changeset
488 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
489 }
anatofuz
parents:
diff changeset
490
anatofuz
parents:
diff changeset
491 TEST_F(ChangeNamespaceTest, FixUsingShadowDecl) {
anatofuz
parents:
diff changeset
492 std::string Code = "class GLOB {};\n"
anatofuz
parents:
diff changeset
493 "using BLOG = GLOB;\n"
anatofuz
parents:
diff changeset
494 "namespace na {\n"
anatofuz
parents:
diff changeset
495 "namespace nc {\n"
anatofuz
parents:
diff changeset
496 "class SAME {};\n"
anatofuz
parents:
diff changeset
497 "}\n"
anatofuz
parents:
diff changeset
498 "namespace nd {\n"
anatofuz
parents:
diff changeset
499 "class SAME {};\n"
anatofuz
parents:
diff changeset
500 "}\n"
anatofuz
parents:
diff changeset
501 "namespace nb {\n"
anatofuz
parents:
diff changeset
502 "using nc::SAME;\n"
anatofuz
parents:
diff changeset
503 "using YO = nd::SAME;\n"
anatofuz
parents:
diff changeset
504 "typedef nd::SAME IDENTICAL;\n"
anatofuz
parents:
diff changeset
505 "void f(nd::SAME Same) {}\n"
anatofuz
parents:
diff changeset
506 "} // namespace nb\n"
anatofuz
parents:
diff changeset
507 "} // namespace na\n";
anatofuz
parents:
diff changeset
508
anatofuz
parents:
diff changeset
509 std::string Expected = "class GLOB {};\n"
anatofuz
parents:
diff changeset
510 "using BLOG = GLOB;\n"
anatofuz
parents:
diff changeset
511 "namespace na {\n"
anatofuz
parents:
diff changeset
512 "namespace nc {\n"
anatofuz
parents:
diff changeset
513 "class SAME {};\n"
anatofuz
parents:
diff changeset
514 "}\n"
anatofuz
parents:
diff changeset
515 "namespace nd {\n"
anatofuz
parents:
diff changeset
516 "class SAME {};\n"
anatofuz
parents:
diff changeset
517 "}\n"
anatofuz
parents:
diff changeset
518 "\n"
anatofuz
parents:
diff changeset
519 "} // namespace na\n"
anatofuz
parents:
diff changeset
520 "namespace x {\n"
anatofuz
parents:
diff changeset
521 "namespace y {\n"
anatofuz
parents:
diff changeset
522 "using ::na::nc::SAME;\n"
anatofuz
parents:
diff changeset
523 "using YO = na::nd::SAME;\n"
anatofuz
parents:
diff changeset
524 "typedef na::nd::SAME IDENTICAL;\n"
anatofuz
parents:
diff changeset
525 "void f(na::nd::SAME Same) {}\n"
anatofuz
parents:
diff changeset
526 "} // namespace y\n"
anatofuz
parents:
diff changeset
527 "} // namespace x\n";
anatofuz
parents:
diff changeset
528 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
529 }
anatofuz
parents:
diff changeset
530
anatofuz
parents:
diff changeset
531 TEST_F(ChangeNamespaceTest, DontFixUsingShadowDeclInClasses) {
anatofuz
parents:
diff changeset
532 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
533 "class A {};\n"
anatofuz
parents:
diff changeset
534 "class Base { public: Base() {} void m() {} };\n"
anatofuz
parents:
diff changeset
535 "namespace nb {\n"
anatofuz
parents:
diff changeset
536 "class D : public Base {\n"
anatofuz
parents:
diff changeset
537 "public:\n"
anatofuz
parents:
diff changeset
538 " using AA = A; using B = Base;\n"
anatofuz
parents:
diff changeset
539 " using Base::m; using Base::Base;\n"
anatofuz
parents:
diff changeset
540 "};"
anatofuz
parents:
diff changeset
541 "} // namespace nb\n"
anatofuz
parents:
diff changeset
542 "} // namespace na\n";
anatofuz
parents:
diff changeset
543
anatofuz
parents:
diff changeset
544 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
545 "class A {};\n"
anatofuz
parents:
diff changeset
546 "class Base { public: Base() {} void m() {} };\n"
anatofuz
parents:
diff changeset
547 "\n"
anatofuz
parents:
diff changeset
548 "} // namespace na\n"
anatofuz
parents:
diff changeset
549 "namespace x {\n"
anatofuz
parents:
diff changeset
550 "namespace y {\n"
anatofuz
parents:
diff changeset
551 "class D : public na::Base {\n"
anatofuz
parents:
diff changeset
552 "public:\n"
anatofuz
parents:
diff changeset
553 " using AA = na::A; using B = na::Base;\n"
anatofuz
parents:
diff changeset
554 " using Base::m; using Base::Base;\n"
anatofuz
parents:
diff changeset
555 "};"
anatofuz
parents:
diff changeset
556 "} // namespace y\n"
anatofuz
parents:
diff changeset
557 "} // namespace x\n";
anatofuz
parents:
diff changeset
558 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
559 }
anatofuz
parents:
diff changeset
560
anatofuz
parents:
diff changeset
561 TEST_F(ChangeNamespaceTest, TypeInNestedNameSpecifier) {
anatofuz
parents:
diff changeset
562 std::string Code =
anatofuz
parents:
diff changeset
563 "namespace na {\n"
anatofuz
parents:
diff changeset
564 "class C_A {\n"
anatofuz
parents:
diff changeset
565 "public:\n"
anatofuz
parents:
diff changeset
566 " class Nested {\n"
anatofuz
parents:
diff changeset
567 " public:\n"
anatofuz
parents:
diff changeset
568 " static int NestedX;\n"
anatofuz
parents:
diff changeset
569 " static void nestedFunc() {}\n"
anatofuz
parents:
diff changeset
570 " };\n"
anatofuz
parents:
diff changeset
571 "};\n"
anatofuz
parents:
diff changeset
572 "namespace nb {\n"
anatofuz
parents:
diff changeset
573 "class C_X {\n"
anatofuz
parents:
diff changeset
574 " C_A na;\n"
anatofuz
parents:
diff changeset
575 " C_A::Nested nested;\n"
anatofuz
parents:
diff changeset
576 " void f() {\n"
anatofuz
parents:
diff changeset
577 " C_A::Nested::nestedFunc();\n"
anatofuz
parents:
diff changeset
578 " int X = C_A::Nested::NestedX;\n"
anatofuz
parents:
diff changeset
579 " }\n"
anatofuz
parents:
diff changeset
580 "};\n"
anatofuz
parents:
diff changeset
581 "} // namespace nb\n"
anatofuz
parents:
diff changeset
582 "} // namespace na\n";
anatofuz
parents:
diff changeset
583 std::string Expected =
anatofuz
parents:
diff changeset
584 "namespace na {\n"
anatofuz
parents:
diff changeset
585 "class C_A {\n"
anatofuz
parents:
diff changeset
586 "public:\n"
anatofuz
parents:
diff changeset
587 " class Nested {\n"
anatofuz
parents:
diff changeset
588 " public:\n"
anatofuz
parents:
diff changeset
589 " static int NestedX;\n"
anatofuz
parents:
diff changeset
590 " static void nestedFunc() {}\n"
anatofuz
parents:
diff changeset
591 " };\n"
anatofuz
parents:
diff changeset
592 "};\n"
anatofuz
parents:
diff changeset
593 "\n"
anatofuz
parents:
diff changeset
594 "} // namespace na\n"
anatofuz
parents:
diff changeset
595 "namespace x {\n"
anatofuz
parents:
diff changeset
596 "namespace y {\n"
anatofuz
parents:
diff changeset
597 "class C_X {\n"
anatofuz
parents:
diff changeset
598 " na::C_A na;\n"
anatofuz
parents:
diff changeset
599 " na::C_A::Nested nested;\n"
anatofuz
parents:
diff changeset
600 " void f() {\n"
anatofuz
parents:
diff changeset
601 " na::C_A::Nested::nestedFunc();\n"
anatofuz
parents:
diff changeset
602 " int X = na::C_A::Nested::NestedX;\n"
anatofuz
parents:
diff changeset
603 " }\n"
anatofuz
parents:
diff changeset
604 "};\n"
anatofuz
parents:
diff changeset
605 "} // namespace y\n"
anatofuz
parents:
diff changeset
606 "} // namespace x\n";
anatofuz
parents:
diff changeset
607 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
608 }
anatofuz
parents:
diff changeset
609
anatofuz
parents:
diff changeset
610 TEST_F(ChangeNamespaceTest, FixFunctionNameSpecifiers) {
anatofuz
parents:
diff changeset
611 std::string Code =
anatofuz
parents:
diff changeset
612 "namespace na {\n"
anatofuz
parents:
diff changeset
613 "class A {\n"
anatofuz
parents:
diff changeset
614 "public:\n"
anatofuz
parents:
diff changeset
615 " static void f() {}\n"
anatofuz
parents:
diff changeset
616 " static void g();\n"
anatofuz
parents:
diff changeset
617 "};\n"
anatofuz
parents:
diff changeset
618 "void A::g() {}"
anatofuz
parents:
diff changeset
619 "void a_f() {}\n"
anatofuz
parents:
diff changeset
620 "static void static_f() {}\n"
anatofuz
parents:
diff changeset
621 "namespace nb {\n"
anatofuz
parents:
diff changeset
622 "void f() { a_f(); static_f(); A::f(); }\n"
anatofuz
parents:
diff changeset
623 "void g() { f(); A::g(); }\n"
anatofuz
parents:
diff changeset
624 "} // namespace nb\n"
anatofuz
parents:
diff changeset
625 "} // namespace na\n";
anatofuz
parents:
diff changeset
626 std::string Expected =
anatofuz
parents:
diff changeset
627 "namespace na {\n"
anatofuz
parents:
diff changeset
628 "class A {\n"
anatofuz
parents:
diff changeset
629 "public:\n"
anatofuz
parents:
diff changeset
630 " static void f() {}\n"
anatofuz
parents:
diff changeset
631 " static void g();\n"
anatofuz
parents:
diff changeset
632 "};\n"
anatofuz
parents:
diff changeset
633 "void A::g() {}"
anatofuz
parents:
diff changeset
634 "void a_f() {}\n"
anatofuz
parents:
diff changeset
635 "static void static_f() {}\n"
anatofuz
parents:
diff changeset
636 "\n"
anatofuz
parents:
diff changeset
637 "} // namespace na\n"
anatofuz
parents:
diff changeset
638 "namespace x {\n"
anatofuz
parents:
diff changeset
639 "namespace y {\n"
anatofuz
parents:
diff changeset
640 "void f() { na::a_f(); na::static_f(); na::A::f(); }\n"
anatofuz
parents:
diff changeset
641 "void g() { f(); na::A::g(); }\n"
anatofuz
parents:
diff changeset
642 "} // namespace y\n"
anatofuz
parents:
diff changeset
643 "} // namespace x\n";
anatofuz
parents:
diff changeset
644 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
645 }
anatofuz
parents:
diff changeset
646
anatofuz
parents:
diff changeset
647 TEST_F(ChangeNamespaceTest, FixOverloadedOperatorFunctionNameSpecifiers) {
anatofuz
parents:
diff changeset
648 std::string Code =
anatofuz
parents:
diff changeset
649 "namespace na {\n"
anatofuz
parents:
diff changeset
650 "class A {\n"
anatofuz
parents:
diff changeset
651 "public:\n"
anatofuz
parents:
diff changeset
652 " int x;\n"
anatofuz
parents:
diff changeset
653 " bool operator==(const A &RHS) const { return x == RHS.x; }\n"
anatofuz
parents:
diff changeset
654 "};\n"
anatofuz
parents:
diff changeset
655 "bool operator<(const A &LHS, const A &RHS) { return LHS.x == RHS.x; }\n"
anatofuz
parents:
diff changeset
656 "namespace nb {\n"
anatofuz
parents:
diff changeset
657 "bool f() {\n"
anatofuz
parents:
diff changeset
658 " A x, y;\n"
anatofuz
parents:
diff changeset
659 " auto f = operator<;\n"
anatofuz
parents:
diff changeset
660 " return (x == y) && (x < y) && (operator<(x, y));\n"
anatofuz
parents:
diff changeset
661 "}\n"
anatofuz
parents:
diff changeset
662 "} // namespace nb\n"
anatofuz
parents:
diff changeset
663 "} // namespace na\n";
anatofuz
parents:
diff changeset
664 std::string Expected =
anatofuz
parents:
diff changeset
665 "namespace na {\n"
anatofuz
parents:
diff changeset
666 "class A {\n"
anatofuz
parents:
diff changeset
667 "public:\n"
anatofuz
parents:
diff changeset
668 " int x;\n"
anatofuz
parents:
diff changeset
669 " bool operator==(const A &RHS) const { return x == RHS.x; }\n"
anatofuz
parents:
diff changeset
670 "};\n"
anatofuz
parents:
diff changeset
671 "bool operator<(const A &LHS, const A &RHS) { return LHS.x == RHS.x; }\n"
anatofuz
parents:
diff changeset
672 "\n"
anatofuz
parents:
diff changeset
673 "} // namespace na\n"
anatofuz
parents:
diff changeset
674 "namespace x {\n"
anatofuz
parents:
diff changeset
675 "namespace y {\n"
anatofuz
parents:
diff changeset
676 "bool f() {\n"
anatofuz
parents:
diff changeset
677 " na::A x, y;\n"
anatofuz
parents:
diff changeset
678 " auto f = na::operator<;\n"
anatofuz
parents:
diff changeset
679 // FIXME: function calls to overloaded operators are not fixed now even if
anatofuz
parents:
diff changeset
680 // they are referenced by qualified names.
anatofuz
parents:
diff changeset
681 " return (x == y) && (x < y) && (operator<(x,y));\n"
anatofuz
parents:
diff changeset
682 "}\n"
anatofuz
parents:
diff changeset
683 "} // namespace y\n"
anatofuz
parents:
diff changeset
684 "} // namespace x\n";
anatofuz
parents:
diff changeset
685 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
686 }
anatofuz
parents:
diff changeset
687
anatofuz
parents:
diff changeset
688 TEST_F(ChangeNamespaceTest, FixNonCallingFunctionReferences) {
anatofuz
parents:
diff changeset
689 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
690 "class A {\n"
anatofuz
parents:
diff changeset
691 "public:\n"
anatofuz
parents:
diff changeset
692 " static void f() {}\n"
anatofuz
parents:
diff changeset
693 "};\n"
anatofuz
parents:
diff changeset
694 "void a_f() {}\n"
anatofuz
parents:
diff changeset
695 "static void s_f() {}\n"
anatofuz
parents:
diff changeset
696 "namespace nb {\n"
anatofuz
parents:
diff changeset
697 "void f() {\n"
anatofuz
parents:
diff changeset
698 " auto *ref1 = A::f;\n"
anatofuz
parents:
diff changeset
699 " auto *ref2 = a_f;\n"
anatofuz
parents:
diff changeset
700 " auto *ref3 = s_f;\n"
anatofuz
parents:
diff changeset
701 "}\n"
anatofuz
parents:
diff changeset
702 "} // namespace nb\n"
anatofuz
parents:
diff changeset
703 "} // namespace na\n";
anatofuz
parents:
diff changeset
704 std::string Expected =
anatofuz
parents:
diff changeset
705 "namespace na {\n"
anatofuz
parents:
diff changeset
706 "class A {\n"
anatofuz
parents:
diff changeset
707 "public:\n"
anatofuz
parents:
diff changeset
708 " static void f() {}\n"
anatofuz
parents:
diff changeset
709 "};\n"
anatofuz
parents:
diff changeset
710 "void a_f() {}\n"
anatofuz
parents:
diff changeset
711 "static void s_f() {}\n"
anatofuz
parents:
diff changeset
712 "\n"
anatofuz
parents:
diff changeset
713 "} // namespace na\n"
anatofuz
parents:
diff changeset
714 "namespace x {\n"
anatofuz
parents:
diff changeset
715 "namespace y {\n"
anatofuz
parents:
diff changeset
716 "void f() {\n"
anatofuz
parents:
diff changeset
717 " auto *ref1 = na::A::f;\n"
anatofuz
parents:
diff changeset
718 " auto *ref2 = na::a_f;\n"
anatofuz
parents:
diff changeset
719 " auto *ref3 = na::s_f;\n"
anatofuz
parents:
diff changeset
720 "}\n"
anatofuz
parents:
diff changeset
721 "} // namespace y\n"
anatofuz
parents:
diff changeset
722 "} // namespace x\n";
anatofuz
parents:
diff changeset
723 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
724 }
anatofuz
parents:
diff changeset
725
anatofuz
parents:
diff changeset
726 TEST_F(ChangeNamespaceTest, MoveAndFixGlobalVariables) {
anatofuz
parents:
diff changeset
727 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
728 "int GlobA;\n"
anatofuz
parents:
diff changeset
729 "static int GlobAStatic = 0;\n"
anatofuz
parents:
diff changeset
730 "namespace nc { int GlobC; }\n"
anatofuz
parents:
diff changeset
731 "namespace nb {\n"
anatofuz
parents:
diff changeset
732 "int GlobB;\n"
anatofuz
parents:
diff changeset
733 "void f() {\n"
anatofuz
parents:
diff changeset
734 " int a = GlobA;\n"
anatofuz
parents:
diff changeset
735 " int b = GlobAStatic;\n"
anatofuz
parents:
diff changeset
736 " int c = nc::GlobC;\n"
anatofuz
parents:
diff changeset
737 "}\n"
anatofuz
parents:
diff changeset
738 "} // namespace nb\n"
anatofuz
parents:
diff changeset
739 "} // namespace na\n";
anatofuz
parents:
diff changeset
740
anatofuz
parents:
diff changeset
741 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
742 "int GlobA;\n"
anatofuz
parents:
diff changeset
743 "static int GlobAStatic = 0;\n"
anatofuz
parents:
diff changeset
744 "namespace nc { int GlobC; }\n"
anatofuz
parents:
diff changeset
745 "\n"
anatofuz
parents:
diff changeset
746 "} // namespace na\n"
anatofuz
parents:
diff changeset
747 "namespace x {\n"
anatofuz
parents:
diff changeset
748 "namespace y {\n"
anatofuz
parents:
diff changeset
749 "int GlobB;\n"
anatofuz
parents:
diff changeset
750 "void f() {\n"
anatofuz
parents:
diff changeset
751 " int a = na::GlobA;\n"
anatofuz
parents:
diff changeset
752 " int b = na::GlobAStatic;\n"
anatofuz
parents:
diff changeset
753 " int c = na::nc::GlobC;\n"
anatofuz
parents:
diff changeset
754 "}\n"
anatofuz
parents:
diff changeset
755 "} // namespace y\n"
anatofuz
parents:
diff changeset
756 "} // namespace x\n";
anatofuz
parents:
diff changeset
757
anatofuz
parents:
diff changeset
758 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
759 }
anatofuz
parents:
diff changeset
760
anatofuz
parents:
diff changeset
761 TEST_F(ChangeNamespaceTest, DoNotFixStaticVariableOfClass) {
anatofuz
parents:
diff changeset
762 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
763 "class A {\n"
anatofuz
parents:
diff changeset
764 "public:\n"
anatofuz
parents:
diff changeset
765 "static int A1;\n"
anatofuz
parents:
diff changeset
766 "static int A2;\n"
anatofuz
parents:
diff changeset
767 "};\n"
anatofuz
parents:
diff changeset
768 "int A::A1 = 0;\n"
anatofuz
parents:
diff changeset
769 "namespace nb {\n"
anatofuz
parents:
diff changeset
770 "void f() {\n"
anatofuz
parents:
diff changeset
771 " int a = A::A1; int b = A::A2;\n"
anatofuz
parents:
diff changeset
772 "}\n"
anatofuz
parents:
diff changeset
773 "} // namespace nb\n"
anatofuz
parents:
diff changeset
774 "} // namespace na\n";
anatofuz
parents:
diff changeset
775
anatofuz
parents:
diff changeset
776 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
777 "class A {\n"
anatofuz
parents:
diff changeset
778 "public:\n"
anatofuz
parents:
diff changeset
779 "static int A1;\n"
anatofuz
parents:
diff changeset
780 "static int A2;\n"
anatofuz
parents:
diff changeset
781 "};\n"
anatofuz
parents:
diff changeset
782 "int A::A1 = 0;\n"
anatofuz
parents:
diff changeset
783 "\n"
anatofuz
parents:
diff changeset
784 "} // namespace na\n"
anatofuz
parents:
diff changeset
785 "namespace x {\n"
anatofuz
parents:
diff changeset
786 "namespace y {\n"
anatofuz
parents:
diff changeset
787 "void f() {\n"
anatofuz
parents:
diff changeset
788 " int a = na::A::A1; int b = na::A::A2;\n"
anatofuz
parents:
diff changeset
789 "}\n"
anatofuz
parents:
diff changeset
790 "} // namespace y\n"
anatofuz
parents:
diff changeset
791 "} // namespace x\n";
anatofuz
parents:
diff changeset
792
anatofuz
parents:
diff changeset
793 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
794 }
anatofuz
parents:
diff changeset
795
anatofuz
parents:
diff changeset
796 TEST_F(ChangeNamespaceTest, NoMisplaceAtEOF) {
anatofuz
parents:
diff changeset
797 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
798 "namespace nb {\n"
anatofuz
parents:
diff changeset
799 "class A;\n"
anatofuz
parents:
diff changeset
800 "class B {};\n"
anatofuz
parents:
diff changeset
801 "}"
anatofuz
parents:
diff changeset
802 "}";
anatofuz
parents:
diff changeset
803 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
804 "namespace nb {\n"
anatofuz
parents:
diff changeset
805 "class A;\n"
anatofuz
parents:
diff changeset
806 "}\n"
anatofuz
parents:
diff changeset
807 "}\n"
anatofuz
parents:
diff changeset
808 "namespace x {\n"
anatofuz
parents:
diff changeset
809 "namespace y {\n"
anatofuz
parents:
diff changeset
810 "\n"
anatofuz
parents:
diff changeset
811 "class B {};\n"
anatofuz
parents:
diff changeset
812 "} // namespace y\n"
anatofuz
parents:
diff changeset
813 "} // namespace x\n";
anatofuz
parents:
diff changeset
814 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
815 }
anatofuz
parents:
diff changeset
816
anatofuz
parents:
diff changeset
817 TEST_F(ChangeNamespaceTest, CommentsBeforeMovedClass) {
anatofuz
parents:
diff changeset
818 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
819 "namespace nb {\n"
anatofuz
parents:
diff changeset
820 "\n\n"
anatofuz
parents:
diff changeset
821 "// Wild comments.\n"
anatofuz
parents:
diff changeset
822 "\n"
anatofuz
parents:
diff changeset
823 "// Comments.\n"
anatofuz
parents:
diff changeset
824 "// More comments.\n"
anatofuz
parents:
diff changeset
825 "class B {\n"
anatofuz
parents:
diff changeset
826 " // Private comments.\n"
anatofuz
parents:
diff changeset
827 " int a;\n"
anatofuz
parents:
diff changeset
828 "};\n"
anatofuz
parents:
diff changeset
829 "}\n"
anatofuz
parents:
diff changeset
830 "}";
anatofuz
parents:
diff changeset
831 std::string Expected = "\n"
anatofuz
parents:
diff changeset
832 "\n"
anatofuz
parents:
diff changeset
833 "namespace x {\n"
anatofuz
parents:
diff changeset
834 "namespace y {\n"
anatofuz
parents:
diff changeset
835 "\n\n"
anatofuz
parents:
diff changeset
836 "// Wild comments.\n"
anatofuz
parents:
diff changeset
837 "\n"
anatofuz
parents:
diff changeset
838 "// Comments.\n"
anatofuz
parents:
diff changeset
839 "// More comments.\n"
anatofuz
parents:
diff changeset
840 "class B {\n"
anatofuz
parents:
diff changeset
841 " // Private comments.\n"
anatofuz
parents:
diff changeset
842 " int a;\n"
anatofuz
parents:
diff changeset
843 "};\n"
anatofuz
parents:
diff changeset
844 "} // namespace y\n"
anatofuz
parents:
diff changeset
845 "} // namespace x\n";
anatofuz
parents:
diff changeset
846 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
847 }
anatofuz
parents:
diff changeset
848
anatofuz
parents:
diff changeset
849 TEST_F(ChangeNamespaceTest, UsingShadowDeclInGlobal) {
anatofuz
parents:
diff changeset
850 std::string Code = "namespace glob {\n"
anatofuz
parents:
diff changeset
851 "class Glob {};\n"
anatofuz
parents:
diff changeset
852 "void GFunc() {}\n"
anatofuz
parents:
diff changeset
853 "}\n"
anatofuz
parents:
diff changeset
854 "using glob::Glob;\n"
anatofuz
parents:
diff changeset
855 "using glob::GFunc;\n"
anatofuz
parents:
diff changeset
856 "namespace na {\n"
anatofuz
parents:
diff changeset
857 "namespace nb {\n"
anatofuz
parents:
diff changeset
858 "void f() { Glob g; GFunc(); }\n"
anatofuz
parents:
diff changeset
859 "} // namespace nb\n"
anatofuz
parents:
diff changeset
860 "} // namespace na\n";
anatofuz
parents:
diff changeset
861
anatofuz
parents:
diff changeset
862 std::string Expected = "namespace glob {\n"
anatofuz
parents:
diff changeset
863 "class Glob {};\n"
anatofuz
parents:
diff changeset
864 "void GFunc() {}\n"
anatofuz
parents:
diff changeset
865 "}\n"
anatofuz
parents:
diff changeset
866 "using glob::Glob;\n"
anatofuz
parents:
diff changeset
867 "using glob::GFunc;\n"
anatofuz
parents:
diff changeset
868 "\n"
anatofuz
parents:
diff changeset
869 "namespace x {\n"
anatofuz
parents:
diff changeset
870 "namespace y {\n"
anatofuz
parents:
diff changeset
871 "void f() { Glob g; GFunc(); }\n"
anatofuz
parents:
diff changeset
872 "} // namespace y\n"
anatofuz
parents:
diff changeset
873 "} // namespace x\n";
anatofuz
parents:
diff changeset
874 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
875 }
anatofuz
parents:
diff changeset
876
anatofuz
parents:
diff changeset
877 TEST_F(ChangeNamespaceTest, UsingShadowDeclsInAnonymousNamespaces) {
anatofuz
parents:
diff changeset
878 std::string Code = "namespace util {\n"
anatofuz
parents:
diff changeset
879 "class Util {};\n"
anatofuz
parents:
diff changeset
880 "void func() {}\n"
anatofuz
parents:
diff changeset
881 "}\n"
anatofuz
parents:
diff changeset
882 "namespace na {\n"
anatofuz
parents:
diff changeset
883 "namespace nb {\n"
anatofuz
parents:
diff changeset
884 "namespace {\n"
anatofuz
parents:
diff changeset
885 "using ::util::Util;\n"
anatofuz
parents:
diff changeset
886 "using ::util::func;\n"
anatofuz
parents:
diff changeset
887 "void f() { Util u; func(); }\n"
anatofuz
parents:
diff changeset
888 "}\n"
anatofuz
parents:
diff changeset
889 "} // namespace nb\n"
anatofuz
parents:
diff changeset
890 "} // namespace na\n";
anatofuz
parents:
diff changeset
891
anatofuz
parents:
diff changeset
892 std::string Expected = "namespace util {\n"
anatofuz
parents:
diff changeset
893 "class Util {};\n"
anatofuz
parents:
diff changeset
894 "void func() {}\n"
anatofuz
parents:
diff changeset
895 "} // namespace util\n"
anatofuz
parents:
diff changeset
896 "\n"
anatofuz
parents:
diff changeset
897 "namespace x {\n"
anatofuz
parents:
diff changeset
898 "namespace y {\n"
anatofuz
parents:
diff changeset
899 "namespace {\n"
anatofuz
parents:
diff changeset
900 "using ::util::Util;\n"
anatofuz
parents:
diff changeset
901 "using ::util::func;\n"
anatofuz
parents:
diff changeset
902 "void f() { Util u; func(); }\n"
anatofuz
parents:
diff changeset
903 "}\n"
anatofuz
parents:
diff changeset
904 "} // namespace y\n"
anatofuz
parents:
diff changeset
905 "} // namespace x\n";
anatofuz
parents:
diff changeset
906 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
907 }
anatofuz
parents:
diff changeset
908
anatofuz
parents:
diff changeset
909 TEST_F(ChangeNamespaceTest, UsingNamespaceInGlobal) {
anatofuz
parents:
diff changeset
910 std::string Code = "namespace glob {\n"
anatofuz
parents:
diff changeset
911 "class Glob {};\n"
anatofuz
parents:
diff changeset
912 "}\n"
anatofuz
parents:
diff changeset
913 "using namespace glob;\n"
anatofuz
parents:
diff changeset
914 "namespace na {\n"
anatofuz
parents:
diff changeset
915 "namespace nb {\n"
anatofuz
parents:
diff changeset
916 "void f() { Glob g; }\n"
anatofuz
parents:
diff changeset
917 "} // namespace nb\n"
anatofuz
parents:
diff changeset
918 "} // namespace na\n";
anatofuz
parents:
diff changeset
919
anatofuz
parents:
diff changeset
920 std::string Expected = "namespace glob {\n"
anatofuz
parents:
diff changeset
921 "class Glob {};\n"
anatofuz
parents:
diff changeset
922 "}\n"
anatofuz
parents:
diff changeset
923 "using namespace glob;\n"
anatofuz
parents:
diff changeset
924 "\n"
anatofuz
parents:
diff changeset
925 "namespace x {\n"
anatofuz
parents:
diff changeset
926 "namespace y {\n"
anatofuz
parents:
diff changeset
927 "void f() { Glob g; }\n"
anatofuz
parents:
diff changeset
928 "} // namespace y\n"
anatofuz
parents:
diff changeset
929 "} // namespace x\n";
anatofuz
parents:
diff changeset
930 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
931 }
anatofuz
parents:
diff changeset
932
anatofuz
parents:
diff changeset
933 TEST_F(ChangeNamespaceTest, NamespaceAliasInGlobal) {
anatofuz
parents:
diff changeset
934 std::string Code = "namespace glob {\n"
anatofuz
parents:
diff changeset
935 "class Glob {};\n"
anatofuz
parents:
diff changeset
936 "}\n"
anatofuz
parents:
diff changeset
937 "namespace glob2 { class Glob2 {}; }\n"
anatofuz
parents:
diff changeset
938 "namespace gl = glob;\n"
anatofuz
parents:
diff changeset
939 "namespace gl2 = glob2;\n"
anatofuz
parents:
diff changeset
940 "namespace na {\n"
anatofuz
parents:
diff changeset
941 "namespace nb {\n"
anatofuz
parents:
diff changeset
942 "void f() { gl::Glob g; gl2::Glob2 g2; }\n"
anatofuz
parents:
diff changeset
943 "} // namespace nb\n"
anatofuz
parents:
diff changeset
944 "} // namespace na\n";
anatofuz
parents:
diff changeset
945
anatofuz
parents:
diff changeset
946 std::string Expected =
anatofuz
parents:
diff changeset
947 "namespace glob {\n"
anatofuz
parents:
diff changeset
948 "class Glob {};\n"
anatofuz
parents:
diff changeset
949 "}\n"
anatofuz
parents:
diff changeset
950 "namespace glob2 { class Glob2 {}; }\n"
anatofuz
parents:
diff changeset
951 "namespace gl = glob;\n"
anatofuz
parents:
diff changeset
952 "namespace gl2 = glob2;\n"
anatofuz
parents:
diff changeset
953 "\n"
anatofuz
parents:
diff changeset
954 "namespace x {\n"
anatofuz
parents:
diff changeset
955 "namespace y {\n"
anatofuz
parents:
diff changeset
956 "void f() { gl::Glob g; gl2::Glob2 g2; }\n"
anatofuz
parents:
diff changeset
957 "} // namespace y\n"
anatofuz
parents:
diff changeset
958 "} // namespace x\n";
anatofuz
parents:
diff changeset
959 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
960 }
anatofuz
parents:
diff changeset
961
anatofuz
parents:
diff changeset
962 TEST_F(ChangeNamespaceTest, NamespaceAliasInNamespace) {
anatofuz
parents:
diff changeset
963 std::string Code = "namespace glob {\n"
anatofuz
parents:
diff changeset
964 "class Glob {};\n"
anatofuz
parents:
diff changeset
965 "}\n"
anatofuz
parents:
diff changeset
966 "namespace na {\n"
anatofuz
parents:
diff changeset
967 "namespace nb {\n"
anatofuz
parents:
diff changeset
968 "namespace gl = glob;\n"
anatofuz
parents:
diff changeset
969 "void f() { gl::Glob g; }\n"
anatofuz
parents:
diff changeset
970 "} // namespace nb\n"
anatofuz
parents:
diff changeset
971 "} // namespace na\n";
anatofuz
parents:
diff changeset
972
anatofuz
parents:
diff changeset
973 std::string Expected = "namespace glob {\n"
anatofuz
parents:
diff changeset
974 "class Glob {};\n"
anatofuz
parents:
diff changeset
975 "}\n"
anatofuz
parents:
diff changeset
976 "\n"
anatofuz
parents:
diff changeset
977 "namespace x {\n"
anatofuz
parents:
diff changeset
978 "namespace y {\n"
anatofuz
parents:
diff changeset
979 "namespace gl = glob;\n"
anatofuz
parents:
diff changeset
980 "void f() { gl::Glob g; }\n"
anatofuz
parents:
diff changeset
981 "} // namespace y\n"
anatofuz
parents:
diff changeset
982 "} // namespace x\n";
anatofuz
parents:
diff changeset
983 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
984 }
anatofuz
parents:
diff changeset
985
anatofuz
parents:
diff changeset
986 TEST_F(ChangeNamespaceTest, NamespaceAliasInAncestorNamespace) {
anatofuz
parents:
diff changeset
987 NewNamespace = "na::nx";
anatofuz
parents:
diff changeset
988 std::string Code = "namespace glob {\n"
anatofuz
parents:
diff changeset
989 "class Glob {};\n"
anatofuz
parents:
diff changeset
990 "}\n"
anatofuz
parents:
diff changeset
991 "namespace other { namespace gl = glob; }\n"
anatofuz
parents:
diff changeset
992 "namespace na {\n"
anatofuz
parents:
diff changeset
993 "namespace ga = glob;\n"
anatofuz
parents:
diff changeset
994 "namespace nb {\n"
anatofuz
parents:
diff changeset
995 "void f() { ga::Glob g; }\n"
anatofuz
parents:
diff changeset
996 "} // namespace nb\n"
anatofuz
parents:
diff changeset
997 "} // namespace na\n";
anatofuz
parents:
diff changeset
998
anatofuz
parents:
diff changeset
999 std::string Expected = "namespace glob {\n"
anatofuz
parents:
diff changeset
1000 "class Glob {};\n"
anatofuz
parents:
diff changeset
1001 "}\n"
anatofuz
parents:
diff changeset
1002 "namespace other { namespace gl = glob; }\n"
anatofuz
parents:
diff changeset
1003 "namespace na {\n"
anatofuz
parents:
diff changeset
1004 "namespace ga = glob;\n"
anatofuz
parents:
diff changeset
1005 "\n"
anatofuz
parents:
diff changeset
1006 "namespace nx {\n"
anatofuz
parents:
diff changeset
1007 "void f() { ga::Glob g; }\n"
anatofuz
parents:
diff changeset
1008 "} // namespace nx\n"
anatofuz
parents:
diff changeset
1009 "} // namespace na\n";
anatofuz
parents:
diff changeset
1010 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1011 }
anatofuz
parents:
diff changeset
1012
anatofuz
parents:
diff changeset
1013 TEST_F(ChangeNamespaceTest, NamespaceAliasInOtherNamespace) {
anatofuz
parents:
diff changeset
1014 std::string Code = "namespace glob {\n"
anatofuz
parents:
diff changeset
1015 "class Glob {};\n"
anatofuz
parents:
diff changeset
1016 "}\n"
anatofuz
parents:
diff changeset
1017 "namespace other { namespace gl = glob; }\n"
anatofuz
parents:
diff changeset
1018 "namespace na {\n"
anatofuz
parents:
diff changeset
1019 "namespace ga = glob;\n"
anatofuz
parents:
diff changeset
1020 "namespace nb {\n"
anatofuz
parents:
diff changeset
1021 "void f() { glob::Glob g; }\n"
anatofuz
parents:
diff changeset
1022 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1023 "} // namespace na\n";
anatofuz
parents:
diff changeset
1024
anatofuz
parents:
diff changeset
1025 std::string Expected = "namespace glob {\n"
anatofuz
parents:
diff changeset
1026 "class Glob {};\n"
anatofuz
parents:
diff changeset
1027 "}\n"
anatofuz
parents:
diff changeset
1028 "namespace other { namespace gl = glob; }\n"
anatofuz
parents:
diff changeset
1029 "namespace na {\n"
anatofuz
parents:
diff changeset
1030 "namespace ga = glob;\n"
anatofuz
parents:
diff changeset
1031 "\n"
anatofuz
parents:
diff changeset
1032 "} // namespace na\n"
anatofuz
parents:
diff changeset
1033 "namespace x {\n"
anatofuz
parents:
diff changeset
1034 "namespace y {\n"
anatofuz
parents:
diff changeset
1035 "void f() { glob::Glob g; }\n"
anatofuz
parents:
diff changeset
1036 "} // namespace y\n"
anatofuz
parents:
diff changeset
1037 "} // namespace x\n";
anatofuz
parents:
diff changeset
1038 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1039 }
anatofuz
parents:
diff changeset
1040
anatofuz
parents:
diff changeset
1041 TEST_F(ChangeNamespaceTest, UsingDeclAfterReference) {
anatofuz
parents:
diff changeset
1042 std::string Code = "namespace glob {\n"
anatofuz
parents:
diff changeset
1043 "class Glob {};\n"
anatofuz
parents:
diff changeset
1044 "}\n"
anatofuz
parents:
diff changeset
1045 "namespace na {\n"
anatofuz
parents:
diff changeset
1046 "namespace nb {\n"
anatofuz
parents:
diff changeset
1047 "void f() { glob::Glob g; }\n"
anatofuz
parents:
diff changeset
1048 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1049 "} // namespace na\n"
anatofuz
parents:
diff changeset
1050 "using glob::Glob;\n"
anatofuz
parents:
diff changeset
1051 "using namespace glob;\n";
anatofuz
parents:
diff changeset
1052
anatofuz
parents:
diff changeset
1053 std::string Expected = "namespace glob {\n"
anatofuz
parents:
diff changeset
1054 "class Glob {};\n"
anatofuz
parents:
diff changeset
1055 "}\n"
anatofuz
parents:
diff changeset
1056 "\n"
anatofuz
parents:
diff changeset
1057 "namespace x {\n"
anatofuz
parents:
diff changeset
1058 "namespace y {\n"
anatofuz
parents:
diff changeset
1059 "void f() { glob::Glob g; }\n"
anatofuz
parents:
diff changeset
1060 "} // namespace y\n"
anatofuz
parents:
diff changeset
1061 "} // namespace x\n"
anatofuz
parents:
diff changeset
1062 "using glob::Glob;\n"
anatofuz
parents:
diff changeset
1063 "using namespace glob;\n";
anatofuz
parents:
diff changeset
1064 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1065 }
anatofuz
parents:
diff changeset
1066
anatofuz
parents:
diff changeset
1067 TEST_F(ChangeNamespaceTest, UsingNamespaceAfterReference) {
anatofuz
parents:
diff changeset
1068 NewNamespace = "na::nc";
anatofuz
parents:
diff changeset
1069 std::string Code = "namespace glob {\n"
anatofuz
parents:
diff changeset
1070 "class Glob {};\n"
anatofuz
parents:
diff changeset
1071 "}\n"
anatofuz
parents:
diff changeset
1072 "namespace na {\n"
anatofuz
parents:
diff changeset
1073 "namespace nb {\n"
anatofuz
parents:
diff changeset
1074 "void f() { glob::Glob g; }\n"
anatofuz
parents:
diff changeset
1075 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1076 "using namespace glob;\n"
anatofuz
parents:
diff changeset
1077 "} // namespace na\n";
anatofuz
parents:
diff changeset
1078
anatofuz
parents:
diff changeset
1079 std::string Expected = "namespace glob {\n"
anatofuz
parents:
diff changeset
1080 "class Glob {};\n"
anatofuz
parents:
diff changeset
1081 "}\n"
anatofuz
parents:
diff changeset
1082 "namespace na {\n"
anatofuz
parents:
diff changeset
1083 "\n"
anatofuz
parents:
diff changeset
1084 "namespace nc {\n"
anatofuz
parents:
diff changeset
1085 "void f() { glob::Glob g; }\n"
anatofuz
parents:
diff changeset
1086 "} // namespace nc\n"
anatofuz
parents:
diff changeset
1087 "using namespace glob;\n"
anatofuz
parents:
diff changeset
1088 "} // namespace na\n";
anatofuz
parents:
diff changeset
1089 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1090 }
anatofuz
parents:
diff changeset
1091
anatofuz
parents:
diff changeset
1092 TEST_F(ChangeNamespaceTest, UsingNamespaceAndUsingShadowInGlobal) {
anatofuz
parents:
diff changeset
1093 std::string Code = "namespace glob1 {\n"
anatofuz
parents:
diff changeset
1094 "namespace glob2 {\n"
anatofuz
parents:
diff changeset
1095 "class Glob {};\n"
anatofuz
parents:
diff changeset
1096 "}\n"
anatofuz
parents:
diff changeset
1097 "}\n"
anatofuz
parents:
diff changeset
1098 "using glob1::glob2::Glob;\n"
anatofuz
parents:
diff changeset
1099 "using namespace glob1;\n"
anatofuz
parents:
diff changeset
1100 "namespace na {\n"
anatofuz
parents:
diff changeset
1101 "namespace nb {\n"
anatofuz
parents:
diff changeset
1102 "void f() { Glob g; }\n"
anatofuz
parents:
diff changeset
1103 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1104 "} // namespace na\n";
anatofuz
parents:
diff changeset
1105
anatofuz
parents:
diff changeset
1106 std::string Expected = "namespace glob1 {\n"
anatofuz
parents:
diff changeset
1107 "namespace glob2 {\n"
anatofuz
parents:
diff changeset
1108 "class Glob {};\n"
anatofuz
parents:
diff changeset
1109 "}\n"
anatofuz
parents:
diff changeset
1110 "}\n"
anatofuz
parents:
diff changeset
1111 "using glob1::glob2::Glob;\n"
anatofuz
parents:
diff changeset
1112 "using namespace glob1;\n"
anatofuz
parents:
diff changeset
1113 "\n"
anatofuz
parents:
diff changeset
1114 "namespace x {\n"
anatofuz
parents:
diff changeset
1115 "namespace y {\n"
anatofuz
parents:
diff changeset
1116 "void f() { Glob g; }\n"
anatofuz
parents:
diff changeset
1117 "} // namespace y\n"
anatofuz
parents:
diff changeset
1118 "} // namespace x\n";
anatofuz
parents:
diff changeset
1119 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1120 }
anatofuz
parents:
diff changeset
1121
anatofuz
parents:
diff changeset
1122 TEST_F(ChangeNamespaceTest, UsingAliasInGlobal) {
anatofuz
parents:
diff changeset
1123 std::string Code = "namespace glob {\n"
anatofuz
parents:
diff changeset
1124 "class Glob {};\n"
anatofuz
parents:
diff changeset
1125 "}\n"
anatofuz
parents:
diff changeset
1126 "using GLB = glob::Glob;\n"
anatofuz
parents:
diff changeset
1127 "using BLG = glob::Glob;\n"
anatofuz
parents:
diff changeset
1128 "namespace na {\n"
anatofuz
parents:
diff changeset
1129 "namespace nb {\n"
anatofuz
parents:
diff changeset
1130 "void f() { GLB g; BLG blg; }\n"
anatofuz
parents:
diff changeset
1131 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1132 "} // namespace na\n";
anatofuz
parents:
diff changeset
1133
anatofuz
parents:
diff changeset
1134 std::string Expected = "namespace glob {\n"
anatofuz
parents:
diff changeset
1135 "class Glob {};\n"
anatofuz
parents:
diff changeset
1136 "}\n"
anatofuz
parents:
diff changeset
1137 "using GLB = glob::Glob;\n"
anatofuz
parents:
diff changeset
1138 "using BLG = glob::Glob;\n"
anatofuz
parents:
diff changeset
1139 "\n"
anatofuz
parents:
diff changeset
1140 "namespace x {\n"
anatofuz
parents:
diff changeset
1141 "namespace y {\n"
anatofuz
parents:
diff changeset
1142 "void f() { GLB g; BLG blg; }\n"
anatofuz
parents:
diff changeset
1143 "} // namespace y\n"
anatofuz
parents:
diff changeset
1144 "} // namespace x\n";
anatofuz
parents:
diff changeset
1145 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1146 }
anatofuz
parents:
diff changeset
1147
anatofuz
parents:
diff changeset
1148 TEST_F(ChangeNamespaceTest, UsingShadowDeclAndMovedNamespace) {
anatofuz
parents:
diff changeset
1149 std::string Code = "namespace na { class C_A {};\n }\n"
anatofuz
parents:
diff changeset
1150 "using na::C_A;\n"
anatofuz
parents:
diff changeset
1151 "namespace na {\n"
anatofuz
parents:
diff changeset
1152 "namespace nb {\n"
anatofuz
parents:
diff changeset
1153 "class C_X {\n"
anatofuz
parents:
diff changeset
1154 "public:\n"
anatofuz
parents:
diff changeset
1155 " C_A a;\n"
anatofuz
parents:
diff changeset
1156 "};\n"
anatofuz
parents:
diff changeset
1157 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1158 "} // namespace na\n";
anatofuz
parents:
diff changeset
1159 std::string Expected = "namespace na { class C_A {};\n }\n"
anatofuz
parents:
diff changeset
1160 "using na::C_A;\n"
anatofuz
parents:
diff changeset
1161 "\n"
anatofuz
parents:
diff changeset
1162 "namespace x {\n"
anatofuz
parents:
diff changeset
1163 "namespace y {\n"
anatofuz
parents:
diff changeset
1164 "class C_X {\n"
anatofuz
parents:
diff changeset
1165 "public:\n"
anatofuz
parents:
diff changeset
1166 " C_A a;\n"
anatofuz
parents:
diff changeset
1167 "};\n"
anatofuz
parents:
diff changeset
1168 "} // namespace y\n"
anatofuz
parents:
diff changeset
1169 "} // namespace x\n";
anatofuz
parents:
diff changeset
1170 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1171 }
anatofuz
parents:
diff changeset
1172
anatofuz
parents:
diff changeset
1173 TEST_F(ChangeNamespaceTest, UsingNamespaceDeclAndMovedNamespace) {
anatofuz
parents:
diff changeset
1174 std::string Code = "namespace na { class C_A {};\n }\n"
anatofuz
parents:
diff changeset
1175 "using namespace na;\n"
anatofuz
parents:
diff changeset
1176 "namespace na {\n"
anatofuz
parents:
diff changeset
1177 "namespace nb {\n"
anatofuz
parents:
diff changeset
1178 "class C_X {\n"
anatofuz
parents:
diff changeset
1179 "public:\n"
anatofuz
parents:
diff changeset
1180 " C_A ca;\n"
anatofuz
parents:
diff changeset
1181 "};\n"
anatofuz
parents:
diff changeset
1182 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1183 "} // namespace na\n";
anatofuz
parents:
diff changeset
1184 std::string Expected = "namespace na { class C_A {};\n }\n"
anatofuz
parents:
diff changeset
1185 "using namespace na;\n"
anatofuz
parents:
diff changeset
1186 "\n"
anatofuz
parents:
diff changeset
1187 "namespace x {\n"
anatofuz
parents:
diff changeset
1188 "namespace y {\n"
anatofuz
parents:
diff changeset
1189 "class C_X {\n"
anatofuz
parents:
diff changeset
1190 "public:\n"
anatofuz
parents:
diff changeset
1191 " C_A ca;\n"
anatofuz
parents:
diff changeset
1192 "};\n"
anatofuz
parents:
diff changeset
1193 "} // namespace y\n"
anatofuz
parents:
diff changeset
1194 "} // namespace x\n";
anatofuz
parents:
diff changeset
1195 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1196 }
anatofuz
parents:
diff changeset
1197
anatofuz
parents:
diff changeset
1198 TEST_F(ChangeNamespaceTest, UsingShadowDeclInFunction) {
anatofuz
parents:
diff changeset
1199 std::string Code = "namespace glob {\n"
anatofuz
parents:
diff changeset
1200 "class Glob {};\n"
anatofuz
parents:
diff changeset
1201 "}\n"
anatofuz
parents:
diff changeset
1202 "namespace na {\n"
anatofuz
parents:
diff changeset
1203 "namespace nb {\n"
anatofuz
parents:
diff changeset
1204 "void f() {\n"
anatofuz
parents:
diff changeset
1205 " using glob::Glob;\n"
anatofuz
parents:
diff changeset
1206 " Glob g;\n"
anatofuz
parents:
diff changeset
1207 "}\n"
anatofuz
parents:
diff changeset
1208 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1209 "} // namespace na\n";
anatofuz
parents:
diff changeset
1210
anatofuz
parents:
diff changeset
1211 std::string Expected = "namespace glob {\n"
anatofuz
parents:
diff changeset
1212 "class Glob {};\n"
anatofuz
parents:
diff changeset
1213 "}\n"
anatofuz
parents:
diff changeset
1214 "\n"
anatofuz
parents:
diff changeset
1215 "namespace x {\n"
anatofuz
parents:
diff changeset
1216 "namespace y {\n"
anatofuz
parents:
diff changeset
1217 "void f() {\n"
anatofuz
parents:
diff changeset
1218 " using ::glob::Glob;\n"
anatofuz
parents:
diff changeset
1219 " Glob g;\n"
anatofuz
parents:
diff changeset
1220 "}\n"
anatofuz
parents:
diff changeset
1221 "} // namespace y\n"
anatofuz
parents:
diff changeset
1222 "} // namespace x\n";
anatofuz
parents:
diff changeset
1223 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1224 }
anatofuz
parents:
diff changeset
1225
anatofuz
parents:
diff changeset
1226 TEST_F(ChangeNamespaceTest, UsingShadowDeclInClass) {
anatofuz
parents:
diff changeset
1227 std::string Code = "namespace na { class C_A {}; }\n"
anatofuz
parents:
diff changeset
1228 "namespace na {\n"
anatofuz
parents:
diff changeset
1229 "namespace nb {\n"
anatofuz
parents:
diff changeset
1230 "void f() {\n"
anatofuz
parents:
diff changeset
1231 " using ::na::C_A;\n"
anatofuz
parents:
diff changeset
1232 " C_A ca;\n"
anatofuz
parents:
diff changeset
1233 "}\n"
anatofuz
parents:
diff changeset
1234 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1235 "} // namespace na\n";
anatofuz
parents:
diff changeset
1236 std::string Expected = "namespace na { class C_A {}; }\n"
anatofuz
parents:
diff changeset
1237 "\n"
anatofuz
parents:
diff changeset
1238 "namespace x {\n"
anatofuz
parents:
diff changeset
1239 "namespace y {\n"
anatofuz
parents:
diff changeset
1240 "void f() {\n"
anatofuz
parents:
diff changeset
1241 " using ::na::C_A;\n"
anatofuz
parents:
diff changeset
1242 " C_A ca;\n"
anatofuz
parents:
diff changeset
1243 "}\n"
anatofuz
parents:
diff changeset
1244 "} // namespace y\n"
anatofuz
parents:
diff changeset
1245 "} // namespace x\n";
anatofuz
parents:
diff changeset
1246 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1247 }
anatofuz
parents:
diff changeset
1248
anatofuz
parents:
diff changeset
1249 TEST_F(ChangeNamespaceTest, UsingDeclInMovedNamespace) {
anatofuz
parents:
diff changeset
1250 std::string Code = "namespace nx { void f(); }\n"
anatofuz
parents:
diff changeset
1251 "namespace na {\n"
anatofuz
parents:
diff changeset
1252 "using nx::f;\n"
anatofuz
parents:
diff changeset
1253 "namespace nb {\n"
anatofuz
parents:
diff changeset
1254 "void d() { f(); }\n"
anatofuz
parents:
diff changeset
1255 "} // nb\n"
anatofuz
parents:
diff changeset
1256 "} // na\n";
anatofuz
parents:
diff changeset
1257
anatofuz
parents:
diff changeset
1258 std::string Expected = "namespace nx { void f(); }\n"
anatofuz
parents:
diff changeset
1259 "namespace na {\n"
anatofuz
parents:
diff changeset
1260 "using nx::f;\n"
anatofuz
parents:
diff changeset
1261 "\n"
anatofuz
parents:
diff changeset
1262 "} // na\n"
anatofuz
parents:
diff changeset
1263 "namespace x {\n"
anatofuz
parents:
diff changeset
1264 "namespace y {\n"
anatofuz
parents:
diff changeset
1265 "void d() { nx::f(); }\n"
anatofuz
parents:
diff changeset
1266 "} // namespace y\n"
anatofuz
parents:
diff changeset
1267 "} // namespace x\n";
anatofuz
parents:
diff changeset
1268 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1269 }
anatofuz
parents:
diff changeset
1270
anatofuz
parents:
diff changeset
1271 TEST_F(ChangeNamespaceTest, UsingDeclInMovedNamespaceNotNested) {
anatofuz
parents:
diff changeset
1272 OldNamespace = "na";
anatofuz
parents:
diff changeset
1273 std::string Code = "namespace nx { void f(); }\n"
anatofuz
parents:
diff changeset
1274 "namespace na {\n"
anatofuz
parents:
diff changeset
1275 "using ::nx::f;\n"
anatofuz
parents:
diff changeset
1276 "void d() { f(); }\n"
anatofuz
parents:
diff changeset
1277 "} // na\n";
anatofuz
parents:
diff changeset
1278
anatofuz
parents:
diff changeset
1279 std::string Expected = "namespace nx { void f(); }\n"
anatofuz
parents:
diff changeset
1280 "\n"
anatofuz
parents:
diff changeset
1281 "namespace x {\n"
anatofuz
parents:
diff changeset
1282 "namespace y {\n"
anatofuz
parents:
diff changeset
1283 "using ::nx::f;\n"
anatofuz
parents:
diff changeset
1284 "void d() { f(); }\n"
anatofuz
parents:
diff changeset
1285 "} // namespace y\n"
anatofuz
parents:
diff changeset
1286 "} // namespace x\n";
anatofuz
parents:
diff changeset
1287 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1288 }
anatofuz
parents:
diff changeset
1289
anatofuz
parents:
diff changeset
1290 TEST_F(ChangeNamespaceTest, UsingDeclInMovedNamespaceMultiNested) {
anatofuz
parents:
diff changeset
1291 OldNamespace = "a::b::c::d";
anatofuz
parents:
diff changeset
1292 NewNamespace = "a::b::x::y";
anatofuz
parents:
diff changeset
1293 std::string Code = "namespace nx { void f(); void g(); }\n"
anatofuz
parents:
diff changeset
1294 "namespace a {\n"
anatofuz
parents:
diff changeset
1295 "namespace b {\n"
anatofuz
parents:
diff changeset
1296 "using ::nx::f;\n"
anatofuz
parents:
diff changeset
1297 "namespace c {\n"
anatofuz
parents:
diff changeset
1298 "using ::nx::g;\n"
anatofuz
parents:
diff changeset
1299 "namespace d {\n"
anatofuz
parents:
diff changeset
1300 "void d() { f(); g(); }\n"
anatofuz
parents:
diff changeset
1301 "} // d\n"
anatofuz
parents:
diff changeset
1302 "} // c\n"
anatofuz
parents:
diff changeset
1303 "} // b\n"
anatofuz
parents:
diff changeset
1304 "} // a\n";
anatofuz
parents:
diff changeset
1305
anatofuz
parents:
diff changeset
1306 std::string Expected = "namespace nx { void f(); void g(); }\n"
anatofuz
parents:
diff changeset
1307 "namespace a {\n"
anatofuz
parents:
diff changeset
1308 "namespace b {\n"
anatofuz
parents:
diff changeset
1309 "using ::nx::f;\n"
anatofuz
parents:
diff changeset
1310 "namespace c {\n"
anatofuz
parents:
diff changeset
1311 "using ::nx::g;\n"
anatofuz
parents:
diff changeset
1312 "\n"
anatofuz
parents:
diff changeset
1313 "} // c\n"
anatofuz
parents:
diff changeset
1314 "namespace x {\n"
anatofuz
parents:
diff changeset
1315 "namespace y {\n"
anatofuz
parents:
diff changeset
1316 "void d() { f(); nx::g(); }\n"
anatofuz
parents:
diff changeset
1317 "} // namespace y\n"
anatofuz
parents:
diff changeset
1318 "} // namespace x\n"
anatofuz
parents:
diff changeset
1319 "} // b\n"
anatofuz
parents:
diff changeset
1320 "} // a\n";
anatofuz
parents:
diff changeset
1321 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1322 }
anatofuz
parents:
diff changeset
1323
anatofuz
parents:
diff changeset
1324 TEST_F(ChangeNamespaceTest, UsingShadowDeclInTheParentOfOldNamespace) {
anatofuz
parents:
diff changeset
1325 OldNamespace = "nb::nc";
anatofuz
parents:
diff changeset
1326 NewNamespace = "nb::nd";
anatofuz
parents:
diff changeset
1327 std::string Code = "namespace na { class A {}; }\n"
anatofuz
parents:
diff changeset
1328 "namespace nb {\n"
anatofuz
parents:
diff changeset
1329 "using na::A;\n"
anatofuz
parents:
diff changeset
1330 "namespace nc {\n"
anatofuz
parents:
diff changeset
1331 "void d() { A a; }\n"
anatofuz
parents:
diff changeset
1332 "} // nc\n"
anatofuz
parents:
diff changeset
1333 "} // nb\n";
anatofuz
parents:
diff changeset
1334
anatofuz
parents:
diff changeset
1335 std::string Expected = "namespace na { class A {}; }\n"
anatofuz
parents:
diff changeset
1336 "namespace nb {\n"
anatofuz
parents:
diff changeset
1337 "using na::A;\n"
anatofuz
parents:
diff changeset
1338 "\n"
anatofuz
parents:
diff changeset
1339 "namespace nd {\n"
anatofuz
parents:
diff changeset
1340 "void d() { A a; }\n"
anatofuz
parents:
diff changeset
1341 "} // namespace nd\n"
anatofuz
parents:
diff changeset
1342 "} // nb\n";
anatofuz
parents:
diff changeset
1343 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1344 }
anatofuz
parents:
diff changeset
1345
anatofuz
parents:
diff changeset
1346 TEST_F(ChangeNamespaceTest, UsingShadowDeclInOldNamespace) {
anatofuz
parents:
diff changeset
1347 OldNamespace = "nb";
anatofuz
parents:
diff changeset
1348 NewNamespace = "nc";
anatofuz
parents:
diff changeset
1349 std::string Code = "namespace na { class A {}; }\n"
anatofuz
parents:
diff changeset
1350 "namespace nb {\n"
anatofuz
parents:
diff changeset
1351 "using na::A;\n"
anatofuz
parents:
diff changeset
1352 "void d() { A a; }\n"
anatofuz
parents:
diff changeset
1353 "struct X { A a; };\n"
anatofuz
parents:
diff changeset
1354 "} // nb\n";
anatofuz
parents:
diff changeset
1355
anatofuz
parents:
diff changeset
1356 std::string Expected = "namespace na { class A {}; }\n"
anatofuz
parents:
diff changeset
1357 "\n"
anatofuz
parents:
diff changeset
1358 "namespace nc {\n"
anatofuz
parents:
diff changeset
1359 "using ::na::A;\n"
anatofuz
parents:
diff changeset
1360 "void d() { A a; }\n"
anatofuz
parents:
diff changeset
1361 "struct X { A a; };\n"
anatofuz
parents:
diff changeset
1362 "} // namespace nc\n";
anatofuz
parents:
diff changeset
1363 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1364 }
anatofuz
parents:
diff changeset
1365
anatofuz
parents:
diff changeset
1366 TEST_F(ChangeNamespaceTest, UsingShadowDeclOfTemplateClass) {
anatofuz
parents:
diff changeset
1367 OldNamespace = "nb";
anatofuz
parents:
diff changeset
1368 NewNamespace = "nc";
anatofuz
parents:
diff changeset
1369 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
1370 "template <typename T>\n"
anatofuz
parents:
diff changeset
1371 "class A { T t; };\n"
anatofuz
parents:
diff changeset
1372 "} // namespace na\n"
anatofuz
parents:
diff changeset
1373 "namespace nb {\n"
anatofuz
parents:
diff changeset
1374 "using na::A;\n"
anatofuz
parents:
diff changeset
1375 "void d() { A<int> a; }\n"
anatofuz
parents:
diff changeset
1376 "} // nb\n";
anatofuz
parents:
diff changeset
1377
anatofuz
parents:
diff changeset
1378 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
1379 "template <typename T>\n"
anatofuz
parents:
diff changeset
1380 "class A { T t; };\n"
anatofuz
parents:
diff changeset
1381 "} // namespace na\n"
anatofuz
parents:
diff changeset
1382 "\n"
anatofuz
parents:
diff changeset
1383 "namespace nc {\n"
anatofuz
parents:
diff changeset
1384 "using ::na::A;\n"
anatofuz
parents:
diff changeset
1385 "void d() { A<int> a; }\n"
anatofuz
parents:
diff changeset
1386 "} // namespace nc\n";
anatofuz
parents:
diff changeset
1387 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1388 }
anatofuz
parents:
diff changeset
1389
anatofuz
parents:
diff changeset
1390 TEST_F(ChangeNamespaceTest, UsingShadowDeclOfTemplateFunction) {
anatofuz
parents:
diff changeset
1391 OldNamespace = "nb";
anatofuz
parents:
diff changeset
1392 NewNamespace = "nc";
anatofuz
parents:
diff changeset
1393 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
1394 "template <typename T>\n"
anatofuz
parents:
diff changeset
1395 "void f() { T t; };\n"
anatofuz
parents:
diff changeset
1396 "} // namespace na\n"
anatofuz
parents:
diff changeset
1397 "namespace nb {\n"
anatofuz
parents:
diff changeset
1398 "using na::f;\n"
anatofuz
parents:
diff changeset
1399 "void d() { f<int>(); }\n"
anatofuz
parents:
diff changeset
1400 "} // nb\n";
anatofuz
parents:
diff changeset
1401
anatofuz
parents:
diff changeset
1402 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
1403 "template <typename T>\n"
anatofuz
parents:
diff changeset
1404 "void f() { T t; };\n"
anatofuz
parents:
diff changeset
1405 "} // namespace na\n"
anatofuz
parents:
diff changeset
1406 "\n"
anatofuz
parents:
diff changeset
1407 "namespace nc {\n"
anatofuz
parents:
diff changeset
1408 "using ::na::f;\n"
anatofuz
parents:
diff changeset
1409 "void d() { f<int>(); }\n"
anatofuz
parents:
diff changeset
1410 "} // namespace nc\n";
anatofuz
parents:
diff changeset
1411 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1412 }
anatofuz
parents:
diff changeset
1413
anatofuz
parents:
diff changeset
1414 TEST_F(ChangeNamespaceTest, UsingAliasDecl) {
anatofuz
parents:
diff changeset
1415 std::string Code =
anatofuz
parents:
diff changeset
1416 "namespace nx { namespace ny { class X {}; } }\n"
anatofuz
parents:
diff changeset
1417 "namespace na {\n"
anatofuz
parents:
diff changeset
1418 "namespace nb {\n"
anatofuz
parents:
diff changeset
1419 "using Y = nx::ny::X;\n"
anatofuz
parents:
diff changeset
1420 "void f() { Y y; }\n"
anatofuz
parents:
diff changeset
1421 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1422 "} // namespace na\n";
anatofuz
parents:
diff changeset
1423
anatofuz
parents:
diff changeset
1424 std::string Expected = "namespace nx { namespace ny { class X {}; } }\n"
anatofuz
parents:
diff changeset
1425 "\n"
anatofuz
parents:
diff changeset
1426 "namespace x {\n"
anatofuz
parents:
diff changeset
1427 "namespace y {\n"
anatofuz
parents:
diff changeset
1428 "using Y = nx::ny::X;\n"
anatofuz
parents:
diff changeset
1429 "void f() { Y y; }\n"
anatofuz
parents:
diff changeset
1430 "} // namespace y\n"
anatofuz
parents:
diff changeset
1431 "} // namespace x\n";
anatofuz
parents:
diff changeset
1432 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1433 }
anatofuz
parents:
diff changeset
1434
anatofuz
parents:
diff changeset
1435 TEST_F(ChangeNamespaceTest, UsingAliasDeclInGlobal) {
anatofuz
parents:
diff changeset
1436 std::string Code =
anatofuz
parents:
diff changeset
1437 "namespace nx { namespace ny { class X {}; } }\n"
anatofuz
parents:
diff changeset
1438 "using Y = nx::ny::X;\n"
anatofuz
parents:
diff changeset
1439 "namespace na {\n"
anatofuz
parents:
diff changeset
1440 "namespace nb {\n"
anatofuz
parents:
diff changeset
1441 "void f() { Y y; }\n"
anatofuz
parents:
diff changeset
1442 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1443 "} // namespace na\n";
anatofuz
parents:
diff changeset
1444
anatofuz
parents:
diff changeset
1445 std::string Expected = "namespace nx { namespace ny { class X {}; } }\n"
anatofuz
parents:
diff changeset
1446 "using Y = nx::ny::X;\n"
anatofuz
parents:
diff changeset
1447 "\n"
anatofuz
parents:
diff changeset
1448 "namespace x {\n"
anatofuz
parents:
diff changeset
1449 "namespace y {\n"
anatofuz
parents:
diff changeset
1450 "void f() { Y y; }\n"
anatofuz
parents:
diff changeset
1451 "} // namespace y\n"
anatofuz
parents:
diff changeset
1452 "} // namespace x\n";
anatofuz
parents:
diff changeset
1453 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1454 }
anatofuz
parents:
diff changeset
1455
anatofuz
parents:
diff changeset
1456
anatofuz
parents:
diff changeset
1457 TEST_F(ChangeNamespaceTest, TypedefAliasDecl) {
anatofuz
parents:
diff changeset
1458 std::string Code =
anatofuz
parents:
diff changeset
1459 "namespace nx { namespace ny { class X {}; } }\n"
anatofuz
parents:
diff changeset
1460 "namespace na {\n"
anatofuz
parents:
diff changeset
1461 "namespace nb {\n"
anatofuz
parents:
diff changeset
1462 "typedef nx::ny::X Y;\n"
anatofuz
parents:
diff changeset
1463 "void f() { Y y; }\n"
anatofuz
parents:
diff changeset
1464 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1465 "} // namespace na\n";
anatofuz
parents:
diff changeset
1466
anatofuz
parents:
diff changeset
1467 std::string Expected = "namespace nx { namespace ny { class X {}; } }\n"
anatofuz
parents:
diff changeset
1468 "\n"
anatofuz
parents:
diff changeset
1469 "namespace x {\n"
anatofuz
parents:
diff changeset
1470 "namespace y {\n"
anatofuz
parents:
diff changeset
1471 "typedef nx::ny::X Y;\n"
anatofuz
parents:
diff changeset
1472 "void f() { Y y; }\n"
anatofuz
parents:
diff changeset
1473 "} // namespace y\n"
anatofuz
parents:
diff changeset
1474 "} // namespace x\n";
anatofuz
parents:
diff changeset
1475 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1476 }
anatofuz
parents:
diff changeset
1477
anatofuz
parents:
diff changeset
1478 TEST_F(ChangeNamespaceTest, DerivedClassWithConstructors) {
anatofuz
parents:
diff changeset
1479 std::string Code =
anatofuz
parents:
diff changeset
1480 "namespace nx { namespace ny { class X { public: X(int i) {} }; } }\n"
anatofuz
parents:
diff changeset
1481 "namespace na {\n"
anatofuz
parents:
diff changeset
1482 "namespace nb {\n"
anatofuz
parents:
diff changeset
1483 "class A : public nx::ny::X {\n"
anatofuz
parents:
diff changeset
1484 "public:\n"
anatofuz
parents:
diff changeset
1485 " A() : X(0) {}\n"
anatofuz
parents:
diff changeset
1486 " A(int i);\n"
anatofuz
parents:
diff changeset
1487 "};\n"
anatofuz
parents:
diff changeset
1488 "A::A(int i) : X(i) {}\n"
anatofuz
parents:
diff changeset
1489 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1490 "} // namespace na\n";
anatofuz
parents:
diff changeset
1491 std::string Expected =
anatofuz
parents:
diff changeset
1492 "namespace nx { namespace ny { class X { public: X(int i) {} }; } }\n"
anatofuz
parents:
diff changeset
1493 "\n\n"
anatofuz
parents:
diff changeset
1494 "namespace x {\n"
anatofuz
parents:
diff changeset
1495 "namespace y {\n"
anatofuz
parents:
diff changeset
1496 "class A : public nx::ny::X {\n"
anatofuz
parents:
diff changeset
1497 "public:\n"
anatofuz
parents:
diff changeset
1498 " A() : X(0) {}\n"
anatofuz
parents:
diff changeset
1499 " A(int i);\n"
anatofuz
parents:
diff changeset
1500 "};\n"
anatofuz
parents:
diff changeset
1501 "A::A(int i) : X(i) {}\n"
anatofuz
parents:
diff changeset
1502 "} // namespace y\n"
anatofuz
parents:
diff changeset
1503 "} // namespace x\n";
anatofuz
parents:
diff changeset
1504 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1505 }
anatofuz
parents:
diff changeset
1506
anatofuz
parents:
diff changeset
1507 TEST_F(ChangeNamespaceTest, DerivedClassWithQualifiedConstructors) {
anatofuz
parents:
diff changeset
1508 std::string Code =
anatofuz
parents:
diff changeset
1509 "namespace nx { namespace ny { class X { public: X(int i) {} }; } }\n"
anatofuz
parents:
diff changeset
1510 "namespace na {\n"
anatofuz
parents:
diff changeset
1511 "namespace nb {\n"
anatofuz
parents:
diff changeset
1512 "class A : public nx::ny::X {\n"
anatofuz
parents:
diff changeset
1513 "public:\n"
anatofuz
parents:
diff changeset
1514 " A() : X::X(0) {}\n"
anatofuz
parents:
diff changeset
1515 " A(int i);\n"
anatofuz
parents:
diff changeset
1516 "};\n"
anatofuz
parents:
diff changeset
1517 "A::A(int i) : X::X(i) {}\n"
anatofuz
parents:
diff changeset
1518 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1519 "} // namespace na\n";
anatofuz
parents:
diff changeset
1520 std::string Expected =
anatofuz
parents:
diff changeset
1521 "namespace nx { namespace ny { class X { public: X(int i) {} }; } }\n"
anatofuz
parents:
diff changeset
1522 "\n\n"
anatofuz
parents:
diff changeset
1523 "namespace x {\n"
anatofuz
parents:
diff changeset
1524 "namespace y {\n"
anatofuz
parents:
diff changeset
1525 "class A : public nx::ny::X {\n"
anatofuz
parents:
diff changeset
1526 "public:\n"
anatofuz
parents:
diff changeset
1527 " A() : X::X(0) {}\n"
anatofuz
parents:
diff changeset
1528 " A(int i);\n"
anatofuz
parents:
diff changeset
1529 "};\n"
anatofuz
parents:
diff changeset
1530 "A::A(int i) : X::X(i) {}\n"
anatofuz
parents:
diff changeset
1531 "} // namespace y\n"
anatofuz
parents:
diff changeset
1532 "} // namespace x\n";
anatofuz
parents:
diff changeset
1533 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1534 }
anatofuz
parents:
diff changeset
1535
anatofuz
parents:
diff changeset
1536 TEST_F(ChangeNamespaceTest, DerivedClassWithConstructorsAndTypeRefs) {
anatofuz
parents:
diff changeset
1537 std::string Code =
anatofuz
parents:
diff changeset
1538 "namespace nx { namespace ny { class X { public: X(int i) {} }; } }\n"
anatofuz
parents:
diff changeset
1539 "namespace na {\n"
anatofuz
parents:
diff changeset
1540 "namespace nb {\n"
anatofuz
parents:
diff changeset
1541 "class A : public nx::ny::X {\n"
anatofuz
parents:
diff changeset
1542 "public:\n"
anatofuz
parents:
diff changeset
1543 " A() : X(0) {}\n"
anatofuz
parents:
diff changeset
1544 " A(int i);\n"
anatofuz
parents:
diff changeset
1545 "};\n"
anatofuz
parents:
diff changeset
1546 "A::A(int i) : X(i) { X x(1);}\n"
anatofuz
parents:
diff changeset
1547 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1548 "} // namespace na\n";
anatofuz
parents:
diff changeset
1549 std::string Expected =
anatofuz
parents:
diff changeset
1550 "namespace nx { namespace ny { class X { public: X(int i) {} }; } }\n"
anatofuz
parents:
diff changeset
1551 "\n\n"
anatofuz
parents:
diff changeset
1552 "namespace x {\n"
anatofuz
parents:
diff changeset
1553 "namespace y {\n"
anatofuz
parents:
diff changeset
1554 "class A : public nx::ny::X {\n"
anatofuz
parents:
diff changeset
1555 "public:\n"
anatofuz
parents:
diff changeset
1556 " A() : X(0) {}\n"
anatofuz
parents:
diff changeset
1557 " A(int i);\n"
anatofuz
parents:
diff changeset
1558 "};\n"
anatofuz
parents:
diff changeset
1559 "A::A(int i) : X(i) { nx::ny::X x(1);}\n"
anatofuz
parents:
diff changeset
1560 "} // namespace y\n"
anatofuz
parents:
diff changeset
1561 "} // namespace x\n";
anatofuz
parents:
diff changeset
1562 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1563 }
anatofuz
parents:
diff changeset
1564
anatofuz
parents:
diff changeset
1565 TEST_F(ChangeNamespaceTest, MoveToGlobalNamespace) {
anatofuz
parents:
diff changeset
1566 NewNamespace = "";
anatofuz
parents:
diff changeset
1567 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
1568 "class C_A {};\n"
anatofuz
parents:
diff changeset
1569 "namespace nc {\n"
anatofuz
parents:
diff changeset
1570 "class C_C {};"
anatofuz
parents:
diff changeset
1571 "} // namespace nc\n"
anatofuz
parents:
diff changeset
1572 "namespace nb {\n"
anatofuz
parents:
diff changeset
1573 "class C_X {\n"
anatofuz
parents:
diff changeset
1574 "public:\n"
anatofuz
parents:
diff changeset
1575 " C_A a;\n"
anatofuz
parents:
diff changeset
1576 " nc::C_C c;\n"
anatofuz
parents:
diff changeset
1577 "};\n"
anatofuz
parents:
diff changeset
1578 "class C_Y {\n"
anatofuz
parents:
diff changeset
1579 " C_X x;\n"
anatofuz
parents:
diff changeset
1580 "};\n"
anatofuz
parents:
diff changeset
1581 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1582 "} // namespace na\n";
anatofuz
parents:
diff changeset
1583 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
1584 "class C_A {};\n"
anatofuz
parents:
diff changeset
1585 "namespace nc {\n"
anatofuz
parents:
diff changeset
1586 "class C_C {};"
anatofuz
parents:
diff changeset
1587 "} // namespace nc\n"
anatofuz
parents:
diff changeset
1588 "\n"
anatofuz
parents:
diff changeset
1589 "} // namespace na\n"
anatofuz
parents:
diff changeset
1590 "class C_X {\n"
anatofuz
parents:
diff changeset
1591 "public:\n"
anatofuz
parents:
diff changeset
1592 " na::C_A a;\n"
anatofuz
parents:
diff changeset
1593 " na::nc::C_C c;\n"
anatofuz
parents:
diff changeset
1594 "};\n"
anatofuz
parents:
diff changeset
1595 "class C_Y {\n"
anatofuz
parents:
diff changeset
1596 " C_X x;\n"
anatofuz
parents:
diff changeset
1597 "};\n";
anatofuz
parents:
diff changeset
1598 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1599 }
anatofuz
parents:
diff changeset
1600
anatofuz
parents:
diff changeset
1601 TEST_F(ChangeNamespaceTest, KeepGlobalSpecifier) {
anatofuz
parents:
diff changeset
1602 std::string Code = "class Glob {};\n"
anatofuz
parents:
diff changeset
1603 "namespace na {\n"
anatofuz
parents:
diff changeset
1604 "class C_A {};\n"
anatofuz
parents:
diff changeset
1605 "namespace nc {\n"
anatofuz
parents:
diff changeset
1606 "class C_C {};"
anatofuz
parents:
diff changeset
1607 "} // namespace nc\n"
anatofuz
parents:
diff changeset
1608 "namespace nb {\n"
anatofuz
parents:
diff changeset
1609 "class C_X {\n"
anatofuz
parents:
diff changeset
1610 "public:\n"
anatofuz
parents:
diff changeset
1611 " ::Glob glob_1;\n"
anatofuz
parents:
diff changeset
1612 " Glob glob_2;\n"
anatofuz
parents:
diff changeset
1613 " C_A a_1;\n"
anatofuz
parents:
diff changeset
1614 " ::na::C_A a_2;\n"
anatofuz
parents:
diff changeset
1615 " nc::C_C c;\n"
anatofuz
parents:
diff changeset
1616 "};\n"
anatofuz
parents:
diff changeset
1617 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1618 "} // namespace na\n";
anatofuz
parents:
diff changeset
1619 std::string Expected = "class Glob {};\n"
anatofuz
parents:
diff changeset
1620 "namespace na {\n"
anatofuz
parents:
diff changeset
1621 "class C_A {};\n"
anatofuz
parents:
diff changeset
1622 "namespace nc {\n"
anatofuz
parents:
diff changeset
1623 "class C_C {};"
anatofuz
parents:
diff changeset
1624 "} // namespace nc\n"
anatofuz
parents:
diff changeset
1625 "\n"
anatofuz
parents:
diff changeset
1626 "} // namespace na\n"
anatofuz
parents:
diff changeset
1627 "namespace x {\n"
anatofuz
parents:
diff changeset
1628 "namespace y {\n"
anatofuz
parents:
diff changeset
1629 "class C_X {\n"
anatofuz
parents:
diff changeset
1630 "public:\n"
anatofuz
parents:
diff changeset
1631 " ::Glob glob_1;\n"
anatofuz
parents:
diff changeset
1632 " Glob glob_2;\n"
anatofuz
parents:
diff changeset
1633 " na::C_A a_1;\n"
anatofuz
parents:
diff changeset
1634 " ::na::C_A a_2;\n"
anatofuz
parents:
diff changeset
1635 " na::nc::C_C c;\n"
anatofuz
parents:
diff changeset
1636 "};\n"
anatofuz
parents:
diff changeset
1637 "} // namespace y\n"
anatofuz
parents:
diff changeset
1638 "} // namespace x\n";
anatofuz
parents:
diff changeset
1639 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1640 }
anatofuz
parents:
diff changeset
1641
anatofuz
parents:
diff changeset
1642 TEST_F(ChangeNamespaceTest, UsingAliasInTemplate) {
anatofuz
parents:
diff changeset
1643 NewNamespace = "na::nb::nc";
anatofuz
parents:
diff changeset
1644 std::string Code = "namespace some_ns {\n"
anatofuz
parents:
diff changeset
1645 "template <typename T, typename S>\n"
anatofuz
parents:
diff changeset
1646 "class G {};\n"
anatofuz
parents:
diff changeset
1647 "} // namespace some_ns\n"
anatofuz
parents:
diff changeset
1648 "namespace na {\n"
anatofuz
parents:
diff changeset
1649 "template<typename P>\n"
anatofuz
parents:
diff changeset
1650 "using GG = some_ns::G<int, P>;\n"
anatofuz
parents:
diff changeset
1651 "} // namespace na\n"
anatofuz
parents:
diff changeset
1652 "namespace na {\n"
anatofuz
parents:
diff changeset
1653 "namespace nb {\n"
anatofuz
parents:
diff changeset
1654 "void f() {\n"
anatofuz
parents:
diff changeset
1655 " GG<float> g;\n"
anatofuz
parents:
diff changeset
1656 "}\n"
anatofuz
parents:
diff changeset
1657 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1658 "} // namespace na\n";
anatofuz
parents:
diff changeset
1659 std::string Expected = "namespace some_ns {\n"
anatofuz
parents:
diff changeset
1660 "template <typename T, typename S>\n"
anatofuz
parents:
diff changeset
1661 "class G {};\n"
anatofuz
parents:
diff changeset
1662 "} // namespace some_ns\n"
anatofuz
parents:
diff changeset
1663 "namespace na {\n"
anatofuz
parents:
diff changeset
1664 "template<typename P>\n"
anatofuz
parents:
diff changeset
1665 "using GG = some_ns::G<int, P>;\n"
anatofuz
parents:
diff changeset
1666 "} // namespace na\n"
anatofuz
parents:
diff changeset
1667 "namespace na {\n"
anatofuz
parents:
diff changeset
1668 "namespace nb {\n"
anatofuz
parents:
diff changeset
1669 "namespace nc {\n"
anatofuz
parents:
diff changeset
1670 "void f() {\n"
anatofuz
parents:
diff changeset
1671 " GG<float> g;\n"
anatofuz
parents:
diff changeset
1672 "}\n"
anatofuz
parents:
diff changeset
1673 "} // namespace nc\n"
anatofuz
parents:
diff changeset
1674 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1675 "} // namespace na\n";
anatofuz
parents:
diff changeset
1676 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1677 }
anatofuz
parents:
diff changeset
1678
anatofuz
parents:
diff changeset
1679 TEST_F(ChangeNamespaceTest, TemplateUsingAliasInBaseClass) {
anatofuz
parents:
diff changeset
1680 NewNamespace = "na::nb::nc";
anatofuz
parents:
diff changeset
1681 std::string Code = "namespace some_ns {\n"
anatofuz
parents:
diff changeset
1682 "template <typename T, typename S>\n"
anatofuz
parents:
diff changeset
1683 "class G {};\n"
anatofuz
parents:
diff changeset
1684 "} // namespace some_ns\n"
anatofuz
parents:
diff changeset
1685 "namespace na {\n"
anatofuz
parents:
diff changeset
1686 "class Base {\n"
anatofuz
parents:
diff changeset
1687 "public:\n"
anatofuz
parents:
diff changeset
1688 " template<typename P>\n"
anatofuz
parents:
diff changeset
1689 " using GG = some_ns::G<int, P>;\n"
anatofuz
parents:
diff changeset
1690 "\n"
anatofuz
parents:
diff changeset
1691 " struct Nested {};\n"
anatofuz
parents:
diff changeset
1692 "};\n"
anatofuz
parents:
diff changeset
1693 "class Derived : public Base {};\n"
anatofuz
parents:
diff changeset
1694 "} // namespace na\n"
anatofuz
parents:
diff changeset
1695 "namespace na {\n"
anatofuz
parents:
diff changeset
1696 "namespace nb {\n"
anatofuz
parents:
diff changeset
1697 "void f() {\n"
anatofuz
parents:
diff changeset
1698 " Derived::GG<float> g;\n"
anatofuz
parents:
diff changeset
1699 " const Derived::GG<int> gg;\n"
anatofuz
parents:
diff changeset
1700 " const Derived::GG<int>* gg_ptr;\n"
anatofuz
parents:
diff changeset
1701 " struct Derived::Nested nested;\n"
anatofuz
parents:
diff changeset
1702 " const struct Derived::Nested *nested_ptr;\n"
anatofuz
parents:
diff changeset
1703 "}\n"
anatofuz
parents:
diff changeset
1704 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1705 "} // namespace na\n";
anatofuz
parents:
diff changeset
1706 std::string Expected = "namespace some_ns {\n"
anatofuz
parents:
diff changeset
1707 "template <typename T, typename S>\n"
anatofuz
parents:
diff changeset
1708 "class G {};\n"
anatofuz
parents:
diff changeset
1709 "} // namespace some_ns\n"
anatofuz
parents:
diff changeset
1710 "namespace na {\n"
anatofuz
parents:
diff changeset
1711 "class Base {\n"
anatofuz
parents:
diff changeset
1712 "public:\n"
anatofuz
parents:
diff changeset
1713 " template<typename P>\n"
anatofuz
parents:
diff changeset
1714 " using GG = some_ns::G<int, P>;\n"
anatofuz
parents:
diff changeset
1715 "\n"
anatofuz
parents:
diff changeset
1716 " struct Nested {};\n"
anatofuz
parents:
diff changeset
1717 "};\n"
anatofuz
parents:
diff changeset
1718 "class Derived : public Base {};\n"
anatofuz
parents:
diff changeset
1719 "} // namespace na\n"
anatofuz
parents:
diff changeset
1720 "namespace na {\n"
anatofuz
parents:
diff changeset
1721 "namespace nb {\n"
anatofuz
parents:
diff changeset
1722 "namespace nc {\n"
anatofuz
parents:
diff changeset
1723 "void f() {\n"
anatofuz
parents:
diff changeset
1724 " Derived::GG<float> g;\n"
anatofuz
parents:
diff changeset
1725 " const Derived::GG<int> gg;\n"
anatofuz
parents:
diff changeset
1726 " const Derived::GG<int>* gg_ptr;\n"
anatofuz
parents:
diff changeset
1727 " struct Derived::Nested nested;\n"
anatofuz
parents:
diff changeset
1728 " const struct Derived::Nested *nested_ptr;\n"
anatofuz
parents:
diff changeset
1729 "}\n"
anatofuz
parents:
diff changeset
1730 "} // namespace nc\n"
anatofuz
parents:
diff changeset
1731 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1732 "} // namespace na\n";
anatofuz
parents:
diff changeset
1733 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1734 }
anatofuz
parents:
diff changeset
1735
anatofuz
parents:
diff changeset
1736 TEST_F(ChangeNamespaceTest, ExistingNamespaceConflictWithNewNamespace) {
anatofuz
parents:
diff changeset
1737 OldNamespace = "nx";
anatofuz
parents:
diff changeset
1738 NewNamespace = "ny::na::nc";
anatofuz
parents:
diff changeset
1739 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
1740 "class A {};\n"
anatofuz
parents:
diff changeset
1741 "} // namespace na\n"
anatofuz
parents:
diff changeset
1742 "namespace nb {\n"
anatofuz
parents:
diff changeset
1743 "class B {};\n"
anatofuz
parents:
diff changeset
1744 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1745 "namespace nx {\n"
anatofuz
parents:
diff changeset
1746 "class X {\n"
anatofuz
parents:
diff changeset
1747 " na::A a; nb::B b;\n"
anatofuz
parents:
diff changeset
1748 "};\n"
anatofuz
parents:
diff changeset
1749 "} // namespace nx\n";
anatofuz
parents:
diff changeset
1750 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
1751 "class A {};\n"
anatofuz
parents:
diff changeset
1752 "} // namespace na\n"
anatofuz
parents:
diff changeset
1753 "namespace nb {\n"
anatofuz
parents:
diff changeset
1754 "class B {};\n"
anatofuz
parents:
diff changeset
1755 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1756 "\n"
anatofuz
parents:
diff changeset
1757 "namespace ny {\n"
anatofuz
parents:
diff changeset
1758 "namespace na {\n"
anatofuz
parents:
diff changeset
1759 "namespace nc {\n"
anatofuz
parents:
diff changeset
1760 "class X {\n"
anatofuz
parents:
diff changeset
1761 " ::na::A a; nb::B b;\n"
anatofuz
parents:
diff changeset
1762 "};\n"
anatofuz
parents:
diff changeset
1763 "} // namespace nc\n"
anatofuz
parents:
diff changeset
1764 "} // namespace na\n"
anatofuz
parents:
diff changeset
1765 "} // namespace ny\n";
anatofuz
parents:
diff changeset
1766 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1767 }
anatofuz
parents:
diff changeset
1768
anatofuz
parents:
diff changeset
1769 TEST_F(ChangeNamespaceTest, SymbolConflictWithNewNamespace) {
anatofuz
parents:
diff changeset
1770 OldNamespace = "nx";
anatofuz
parents:
diff changeset
1771 NewNamespace = "ny::na::nc";
anatofuz
parents:
diff changeset
1772 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
1773 "class A {};\n"
anatofuz
parents:
diff changeset
1774 "namespace nb {\n"
anatofuz
parents:
diff changeset
1775 "class B {};\n"
anatofuz
parents:
diff changeset
1776 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1777 "} // namespace na\n"
anatofuz
parents:
diff changeset
1778 "namespace ny {\n"
anatofuz
parents:
diff changeset
1779 "class Y {};\n"
anatofuz
parents:
diff changeset
1780 "}\n"
anatofuz
parents:
diff changeset
1781 "namespace nx {\n"
anatofuz
parents:
diff changeset
1782 "class X {\n"
anatofuz
parents:
diff changeset
1783 " na::A a; na::nb::B b;\n"
anatofuz
parents:
diff changeset
1784 " ny::Y y;"
anatofuz
parents:
diff changeset
1785 "};\n"
anatofuz
parents:
diff changeset
1786 "} // namespace nx\n";
anatofuz
parents:
diff changeset
1787 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
1788 "class A {};\n"
anatofuz
parents:
diff changeset
1789 "namespace nb {\n"
anatofuz
parents:
diff changeset
1790 "class B {};\n"
anatofuz
parents:
diff changeset
1791 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1792 "} // namespace na\n"
anatofuz
parents:
diff changeset
1793 "namespace ny {\n"
anatofuz
parents:
diff changeset
1794 "class Y {};\n"
anatofuz
parents:
diff changeset
1795 "}\n"
anatofuz
parents:
diff changeset
1796 "\n"
anatofuz
parents:
diff changeset
1797 "namespace ny {\n"
anatofuz
parents:
diff changeset
1798 "namespace na {\n"
anatofuz
parents:
diff changeset
1799 "namespace nc {\n"
anatofuz
parents:
diff changeset
1800 "class X {\n"
anatofuz
parents:
diff changeset
1801 " ::na::A a; ::na::nb::B b;\n"
anatofuz
parents:
diff changeset
1802 " Y y;\n"
anatofuz
parents:
diff changeset
1803 "};\n"
anatofuz
parents:
diff changeset
1804 "} // namespace nc\n"
anatofuz
parents:
diff changeset
1805 "} // namespace na\n"
anatofuz
parents:
diff changeset
1806 "} // namespace ny\n";
anatofuz
parents:
diff changeset
1807 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1808 }
anatofuz
parents:
diff changeset
1809
anatofuz
parents:
diff changeset
1810 TEST_F(ChangeNamespaceTest, ShortenNamespaceSpecifier) {
anatofuz
parents:
diff changeset
1811 OldNamespace = "nx";
anatofuz
parents:
diff changeset
1812 NewNamespace = "ny::na";
anatofuz
parents:
diff changeset
1813 std::string Code = "class G {};\n"
anatofuz
parents:
diff changeset
1814 "namespace ny {\n"
anatofuz
parents:
diff changeset
1815 "class Y {};\n"
anatofuz
parents:
diff changeset
1816 "namespace na {\n"
anatofuz
parents:
diff changeset
1817 "class A {};\n"
anatofuz
parents:
diff changeset
1818 "namespace nc { class C {}; } // namespace nc\n"
anatofuz
parents:
diff changeset
1819 "}\n // namespace na\n"
anatofuz
parents:
diff changeset
1820 "}\n // namespace ny\n"
anatofuz
parents:
diff changeset
1821 "namespace nx {\n"
anatofuz
parents:
diff changeset
1822 "class X {\n"
anatofuz
parents:
diff changeset
1823 " G g; ny::Y y; ny::na::A a; ny::na::nc::C c;\n"
anatofuz
parents:
diff changeset
1824 "};\n"
anatofuz
parents:
diff changeset
1825 "} // namespace nx\n";
anatofuz
parents:
diff changeset
1826 std::string Expected = "class G {};\n"
anatofuz
parents:
diff changeset
1827 "namespace ny {\n"
anatofuz
parents:
diff changeset
1828 "class Y {};\n"
anatofuz
parents:
diff changeset
1829 "namespace na {\n"
anatofuz
parents:
diff changeset
1830 "class A {};\n"
anatofuz
parents:
diff changeset
1831 "namespace nc { class C {}; } // namespace nc\n"
anatofuz
parents:
diff changeset
1832 "}\n // namespace na\n"
anatofuz
parents:
diff changeset
1833 "}\n // namespace ny\n"
anatofuz
parents:
diff changeset
1834 "\n"
anatofuz
parents:
diff changeset
1835 "namespace ny {\n"
anatofuz
parents:
diff changeset
1836 "namespace na {\n"
anatofuz
parents:
diff changeset
1837 "class X {\n"
anatofuz
parents:
diff changeset
1838 " G g; Y y; A a; nc::C c;\n"
anatofuz
parents:
diff changeset
1839 "};\n"
anatofuz
parents:
diff changeset
1840 "} // namespace na\n"
anatofuz
parents:
diff changeset
1841 "} // namespace ny\n";
anatofuz
parents:
diff changeset
1842 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1843 }
anatofuz
parents:
diff changeset
1844
anatofuz
parents:
diff changeset
1845 TEST_F(ChangeNamespaceTest, ShortenNamespaceSpecifierInAnonymousNamespace) {
anatofuz
parents:
diff changeset
1846 OldNamespace = "nx";
anatofuz
parents:
diff changeset
1847 NewNamespace = "ny::na";
anatofuz
parents:
diff changeset
1848 std::string Code = "class G {};\n"
anatofuz
parents:
diff changeset
1849 "namespace ny {\n"
anatofuz
parents:
diff changeset
1850 "class Y {};\n"
anatofuz
parents:
diff changeset
1851 "namespace na {\n"
anatofuz
parents:
diff changeset
1852 "class A {};\n"
anatofuz
parents:
diff changeset
1853 "namespace nc { class C {}; } // namespace nc\n"
anatofuz
parents:
diff changeset
1854 "}\n // namespace na\n"
anatofuz
parents:
diff changeset
1855 "}\n // namespace ny\n"
anatofuz
parents:
diff changeset
1856 "namespace nx {\n"
anatofuz
parents:
diff changeset
1857 "namespace {\n"
anatofuz
parents:
diff changeset
1858 "class X {\n"
anatofuz
parents:
diff changeset
1859 " G g; ::ny::Y y; ::ny::na::A a; ::ny::na::nc::C c;\n"
anatofuz
parents:
diff changeset
1860 "};\n"
anatofuz
parents:
diff changeset
1861 "} // namespace\n"
anatofuz
parents:
diff changeset
1862 "} // namespace nx\n";
anatofuz
parents:
diff changeset
1863 std::string Expected = "class G {};\n"
anatofuz
parents:
diff changeset
1864 "namespace ny {\n"
anatofuz
parents:
diff changeset
1865 "class Y {};\n"
anatofuz
parents:
diff changeset
1866 "namespace na {\n"
anatofuz
parents:
diff changeset
1867 "class A {};\n"
anatofuz
parents:
diff changeset
1868 "namespace nc { class C {}; } // namespace nc\n"
anatofuz
parents:
diff changeset
1869 "}\n // namespace na\n"
anatofuz
parents:
diff changeset
1870 "}\n // namespace ny\n"
anatofuz
parents:
diff changeset
1871 "\n"
anatofuz
parents:
diff changeset
1872 "namespace ny {\n"
anatofuz
parents:
diff changeset
1873 "namespace na {\n"
anatofuz
parents:
diff changeset
1874 "namespace {\n"
anatofuz
parents:
diff changeset
1875 "class X {\n"
anatofuz
parents:
diff changeset
1876 " G g; Y y; A a; nc::C c;\n"
anatofuz
parents:
diff changeset
1877 "};\n"
anatofuz
parents:
diff changeset
1878 "} // namespace\n"
anatofuz
parents:
diff changeset
1879 "} // namespace na\n"
anatofuz
parents:
diff changeset
1880 "} // namespace ny\n";
anatofuz
parents:
diff changeset
1881 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1882 }
anatofuz
parents:
diff changeset
1883
anatofuz
parents:
diff changeset
1884 TEST_F(ChangeNamespaceTest, SimpleMoveEnum) {
anatofuz
parents:
diff changeset
1885 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
1886 "namespace nb {\n"
anatofuz
parents:
diff changeset
1887 "enum class X { X1, X2 };\n"
anatofuz
parents:
diff changeset
1888 "enum Y { Y1, Y2 };\n"
anatofuz
parents:
diff changeset
1889 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1890 "} // namespace na\n";
anatofuz
parents:
diff changeset
1891 std::string Expected = "\n\nnamespace x {\n"
anatofuz
parents:
diff changeset
1892 "namespace y {\n"
anatofuz
parents:
diff changeset
1893 "enum class X { X1, X2 };\n"
anatofuz
parents:
diff changeset
1894 "enum Y { Y1, Y2 };\n"
anatofuz
parents:
diff changeset
1895 "} // namespace y\n"
anatofuz
parents:
diff changeset
1896 "} // namespace x\n";
anatofuz
parents:
diff changeset
1897
anatofuz
parents:
diff changeset
1898 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1899 }
anatofuz
parents:
diff changeset
1900
anatofuz
parents:
diff changeset
1901 TEST_F(ChangeNamespaceTest, ReferencesToEnums) {
anatofuz
parents:
diff changeset
1902 std::string Code = "enum Glob { G1, G2 };\n"
anatofuz
parents:
diff changeset
1903 "namespace na {\n"
anatofuz
parents:
diff changeset
1904 "enum class X { X1 };\n"
anatofuz
parents:
diff changeset
1905 "enum Y { Y1, Y2 };\n"
anatofuz
parents:
diff changeset
1906 "namespace nb {\n"
anatofuz
parents:
diff changeset
1907 "void f() {\n"
anatofuz
parents:
diff changeset
1908 " Glob g1 = Glob::G1;\n"
anatofuz
parents:
diff changeset
1909 " Glob g2 = G2;\n"
anatofuz
parents:
diff changeset
1910 " X x1 = X::X1;\n"
anatofuz
parents:
diff changeset
1911 " Y y1 = Y::Y1;\n"
anatofuz
parents:
diff changeset
1912 " Y y2 = Y2;\n"
anatofuz
parents:
diff changeset
1913 "}\n"
anatofuz
parents:
diff changeset
1914 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1915 "} // namespace na\n";
anatofuz
parents:
diff changeset
1916 std::string Expected = "enum Glob { G1, G2 };\n"
anatofuz
parents:
diff changeset
1917 "namespace na {\n"
anatofuz
parents:
diff changeset
1918 "enum class X { X1 };\n"
anatofuz
parents:
diff changeset
1919 "enum Y { Y1, Y2 };\n"
anatofuz
parents:
diff changeset
1920 "\n"
anatofuz
parents:
diff changeset
1921 "} // namespace na\n"
anatofuz
parents:
diff changeset
1922 "namespace x {\n"
anatofuz
parents:
diff changeset
1923 "namespace y {\n"
anatofuz
parents:
diff changeset
1924 "void f() {\n"
anatofuz
parents:
diff changeset
1925 " Glob g1 = Glob::G1;\n"
anatofuz
parents:
diff changeset
1926 " Glob g2 = G2;\n"
anatofuz
parents:
diff changeset
1927 " na::X x1 = na::X::X1;\n"
anatofuz
parents:
diff changeset
1928 " na::Y y1 = na::Y::Y1;\n"
anatofuz
parents:
diff changeset
1929 " na::Y y2 = na::Y2;\n"
anatofuz
parents:
diff changeset
1930 "}\n"
anatofuz
parents:
diff changeset
1931 "} // namespace y\n"
anatofuz
parents:
diff changeset
1932 "} // namespace x\n";
anatofuz
parents:
diff changeset
1933
anatofuz
parents:
diff changeset
1934 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1935 }
anatofuz
parents:
diff changeset
1936
anatofuz
parents:
diff changeset
1937 TEST_F(ChangeNamespaceTest, NoRedundantEnumUpdate) {
anatofuz
parents:
diff changeset
1938 std::string Code = "namespace ns {\n"
anatofuz
parents:
diff changeset
1939 "enum class X { X1 };\n"
anatofuz
parents:
diff changeset
1940 "enum Y { Y1, Y2 };\n"
anatofuz
parents:
diff changeset
1941 "} // namespace ns\n"
anatofuz
parents:
diff changeset
1942 "namespace na {\n"
anatofuz
parents:
diff changeset
1943 "namespace nb {\n"
anatofuz
parents:
diff changeset
1944 "void f() {\n"
anatofuz
parents:
diff changeset
1945 " ns::X x1 = ns::X::X1;\n"
anatofuz
parents:
diff changeset
1946 " ns::Y y1 = ns::Y::Y1;\n"
anatofuz
parents:
diff changeset
1947 " ns::Y y2 = ns::Y2;\n"
anatofuz
parents:
diff changeset
1948 "}\n"
anatofuz
parents:
diff changeset
1949 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1950 "} // namespace na\n";
anatofuz
parents:
diff changeset
1951 std::string Expected = "namespace ns {\n"
anatofuz
parents:
diff changeset
1952 "enum class X { X1 };\n"
anatofuz
parents:
diff changeset
1953 "enum Y { Y1, Y2 };\n"
anatofuz
parents:
diff changeset
1954 "} // namespace ns\n"
anatofuz
parents:
diff changeset
1955 "\n"
anatofuz
parents:
diff changeset
1956 "namespace x {\n"
anatofuz
parents:
diff changeset
1957 "namespace y {\n"
anatofuz
parents:
diff changeset
1958 "void f() {\n"
anatofuz
parents:
diff changeset
1959 " ns::X x1 = ns::X::X1;\n"
anatofuz
parents:
diff changeset
1960 " ns::Y y1 = ns::Y::Y1;\n"
anatofuz
parents:
diff changeset
1961 " ns::Y y2 = ns::Y2;\n"
anatofuz
parents:
diff changeset
1962 "}\n"
anatofuz
parents:
diff changeset
1963 "} // namespace y\n"
anatofuz
parents:
diff changeset
1964 "} // namespace x\n";
anatofuz
parents:
diff changeset
1965 ;
anatofuz
parents:
diff changeset
1966
anatofuz
parents:
diff changeset
1967 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
1968 }
anatofuz
parents:
diff changeset
1969
anatofuz
parents:
diff changeset
1970 TEST_F(ChangeNamespaceTest, EnumsAndUsingShadows) {
anatofuz
parents:
diff changeset
1971 std::string Code = "namespace ns {\n"
anatofuz
parents:
diff changeset
1972 "enum class X { X1 };\n"
anatofuz
parents:
diff changeset
1973 "enum Y { Y1, Y2, Y3 };\n"
anatofuz
parents:
diff changeset
1974 "} // namespace ns\n"
anatofuz
parents:
diff changeset
1975 "using ns::X;\n"
anatofuz
parents:
diff changeset
1976 "using ns::Y;\n"
anatofuz
parents:
diff changeset
1977 "using ns::Y::Y2;\n"
anatofuz
parents:
diff changeset
1978 "using ns::Y::Y3;\n"
anatofuz
parents:
diff changeset
1979 "namespace na {\n"
anatofuz
parents:
diff changeset
1980 "namespace nb {\n"
anatofuz
parents:
diff changeset
1981 "void f() {\n"
anatofuz
parents:
diff changeset
1982 " X x1 = X::X1;\n"
anatofuz
parents:
diff changeset
1983 " Y y1 = Y::Y1;\n"
anatofuz
parents:
diff changeset
1984 " Y y2 = Y2;\n"
anatofuz
parents:
diff changeset
1985 " Y y3 = Y3;\n"
anatofuz
parents:
diff changeset
1986 "}\n"
anatofuz
parents:
diff changeset
1987 "} // namespace nb\n"
anatofuz
parents:
diff changeset
1988 "} // namespace na\n";
anatofuz
parents:
diff changeset
1989 std::string Expected = "namespace ns {\n"
anatofuz
parents:
diff changeset
1990 "enum class X { X1 };\n"
anatofuz
parents:
diff changeset
1991 "enum Y { Y1, Y2, Y3 };\n"
anatofuz
parents:
diff changeset
1992 "} // namespace ns\n"
anatofuz
parents:
diff changeset
1993 "using ns::X;\n"
anatofuz
parents:
diff changeset
1994 "using ns::Y;\n"
anatofuz
parents:
diff changeset
1995 "using ns::Y::Y2;\n"
anatofuz
parents:
diff changeset
1996 "using ns::Y::Y3;\n"
anatofuz
parents:
diff changeset
1997 "\n"
anatofuz
parents:
diff changeset
1998 "namespace x {\n"
anatofuz
parents:
diff changeset
1999 "namespace y {\n"
anatofuz
parents:
diff changeset
2000 "void f() {\n"
anatofuz
parents:
diff changeset
2001 " X x1 = X::X1;\n"
anatofuz
parents:
diff changeset
2002 " Y y1 = Y::Y1;\n"
anatofuz
parents:
diff changeset
2003 " Y y2 = Y2;\n"
anatofuz
parents:
diff changeset
2004 " Y y3 = Y3;\n"
anatofuz
parents:
diff changeset
2005 "}\n"
anatofuz
parents:
diff changeset
2006 "} // namespace y\n"
anatofuz
parents:
diff changeset
2007 "} // namespace x\n";
anatofuz
parents:
diff changeset
2008
anatofuz
parents:
diff changeset
2009 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
2010 }
anatofuz
parents:
diff changeset
2011
anatofuz
parents:
diff changeset
2012 TEST_F(ChangeNamespaceTest, EnumsAndAliases) {
anatofuz
parents:
diff changeset
2013 std::string Code = "namespace ns {\n"
anatofuz
parents:
diff changeset
2014 "enum class X { X1 };\n"
anatofuz
parents:
diff changeset
2015 "enum Y { Y1, Y2, Y3 };\n"
anatofuz
parents:
diff changeset
2016 "} // namespace ns\n"
anatofuz
parents:
diff changeset
2017 "typedef ns::X TX;\n"
anatofuz
parents:
diff changeset
2018 "typedef ns::Y TY;\n"
anatofuz
parents:
diff changeset
2019 "using UX = ns::X;\n"
anatofuz
parents:
diff changeset
2020 "using UY = ns::Y;\n"
anatofuz
parents:
diff changeset
2021 "namespace na {\n"
anatofuz
parents:
diff changeset
2022 "namespace nb {\n"
anatofuz
parents:
diff changeset
2023 "void f() {\n"
anatofuz
parents:
diff changeset
2024 " ns::X x1 = ns::X::X1;\n"
anatofuz
parents:
diff changeset
2025 " TX tx1 = TX::X1;\n"
anatofuz
parents:
diff changeset
2026 " UX ux1 = UX::X1;\n"
anatofuz
parents:
diff changeset
2027 " ns::Y y1 = ns::Y::Y1;\n"
anatofuz
parents:
diff changeset
2028 " TY ty1 = TY::Y1;\n"
anatofuz
parents:
diff changeset
2029 " UY uy1 = UY::Y1;\n"
anatofuz
parents:
diff changeset
2030 "}\n"
anatofuz
parents:
diff changeset
2031 "} // namespace nb\n"
anatofuz
parents:
diff changeset
2032 "} // namespace na\n";
anatofuz
parents:
diff changeset
2033 std::string Expected = "namespace ns {\n"
anatofuz
parents:
diff changeset
2034 "enum class X { X1 };\n"
anatofuz
parents:
diff changeset
2035 "enum Y { Y1, Y2, Y3 };\n"
anatofuz
parents:
diff changeset
2036 "} // namespace ns\n"
anatofuz
parents:
diff changeset
2037 "typedef ns::X TX;\n"
anatofuz
parents:
diff changeset
2038 "typedef ns::Y TY;\n"
anatofuz
parents:
diff changeset
2039 "using UX = ns::X;\n"
anatofuz
parents:
diff changeset
2040 "using UY = ns::Y;\n"
anatofuz
parents:
diff changeset
2041 "\n"
anatofuz
parents:
diff changeset
2042 "namespace x {\n"
anatofuz
parents:
diff changeset
2043 "namespace y {\n"
anatofuz
parents:
diff changeset
2044 "void f() {\n"
anatofuz
parents:
diff changeset
2045 " ns::X x1 = ns::X::X1;\n"
anatofuz
parents:
diff changeset
2046 " TX tx1 = TX::X1;\n"
anatofuz
parents:
diff changeset
2047 " UX ux1 = UX::X1;\n"
anatofuz
parents:
diff changeset
2048 " ns::Y y1 = ns::Y::Y1;\n"
anatofuz
parents:
diff changeset
2049 " TY ty1 = TY::Y1;\n"
anatofuz
parents:
diff changeset
2050 " UY uy1 = UY::Y1;\n"
anatofuz
parents:
diff changeset
2051 "}\n"
anatofuz
parents:
diff changeset
2052 "} // namespace y\n"
anatofuz
parents:
diff changeset
2053 "} // namespace x\n";
anatofuz
parents:
diff changeset
2054
anatofuz
parents:
diff changeset
2055 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
2056 }
anatofuz
parents:
diff changeset
2057
anatofuz
parents:
diff changeset
2058 TEST_F(ChangeNamespaceTest, EnumInClass) {
anatofuz
parents:
diff changeset
2059 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
2060 "struct X { enum E { E1 }; };\n"
anatofuz
parents:
diff changeset
2061 "namespace nb {\n"
anatofuz
parents:
diff changeset
2062 "void f() {\n"
anatofuz
parents:
diff changeset
2063 " X::E e = X::E1;\n"
anatofuz
parents:
diff changeset
2064 " X::E ee = X::E::E1;\n"
anatofuz
parents:
diff changeset
2065 "}\n"
anatofuz
parents:
diff changeset
2066 "} // namespace nb\n"
anatofuz
parents:
diff changeset
2067 "} // namespace na\n";
anatofuz
parents:
diff changeset
2068 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
2069 "struct X { enum E { E1 }; };\n"
anatofuz
parents:
diff changeset
2070 "\n"
anatofuz
parents:
diff changeset
2071 "} // namespace na\n"
anatofuz
parents:
diff changeset
2072 "namespace x {\n"
anatofuz
parents:
diff changeset
2073 "namespace y {\n"
anatofuz
parents:
diff changeset
2074 "void f() {\n"
anatofuz
parents:
diff changeset
2075 " na::X::E e = na::X::E1;\n"
anatofuz
parents:
diff changeset
2076 " na::X::E ee = na::X::E::E1;\n"
anatofuz
parents:
diff changeset
2077 "}\n"
anatofuz
parents:
diff changeset
2078 "} // namespace y\n"
anatofuz
parents:
diff changeset
2079 "} // namespace x\n";
anatofuz
parents:
diff changeset
2080
anatofuz
parents:
diff changeset
2081 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
2082 }
anatofuz
parents:
diff changeset
2083
anatofuz
parents:
diff changeset
2084 TEST_F(ChangeNamespaceTest, TypeAsTemplateParameter) {
anatofuz
parents:
diff changeset
2085 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
2086 "struct X {};\n"
anatofuz
parents:
diff changeset
2087 "namespace nb {\n"
anatofuz
parents:
diff changeset
2088 "template <typename TT>\n"
anatofuz
parents:
diff changeset
2089 "void TempTemp(const TT& t) {\n"
anatofuz
parents:
diff changeset
2090 " TT tmp;\n"
anatofuz
parents:
diff changeset
2091 "}\n"
anatofuz
parents:
diff changeset
2092 "template <typename T>\n"
anatofuz
parents:
diff changeset
2093 "void Temp(const T& t) {\n"
anatofuz
parents:
diff changeset
2094 " T tmp = t;\n"
anatofuz
parents:
diff changeset
2095 " TempTemp(tmp);\n"
anatofuz
parents:
diff changeset
2096 " TempTemp(t);\n"
anatofuz
parents:
diff changeset
2097 "}\n"
anatofuz
parents:
diff changeset
2098 "void f() {\n"
anatofuz
parents:
diff changeset
2099 " X x;\n"
anatofuz
parents:
diff changeset
2100 " Temp(x);\n"
anatofuz
parents:
diff changeset
2101 "}\n"
anatofuz
parents:
diff changeset
2102 "} // namespace nb\n"
anatofuz
parents:
diff changeset
2103 "} // namespace na\n";
anatofuz
parents:
diff changeset
2104 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
2105 "struct X {};\n"
anatofuz
parents:
diff changeset
2106 "\n"
anatofuz
parents:
diff changeset
2107 "} // namespace na\n"
anatofuz
parents:
diff changeset
2108 "namespace x {\n"
anatofuz
parents:
diff changeset
2109 "namespace y {\n"
anatofuz
parents:
diff changeset
2110 "template <typename TT>\n"
anatofuz
parents:
diff changeset
2111 "void TempTemp(const TT& t) {\n"
anatofuz
parents:
diff changeset
2112 " TT tmp;\n"
anatofuz
parents:
diff changeset
2113 "}\n"
anatofuz
parents:
diff changeset
2114 "template <typename T>\n"
anatofuz
parents:
diff changeset
2115 "void Temp(const T& t) {\n"
anatofuz
parents:
diff changeset
2116 " T tmp = t;\n"
anatofuz
parents:
diff changeset
2117 " TempTemp(tmp);\n"
anatofuz
parents:
diff changeset
2118 " TempTemp(t);\n"
anatofuz
parents:
diff changeset
2119 "}\n"
anatofuz
parents:
diff changeset
2120 "void f() {\n"
anatofuz
parents:
diff changeset
2121 " na::X x;\n"
anatofuz
parents:
diff changeset
2122 " Temp(x);\n"
anatofuz
parents:
diff changeset
2123 "}\n"
anatofuz
parents:
diff changeset
2124 "} // namespace y\n"
anatofuz
parents:
diff changeset
2125 "} // namespace x\n";
anatofuz
parents:
diff changeset
2126
anatofuz
parents:
diff changeset
2127 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
2128 }
anatofuz
parents:
diff changeset
2129
anatofuz
parents:
diff changeset
2130 TEST_F(ChangeNamespaceTest, DefaultMoveConstructors) {
anatofuz
parents:
diff changeset
2131 std::string Code = "namespace na {\n"
anatofuz
parents:
diff changeset
2132 "class B {\n"
anatofuz
parents:
diff changeset
2133 " public:\n"
anatofuz
parents:
diff changeset
2134 " B() = default;\n"
anatofuz
parents:
diff changeset
2135 " // Allow move only.\n"
anatofuz
parents:
diff changeset
2136 " B(B&&) = default;\n"
anatofuz
parents:
diff changeset
2137 " B& operator=(B&&) = default;\n"
anatofuz
parents:
diff changeset
2138 " B(const B&) = delete;\n"
anatofuz
parents:
diff changeset
2139 " B& operator=(const B&) = delete;\n"
anatofuz
parents:
diff changeset
2140 " private:\n"
anatofuz
parents:
diff changeset
2141 " int ref_;\n"
anatofuz
parents:
diff changeset
2142 "};\n"
anatofuz
parents:
diff changeset
2143 "} // namespace na\n"
anatofuz
parents:
diff changeset
2144 "namespace na {\n"
anatofuz
parents:
diff changeset
2145 "namespace nb {\n"
anatofuz
parents:
diff changeset
2146 "class A {\n"
anatofuz
parents:
diff changeset
2147 "public:\n"
anatofuz
parents:
diff changeset
2148 " A() = default;\n"
anatofuz
parents:
diff changeset
2149 " A(A&&) = default;\n"
anatofuz
parents:
diff changeset
2150 " A& operator=(A&&) = default;\n"
anatofuz
parents:
diff changeset
2151 "private:\n"
anatofuz
parents:
diff changeset
2152 " B b;\n"
anatofuz
parents:
diff changeset
2153 " A(const A&) = delete;\n"
anatofuz
parents:
diff changeset
2154 " A& operator=(const A&) = delete;\n"
anatofuz
parents:
diff changeset
2155 "};\n"
anatofuz
parents:
diff changeset
2156 "void f() { A a; a = A(); A aa = A(); }\n"
anatofuz
parents:
diff changeset
2157 "} // namespace nb\n"
anatofuz
parents:
diff changeset
2158 "} // namespace na\n";
anatofuz
parents:
diff changeset
2159 std::string Expected = "namespace na {\n"
anatofuz
parents:
diff changeset
2160 "class B {\n"
anatofuz
parents:
diff changeset
2161 " public:\n"
anatofuz
parents:
diff changeset
2162 " B() = default;\n"
anatofuz
parents:
diff changeset
2163 " // Allow move only.\n"
anatofuz
parents:
diff changeset
2164 " B(B&&) = default;\n"
anatofuz
parents:
diff changeset
2165 " B& operator=(B&&) = default;\n"
anatofuz
parents:
diff changeset
2166 " B(const B&) = delete;\n"
anatofuz
parents:
diff changeset
2167 " B& operator=(const B&) = delete;\n"
anatofuz
parents:
diff changeset
2168 " private:\n"
anatofuz
parents:
diff changeset
2169 " int ref_;\n"
anatofuz
parents:
diff changeset
2170 "};\n"
anatofuz
parents:
diff changeset
2171 "} // namespace na\n"
anatofuz
parents:
diff changeset
2172 "\n"
anatofuz
parents:
diff changeset
2173 "namespace x {\n"
anatofuz
parents:
diff changeset
2174 "namespace y {\n"
anatofuz
parents:
diff changeset
2175 "class A {\n"
anatofuz
parents:
diff changeset
2176 "public:\n"
anatofuz
parents:
diff changeset
2177 " A() = default;\n"
anatofuz
parents:
diff changeset
2178 " A(A&&) = default;\n"
anatofuz
parents:
diff changeset
2179 " A& operator=(A&&) = default;\n"
anatofuz
parents:
diff changeset
2180 "private:\n"
anatofuz
parents:
diff changeset
2181 " na::B b;\n"
anatofuz
parents:
diff changeset
2182 " A(const A&) = delete;\n"
anatofuz
parents:
diff changeset
2183 " A& operator=(const A&) = delete;\n"
anatofuz
parents:
diff changeset
2184 "};\n"
anatofuz
parents:
diff changeset
2185 "void f() { A a; a = A(); A aa = A(); }\n"
anatofuz
parents:
diff changeset
2186 "} // namespace y\n"
anatofuz
parents:
diff changeset
2187 "} // namespace x\n";
anatofuz
parents:
diff changeset
2188 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
2189 }
anatofuz
parents:
diff changeset
2190
anatofuz
parents:
diff changeset
2191 TEST_F(ChangeNamespaceTest, InjectedClassNameInFriendDecl) {
anatofuz
parents:
diff changeset
2192 OldNamespace = "d";
anatofuz
parents:
diff changeset
2193 NewNamespace = "e";
anatofuz
parents:
diff changeset
2194 std::string Code = "namespace a{\n"
anatofuz
parents:
diff changeset
2195 "template <typename T>\n"
anatofuz
parents:
diff changeset
2196 "class Base {\n"
anatofuz
parents:
diff changeset
2197 " public:\n"
anatofuz
parents:
diff changeset
2198 " void f() {\n"
anatofuz
parents:
diff changeset
2199 " T t;\n"
anatofuz
parents:
diff changeset
2200 " t.priv();\n"
anatofuz
parents:
diff changeset
2201 " }\n"
anatofuz
parents:
diff changeset
2202 "};\n"
anatofuz
parents:
diff changeset
2203 "} // namespace a\n"
anatofuz
parents:
diff changeset
2204 "namespace d {\n"
anatofuz
parents:
diff changeset
2205 "class D : public a::Base<D> {\n"
anatofuz
parents:
diff changeset
2206 " private:\n"
anatofuz
parents:
diff changeset
2207 " friend class Base<D>;\n"
anatofuz
parents:
diff changeset
2208 " void priv() {}\n"
anatofuz
parents:
diff changeset
2209 " Base b;\n"
anatofuz
parents:
diff changeset
2210 "};\n"
anatofuz
parents:
diff changeset
2211 "\n"
anatofuz
parents:
diff changeset
2212 "void f() {\n"
anatofuz
parents:
diff changeset
2213 " D d;\n"
anatofuz
parents:
diff changeset
2214 " a:: Base<D> b;\n"
anatofuz
parents:
diff changeset
2215 " b.f();\n"
anatofuz
parents:
diff changeset
2216 "}\n"
anatofuz
parents:
diff changeset
2217 "} // namespace d\n";
anatofuz
parents:
diff changeset
2218 std::string Expected = "namespace a{\n"
anatofuz
parents:
diff changeset
2219 "template <typename T>\n"
anatofuz
parents:
diff changeset
2220 "class Base {\n"
anatofuz
parents:
diff changeset
2221 " public:\n"
anatofuz
parents:
diff changeset
2222 " void f() {\n"
anatofuz
parents:
diff changeset
2223 " T t;\n"
anatofuz
parents:
diff changeset
2224 " t.priv();\n"
anatofuz
parents:
diff changeset
2225 " }\n"
anatofuz
parents:
diff changeset
2226 "};\n"
anatofuz
parents:
diff changeset
2227 "} // namespace a\n"
anatofuz
parents:
diff changeset
2228 "\n"
anatofuz
parents:
diff changeset
2229 "namespace e {\n"
anatofuz
parents:
diff changeset
2230 "class D : public a::Base<D> {\n"
anatofuz
parents:
diff changeset
2231 " private:\n"
anatofuz
parents:
diff changeset
2232 " friend class Base<D>;\n"
anatofuz
parents:
diff changeset
2233 " void priv() {}\n"
anatofuz
parents:
diff changeset
2234 " a::Base b;\n"
anatofuz
parents:
diff changeset
2235 "};\n"
anatofuz
parents:
diff changeset
2236 "\n"
anatofuz
parents:
diff changeset
2237 "void f() {\n"
anatofuz
parents:
diff changeset
2238 " D d;\n"
anatofuz
parents:
diff changeset
2239 " a::Base<D> b;\n"
anatofuz
parents:
diff changeset
2240 " b.f();\n"
anatofuz
parents:
diff changeset
2241 "}\n"
anatofuz
parents:
diff changeset
2242 "} // namespace e\n";
anatofuz
parents:
diff changeset
2243 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
2244 }
anatofuz
parents:
diff changeset
2245
anatofuz
parents:
diff changeset
2246 TEST_F(ChangeNamespaceTest, FullyQualifyConflictNamespace) {
anatofuz
parents:
diff changeset
2247 std::string Code =
anatofuz
parents:
diff changeset
2248 "namespace x { namespace util { class Some {}; } }\n"
anatofuz
parents:
diff changeset
2249 "namespace x { namespace y {namespace base { class Base {}; } } }\n"
anatofuz
parents:
diff changeset
2250 "namespace util { class Status {}; }\n"
anatofuz
parents:
diff changeset
2251 "namespace base { class Base {}; }\n"
anatofuz
parents:
diff changeset
2252 "namespace na {\n"
anatofuz
parents:
diff changeset
2253 "namespace nb {\n"
anatofuz
parents:
diff changeset
2254 "void f() {\n"
anatofuz
parents:
diff changeset
2255 " util::Status s1; x::util::Some s2;\n"
anatofuz
parents:
diff changeset
2256 " base::Base b1; x::y::base::Base b2;\n"
anatofuz
parents:
diff changeset
2257 "}\n"
anatofuz
parents:
diff changeset
2258 "} // namespace nb\n"
anatofuz
parents:
diff changeset
2259 "} // namespace na\n";
anatofuz
parents:
diff changeset
2260
anatofuz
parents:
diff changeset
2261 std::string Expected =
anatofuz
parents:
diff changeset
2262 "namespace x { namespace util { class Some {}; } }\n"
anatofuz
parents:
diff changeset
2263 "namespace x { namespace y {namespace base { class Base {}; } } }\n"
anatofuz
parents:
diff changeset
2264 "namespace util { class Status {}; }\n"
anatofuz
parents:
diff changeset
2265 "namespace base { class Base {}; }\n"
anatofuz
parents:
diff changeset
2266 "\n"
anatofuz
parents:
diff changeset
2267 "namespace x {\n"
anatofuz
parents:
diff changeset
2268 "namespace y {\n"
anatofuz
parents:
diff changeset
2269 "void f() {\n"
anatofuz
parents:
diff changeset
2270 " ::util::Status s1; util::Some s2;\n"
anatofuz
parents:
diff changeset
2271 " ::base::Base b1; base::Base b2;\n"
anatofuz
parents:
diff changeset
2272 "}\n"
anatofuz
parents:
diff changeset
2273 "} // namespace y\n"
anatofuz
parents:
diff changeset
2274 "} // namespace x\n";
anatofuz
parents:
diff changeset
2275
anatofuz
parents:
diff changeset
2276 EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
anatofuz
parents:
diff changeset
2277 }
anatofuz
parents:
diff changeset
2278
anatofuz
parents:
diff changeset
2279 } // anonymous namespace
anatofuz
parents:
diff changeset
2280 } // namespace change_namespace
anatofuz
parents:
diff changeset
2281 } // namespace clang