summaryrefslogtreecommitdiff
path: root/clang-tools-extra/change-namespace
diff options
context:
space:
mode:
authorEric Liu <ioeric@google.com>2016-09-30 04:32:39 +0000
committerEric Liu <ioeric@google.com>2016-09-30 04:32:39 +0000
commit7e33f481da01a85e43e71c0e39a4f501cd179e5c (patch)
treec5f4b3b28a63ed72b4273c341c00f321c366274c /clang-tools-extra/change-namespace
parente1c17957c0d6008dd7468ef8caebd906493e3669 (diff)
[change-namespace] fix namespace specifier of global variables.
Reviewers: hokein Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D24963
Diffstat (limited to 'clang-tools-extra/change-namespace')
-rw-r--r--clang-tools-extra/change-namespace/ChangeNamespace.cpp23
1 files changed, 20 insertions, 3 deletions
diff --git a/clang-tools-extra/change-namespace/ChangeNamespace.cpp b/clang-tools-extra/change-namespace/ChangeNamespace.cpp
index 072fc1dd6ba..274c9acf4d0 100644
--- a/clang-tools-extra/change-namespace/ChangeNamespace.cpp
+++ b/clang-tools-extra/change-namespace/ChangeNamespace.cpp
@@ -230,8 +230,6 @@ ChangeNamespaceTool::ChangeNamespaceTool(
DiffNewNamespace = joinNamespaces(NewNsSplitted);
}
-// FIXME: handle the following symbols:
-// - Variable references.
void ChangeNamespaceTool::registerMatchers(ast_matchers::MatchFinder *Finder) {
// Match old namespace blocks.
std::string FullOldNs = "::" + OldNamespace;
@@ -303,6 +301,14 @@ void ChangeNamespaceTool::registerMatchers(ast_matchers::MatchFinder *Finder) {
IsInMovedNs, unless(isImplicit()))
.bind("dc"),
this);
+
+ auto GlobalVarMatcher = varDecl(
+ hasGlobalStorage(), hasParent(namespaceDecl()),
+ unless(anyOf(IsInMovedNs, hasAncestor(namespaceDecl(isAnonymous())))));
+ Finder->addMatcher(declRefExpr(IsInMovedNs, hasAncestor(decl().bind("dc")),
+ to(GlobalVarMatcher.bind("var_decl")))
+ .bind("var_ref"),
+ this);
}
void ChangeNamespaceTool::run(
@@ -324,8 +330,19 @@ void ChangeNamespaceTool::run(
} else if (const auto *TLoc = Result.Nodes.getNodeAs<TypeLoc>("type")) {
fixTypeLoc(Result, startLocationForType(*TLoc), EndLocationForType(*TLoc),
*TLoc);
+ } else if (const auto *VarRef = Result.Nodes.getNodeAs<DeclRefExpr>("var_ref")){
+ const auto *Var = Result.Nodes.getNodeAs<VarDecl>("var_decl");
+ assert(Var);
+ if (Var->getCanonicalDecl()->isStaticDataMember())
+ return;
+ std::string Name = Var->getQualifiedNameAsString();
+ const clang::Decl *Context = Result.Nodes.getNodeAs<clang::Decl>("dc");
+ assert(Context && "Empty decl context.");
+ clang::SourceRange VarRefRange = VarRef->getSourceRange();
+ replaceQualifiedSymbolInDeclContext(Result, Context, VarRefRange.getBegin(),
+ VarRefRange.getEnd(), Name);
} else {
- const auto* Call = Result.Nodes.getNodeAs<clang::CallExpr>("call");
+ const auto *Call = Result.Nodes.getNodeAs<clang::CallExpr>("call");
assert(Call != nullptr &&"Expecting callback for CallExpr.");
const clang::FunctionDecl* Func = Call->getDirectCallee();
assert(Func != nullptr);