summaryrefslogtreecommitdiff
path: root/clang-tools-extra/change-namespace
diff options
context:
space:
mode:
authorEric Liu <ioeric@google.com>2016-10-05 15:52:39 +0000
committerEric Liu <ioeric@google.com>2016-10-05 15:52:39 +0000
commit31e4f800889e36a06cfeb6b2b0a7b3b2f96b6919 (patch)
tree7b26646c6bc318e8a5fe3ed5ce93da7faf3182f5 /clang-tools-extra/change-namespace
parent27c4a331791f2f09682048a94cc6bba155c0d468 (diff)
[change-namespace] Fixed a bug in getShortestQualifiedNameInNamespace.
Reviewers: hokein Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D25065
Diffstat (limited to 'clang-tools-extra/change-namespace')
-rw-r--r--clang-tools-extra/change-namespace/ChangeNamespace.cpp23
1 files changed, 13 insertions, 10 deletions
diff --git a/clang-tools-extra/change-namespace/ChangeNamespace.cpp b/clang-tools-extra/change-namespace/ChangeNamespace.cpp
index 15ce4edaaa5..6943afd51dc 100644
--- a/clang-tools-extra/change-namespace/ChangeNamespace.cpp
+++ b/clang-tools-extra/change-namespace/ChangeNamespace.cpp
@@ -173,21 +173,24 @@ tooling::Replacement createInsertion(SourceLocation Loc,
// Returns the shortest qualified name for declaration `DeclName` in the
// namespace `NsName`. For example, if `DeclName` is "a::b::X" and `NsName`
// is "a::c::d", then "b::X" will be returned.
+// \param DeclName A fully qualified name, "::a::b::X" or "a::b::X".
+// \param NsName A fully qualified name, "::a::b" or "a::b". Global namespace
+// will have empty name.
std::string getShortestQualifiedNameInNamespace(llvm::StringRef DeclName,
llvm::StringRef NsName) {
- llvm::SmallVector<llvm::StringRef, 4> DeclNameSplitted;
- DeclName.split(DeclNameSplitted, "::");
- if (DeclNameSplitted.size() == 1)
- return DeclName;
- const auto UnqualifiedName = DeclNameSplitted.back();
- while (true) {
+ DeclName = DeclName.ltrim(':');
+ NsName = NsName.ltrim(':');
+ // If `DeclName` is a global variable, we prepend "::" to it if it is not in
+ // the global namespace.
+ if (DeclName.find(':') == llvm::StringRef::npos)
+ return NsName.empty() ? DeclName.str() : ("::" + DeclName).str();
+
+ while (!DeclName.consume_front((NsName + "::").str())) {
const auto Pos = NsName.find_last_of(':');
if (Pos == llvm::StringRef::npos)
return DeclName;
- const auto Prefix = NsName.substr(0, Pos - 1);
- if (DeclName.startswith(Prefix))
- return (Prefix + "::" + UnqualifiedName).str();
- NsName = Prefix;
+ assert(Pos > 0);
+ NsName = NsName.substr(0, Pos - 1);
}
return DeclName;
}