diff options
author | Eric Liu <ioeric@google.com> | 2016-11-14 19:37:55 +0000 |
---|---|---|
committer | Eric Liu <ioeric@google.com> | 2016-11-14 19:37:55 +0000 |
commit | b83a6f26acf3eb7aa810da1b0e0abbedc6a7cd3b (patch) | |
tree | ae8f5899c49887f9d64f1f5830e20cdbdc16c4ca /clang-tools-extra/change-namespace | |
parent | 259fcc9c9fe0cd9f64de70e2f0604582359a9465 (diff) |
[change-namespace] consider typedef/using alias decls in the moved namespace.
Summary: If a TypeLoc refers to a type alias defined in the moved namespace, we do not need to update its specifier since the type alias decl will be moved along with the type reference.
Reviewers: hokein
Subscribers: cfe-commits
Differential Revision: https://reviews.llvm.org/D26592
Diffstat (limited to 'clang-tools-extra/change-namespace')
-rw-r--r-- | clang-tools-extra/change-namespace/ChangeNamespace.cpp | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/clang-tools-extra/change-namespace/ChangeNamespace.cpp b/clang-tools-extra/change-namespace/ChangeNamespace.cpp index a400a37773b..af29c6d2947 100644 --- a/clang-tools-extra/change-namespace/ChangeNamespace.cpp +++ b/clang-tools-extra/change-namespace/ChangeNamespace.cpp @@ -621,8 +621,27 @@ void ChangeNamespaceTool::fixTypeLoc( const auto *FromDecl = Result.Nodes.getNodeAs<NamedDecl>("from_decl"); // `hasDeclaration` gives underlying declaration, but if the type is // a typedef type, we need to use the typedef type instead. - if (auto *Typedef = Type.getType()->getAs<TypedefType>()) + if (auto *Typedef = Type.getType()->getAs<TypedefType>()) { FromDecl = Typedef->getDecl(); + auto IsInMovedNs = [&](const NamedDecl *D) { + if (!llvm::StringRef(D->getQualifiedNameAsString()) + .startswith(OldNamespace + "::")) + return false; + auto ExpansionLoc = + Result.SourceManager->getExpansionLoc(D->getLocStart()); + if (ExpansionLoc.isInvalid()) + return false; + llvm::StringRef Filename = + Result.SourceManager->getFilename(ExpansionLoc); + llvm::Regex RE(FilePattern); + return RE.match(Filename); + }; + // Don't fix the \p Type if it refers to a type alias decl in the moved + // namespace since the alias decl will be moved along with the type + // reference. + if (IsInMovedNs(FromDecl)) + return; + } const Decl *DeclCtx = Result.Nodes.getNodeAs<Decl>("dc"); assert(DeclCtx && "Empty decl context."); |