Author: ioeric Date: Wed Dec 7 08:20:52 2016 New Revision: 288908 URL: http://llvm.org/viewvc/llvm-project?rev=288908&view=rev Log: [change-namespace] move template class forward-declarations and don't move fwd-decls in classes.
Summary: Forward declarations in moved namespaces should be moved back to the old namespaces. We should also move template class forward declarations. Also fix a bug that moves forward declarations of nested classes. Reviewers: bkramer Subscribers: cfe-commits Differential Revision: https://reviews.llvm.org/D27515 Modified: clang-tools-extra/trunk/change-namespace/ChangeNamespace.cpp clang-tools-extra/trunk/change-namespace/ChangeNamespace.h clang-tools-extra/trunk/unittests/change-namespace/ChangeNamespaceTests.cpp Modified: clang-tools-extra/trunk/change-namespace/ChangeNamespace.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/change-namespace/ChangeNamespace.cpp?rev=288908&r1=288907&r2=288908&view=diff ============================================================================== --- clang-tools-extra/trunk/change-namespace/ChangeNamespace.cpp (original) +++ clang-tools-extra/trunk/change-namespace/ChangeNamespace.cpp Wed Dec 7 08:20:52 2016 @@ -303,10 +303,18 @@ void ChangeNamespaceTool::registerMatche .bind("old_ns"), this); - // Match forward-declarations in the old namespace. + // Match class forward-declarations in the old namespace. + // Note that forward-declarations in classes are not matched. + Finder->addMatcher(cxxRecordDecl(unless(anyOf(isImplicit(), isDefinition())), + IsInMovedNs, hasParent(namespaceDecl())) + .bind("class_fwd_decl"), + this); + + // Match template class forward-declarations in the old namespace. Finder->addMatcher( - cxxRecordDecl(unless(anyOf(isImplicit(), isDefinition())), IsInMovedNs) - .bind("fwd_decl"), + classTemplateDecl(unless(hasDescendant(cxxRecordDecl(isDefinition()))), + IsInMovedNs, hasParent(namespaceDecl())) + .bind("template_class_fwd_decl"), this); // Match references to types that are not defined in the old namespace. @@ -401,8 +409,12 @@ void ChangeNamespaceTool::run( Result.Nodes.getNodeAs<NamespaceDecl>("old_ns")) { moveOldNamespace(Result, NsDecl); } else if (const auto *FwdDecl = - Result.Nodes.getNodeAs<CXXRecordDecl>("fwd_decl")) { - moveClassForwardDeclaration(Result, FwdDecl); + Result.Nodes.getNodeAs<CXXRecordDecl>("class_fwd_decl")) { + moveClassForwardDeclaration(Result, cast<NamedDecl>(FwdDecl)); + } else if (const auto *TemplateFwdDecl = + Result.Nodes.getNodeAs<ClassTemplateDecl>( + "template_class_fwd_decl")) { + moveClassForwardDeclaration(Result, cast<NamedDecl>(TemplateFwdDecl)); } else if (const auto *UsingWithShadow = Result.Nodes.getNodeAs<UsingDecl>("using_with_shadow")) { fixUsingShadowDecl(Result, UsingWithShadow); @@ -539,7 +551,7 @@ void ChangeNamespaceTool::moveOldNamespa // } // x void ChangeNamespaceTool::moveClassForwardDeclaration( const ast_matchers::MatchFinder::MatchResult &Result, - const CXXRecordDecl *FwdDecl) { + const NamedDecl *FwdDecl) { SourceLocation Start = FwdDecl->getLocStart(); SourceLocation End = FwdDecl->getLocEnd(); SourceLocation AfterSemi = Lexer::findLocationAfterToken( Modified: clang-tools-extra/trunk/change-namespace/ChangeNamespace.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/change-namespace/ChangeNamespace.h?rev=288908&r1=288907&r2=288908&view=diff ============================================================================== --- clang-tools-extra/trunk/change-namespace/ChangeNamespace.h (original) +++ clang-tools-extra/trunk/change-namespace/ChangeNamespace.h Wed Dec 7 08:20:52 2016 @@ -64,7 +64,7 @@ private: void moveClassForwardDeclaration( const ast_matchers::MatchFinder::MatchResult &Result, - const CXXRecordDecl *FwdDecl); + const NamedDecl *FwdDecl); void replaceQualifiedSymbolInDeclContext( const ast_matchers::MatchFinder::MatchResult &Result, Modified: clang-tools-extra/trunk/unittests/change-namespace/ChangeNamespaceTests.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/change-namespace/ChangeNamespaceTests.cpp?rev=288908&r1=288907&r2=288908&view=diff ============================================================================== --- clang-tools-extra/trunk/unittests/change-namespace/ChangeNamespaceTests.cpp (original) +++ clang-tools-extra/trunk/unittests/change-namespace/ChangeNamespaceTests.cpp Wed Dec 7 08:20:52 2016 @@ -278,6 +278,7 @@ TEST_F(ChangeNamespaceTest, LeaveForward std::string Code = "namespace na {\n" "namespace nb {\n" "class FWD;\n" + "class FWD2;\n" "class A {\n" " FWD *fwd;\n" "};\n" @@ -286,6 +287,7 @@ TEST_F(ChangeNamespaceTest, LeaveForward std::string Expected = "namespace na {\n" "namespace nb {\n" "class FWD;\n" + "class FWD2;\n" "} // namespace nb\n" "} // namespace na\n" "namespace x {\n" @@ -296,6 +298,58 @@ TEST_F(ChangeNamespaceTest, LeaveForward "};\n" "} // namespace y\n" "} // namespace x\n"; + EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code)); +} + +TEST_F(ChangeNamespaceTest, TemplateClassForwardDeclaration) { + std::string Code = "namespace na {\n" + "namespace nb {\n" + "class FWD;\n" + "template<typename T> class FWD_TEMP;\n" + "class A {\n" + " FWD *fwd;\n" + "};\n" + "template<typename T> class TEMP {};\n" + "} // namespace nb\n" + "} // namespace na\n"; + std::string Expected = "namespace na {\n" + "namespace nb {\n" + "class FWD;\n" + "template<typename T> class FWD_TEMP;\n" + "} // namespace nb\n" + "} // namespace na\n" + "namespace x {\n" + "namespace y {\n" + "\n" + "class A {\n" + " na::nb::FWD *fwd;\n" + "};\n" + "template<typename T> class TEMP {};\n" + "} // namespace y\n" + "} // namespace x\n"; + EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code)); +} + +TEST_F(ChangeNamespaceTest, DontMoveForwardDeclarationInClass) { + std::string Code = "namespace na {\n" + "namespace nb {\n" + "class A {\n" + " class FWD;\n" + " FWD *fwd;\n" + " template<typename T> class FWD_TEMP;\n" + "};\n" + "} // namespace nb\n" + "} // namespace na\n"; + std::string Expected = "\n\n" + "namespace x {\n" + "namespace y {\n" + "class A {\n" + " class FWD;\n" + " FWD *fwd;\n" + " template<typename T> class FWD_TEMP;\n" + "};\n" + "} // namespace y\n" + "} // namespace x\n"; EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code)); } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits