diff options
author | Haojian Wu <hokein@google.com> | 2016-11-10 05:33:26 +0000 |
---|---|---|
committer | Haojian Wu <hokein@google.com> | 2016-11-10 05:33:26 +0000 |
commit | b53ec46773c5819ad70f4d63924f18c6a88965ee (patch) | |
tree | 55af2ee47bc9386197104f3baf1ba1d2648e3214 /clang-tools-extra/clang-move | |
parent | bbaeda3fe5d132d4b58f7606663704e408ef9796 (diff) | |
download | bcm5719-llvm-b53ec46773c5819ad70f4d63924f18c6a88965ee.tar.gz bcm5719-llvm-b53ec46773c5819ad70f4d63924f18c6a88965ee.zip |
[clang-move] Support template class.
Reviewers: ioeric
Subscribers: cfe-commits
Differential Revision: https://reviews.llvm.org/D26423
llvm-svn: 286427
Diffstat (limited to 'clang-tools-extra/clang-move')
-rw-r--r-- | clang-tools-extra/clang-move/ClangMove.cpp | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/clang-tools-extra/clang-move/ClangMove.cpp b/clang-tools-extra/clang-move/ClangMove.cpp index e23db7474b4..61922f78b5a 100644 --- a/clang-tools-extra/clang-move/ClangMove.cpp +++ b/clang-tools-extra/clang-move/ClangMove.cpp @@ -364,16 +364,15 @@ void ClangMoveTool::registerMatchers(ast_matchers::MatchFinder *Finder) { isDefinition()) .bind("class_method"), this); - - //============================================================================ - // Matchers for old cc - //============================================================================ // Match static member variable definition of the moved class. Finder->addMatcher( - varDecl(InMovedClass, InOldCC, isDefinition(), isStaticDataMember()) + varDecl(InMovedClass, InOldFiles, isDefinition(), isStaticDataMember()) .bind("class_static_var_decl"), this); + //============================================================================ + // Matchers for old cc + //============================================================================ auto InOldCCNamedNamespace = allOf(hasParent(namespaceDecl(unless(isAnonymous()))), InOldCC); // Matching using decls/type alias decls which are in named namespace. Those @@ -412,25 +411,36 @@ void ClangMoveTool::run(const ast_matchers::MatchFinder::MatchResult &Result) { if (!CMD->isInlined()) { MovedDecls.emplace_back(CMD, &Result.Context->getSourceManager()); RemovedDecls.push_back(MovedDecls.back()); + // Get template class method from its method declaration as + // UnremovedDecls stores template class method. + if (const auto *FTD = CMD->getDescribedFunctionTemplate()) + UnremovedDeclsInOldHeader.erase(FTD); + else + UnremovedDeclsInOldHeader.erase(CMD); } } else if (const auto *VD = Result.Nodes.getNodeAs<clang::VarDecl>( "class_static_var_decl")) { MovedDecls.emplace_back(VD, &Result.Context->getSourceManager()); RemovedDecls.push_back(MovedDecls.back()); - } else if (const auto *class_decl = + UnremovedDeclsInOldHeader.erase(MovedDecls.back().Decl); + } else if (const auto *CD = Result.Nodes.getNodeAs<clang::CXXRecordDecl>("moved_class")) { - MovedDecls.emplace_back(class_decl, &Result.Context->getSourceManager()); + // Get class template from its class declaration as UnremovedDecls stores + // class template. + if (const auto * TC = CD->getDescribedClassTemplate()) + MovedDecls.emplace_back(TC, &Result.Context->getSourceManager()); + else + MovedDecls.emplace_back(CD, &Result.Context->getSourceManager()); RemovedDecls.push_back(MovedDecls.back()); - UnremovedDeclsInOldHeader.erase(class_decl); + UnremovedDeclsInOldHeader.erase(MovedDecls.back().Decl); } else if (const auto *FWD = Result.Nodes.getNodeAs<clang::CXXRecordDecl>("fwd_decl")) { // Skip all forwad declarations which appear after moved class declaration. if (RemovedDecls.empty()) { - if (const auto *DCT = FWD->getDescribedClassTemplate()) { + if (const auto *DCT = FWD->getDescribedClassTemplate()) MovedDecls.emplace_back(DCT, &Result.Context->getSourceManager()); - } else { + else MovedDecls.emplace_back(FWD, &Result.Context->getSourceManager()); - } } } else if (const auto *ANS = Result.Nodes.getNodeAs<clang::NamespaceDecl>("anonymous_ns")) { |