diff options
| author | Eric Liu <ioeric@google.com> | 2016-12-23 10:47:09 +0000 |
|---|---|---|
| committer | Eric Liu <ioeric@google.com> | 2016-12-23 10:47:09 +0000 |
| commit | 180dac6396e31c94b57ac9ff26fb36fef84f2d06 (patch) | |
| tree | 85b51959314c9cf53fdaf7aeda10d011084c3cc9 /clang-tools-extra/change-namespace/ChangeNamespace.cpp | |
| parent | 0ff941620c727460797e1fbb0466f8fa1e964a10 (diff) | |
| download | bcm5719-llvm-180dac6396e31c94b57ac9ff26fb36fef84f2d06.tar.gz bcm5719-llvm-180dac6396e31c94b57ac9ff26fb36fef84f2d06.zip | |
[change-namespace] consider namespace aliases to shorten qualified names.
Reviewers: hokein
Subscribers: cfe-commits
Differential Revision: https://reviews.llvm.org/D28052
llvm-svn: 290421
Diffstat (limited to 'clang-tools-extra/change-namespace/ChangeNamespace.cpp')
| -rw-r--r-- | clang-tools-extra/change-namespace/ChangeNamespace.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/clang-tools-extra/change-namespace/ChangeNamespace.cpp b/clang-tools-extra/change-namespace/ChangeNamespace.cpp index 0877519478c..7452b7d1f02 100644 --- a/clang-tools-extra/change-namespace/ChangeNamespace.cpp +++ b/clang-tools-extra/change-namespace/ChangeNamespace.cpp @@ -306,6 +306,11 @@ void ChangeNamespaceTool::registerMatchers(ast_matchers::MatchFinder *Finder) { IsVisibleInNewNs) .bind("using_namespace"), this); + // Match namespace alias declarations. + Finder->addMatcher(namespaceAliasDecl(isExpansionInFileMatching(FilePattern), + IsVisibleInNewNs) + .bind("namespace_alias"), + this); // Match old namespace blocks. Finder->addMatcher( @@ -429,6 +434,10 @@ void ChangeNamespaceTool::run( Result.Nodes.getNodeAs<UsingDirectiveDecl>( "using_namespace")) { UsingNamespaceDecls.insert(UsingNamespace); + } else if (const auto *NamespaceAlias = + Result.Nodes.getNodeAs<NamespaceAliasDecl>( + "namespace_alias")) { + NamespaceAliasDecls.insert(NamespaceAlias); } else if (const auto *NsDecl = Result.Nodes.getNodeAs<NamespaceDecl>("old_ns")) { moveOldNamespace(Result, NsDecl); @@ -687,6 +696,38 @@ void ChangeNamespaceTool::replaceQualifiedSymbolInDeclContext( ReplaceName = FromDeclNameRef; } } + // Checks if there is any namespace alias declarations that can shorten the + // qualified name. + for (const auto *NamespaceAlias : NamespaceAliasDecls) { + if (!isDeclVisibleAtLocation(*Result.SourceManager, NamespaceAlias, DeclCtx, + Start)) + continue; + StringRef FromDeclNameRef = FromDeclName; + if (FromDeclNameRef.consume_front( + NamespaceAlias->getNamespace()->getQualifiedNameAsString() + + "::")) { + std::string AliasName = NamespaceAlias->getNameAsString(); + std::string AliasQualifiedName = + NamespaceAlias->getQualifiedNameAsString(); + // We only consider namespace aliases define in the global namepspace or + // in namespaces that are directly visible from the reference, i.e. + // ancestor of the `OldNs`. Note that declarations in ancestor namespaces + // but not visible in the new namespace is filtered out by + // "IsVisibleInNewNs" matcher. + if (AliasQualifiedName != AliasName) { + // The alias is defined in some namespace. + assert(StringRef(AliasQualifiedName).endswith("::" + AliasName)); + llvm::StringRef AliasNs = + StringRef(AliasQualifiedName).drop_back(AliasName.size() + 2); + if (!llvm::StringRef(OldNs).startswith(AliasNs)) + continue; + } + std::string NameWithAliasNamespace = + (AliasName + "::" + FromDeclNameRef).str(); + if (NameWithAliasNamespace.size() < ReplaceName.size()) + ReplaceName = NameWithAliasNamespace; + } + } // Checks if there is any using shadow declarations that can shorten the // qualified name. bool Matched = false; |

