[change-namespace] Enhance detection of conflicting namespaces.
Summary:
For example:
```
namespace util { class Base; }
namespace new {
namespace util { class Internal; }
}
namespace old {
util::Base b1;
}
```
When changing `old::` to `new::`, `util::` in namespace "new::" will conflict
with "new::util::" unless a leading "::" is added.
Reviewers: hokein
Subscribers: cfe-commits
Differential Revision: https://reviews.llvm.org/D53489
llvm-svn: 344897
diff --git a/clang-tools-extra/unittests/change-namespace/ChangeNamespaceTests.cpp b/clang-tools-extra/unittests/change-namespace/ChangeNamespaceTests.cpp
index 6b1259a..4008600 100644
--- a/clang-tools-extra/unittests/change-namespace/ChangeNamespaceTests.cpp
+++ b/clang-tools-extra/unittests/change-namespace/ChangeNamespaceTests.cpp
@@ -2244,6 +2244,39 @@
EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
}
+TEST_F(ChangeNamespaceTest, FullyQualifyConflictNamespace) {
+ std::string Code =
+ "namespace x { namespace util { class Some {}; } }\n"
+ "namespace x { namespace y {namespace base { class Base {}; } } }\n"
+ "namespace util { class Status {}; }\n"
+ "namespace base { class Base {}; }\n"
+ "namespace na {\n"
+ "namespace nb {\n"
+ "void f() {\n"
+ " util::Status s1; x::util::Some s2;\n"
+ " base::Base b1; x::y::base::Base b2;\n"
+ "}\n"
+ "} // namespace nb\n"
+ "} // namespace na\n";
+
+ std::string Expected =
+ "namespace x { namespace util { class Some {}; } }\n"
+ "namespace x { namespace y {namespace base { class Base {}; } } }\n"
+ "namespace util { class Status {}; }\n"
+ "namespace base { class Base {}; }\n"
+ "\n"
+ "namespace x {\n"
+ "namespace y {\n"
+ "void f() {\n"
+ " ::util::Status s1; util::Some s2;\n"
+ " ::base::Base b1; base::Base b2;\n"
+ "}\n"
+ "} // namespace y\n"
+ "} // namespace x\n";
+
+ EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
+}
+
} // anonymous namespace
} // namespace change_namespace
} // namespace clang