diff options
author | Eric Liu <ioeric@google.com> | 2016-09-30 04:32:39 +0000 |
---|---|---|
committer | Eric Liu <ioeric@google.com> | 2016-09-30 04:32:39 +0000 |
commit | 7e33f481da01a85e43e71c0e39a4f501cd179e5c (patch) | |
tree | c5f4b3b28a63ed72b4273c341c00f321c366274c /clang-tools-extra/change-namespace | |
parent | e1c17957c0d6008dd7468ef8caebd906493e3669 (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.cpp | 23 |
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); |