[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 llvm-svn: 288908
This commit is contained in:
parent
b1332d8bf6
commit
41552d6a37
|
@ -303,10 +303,18 @@ void ChangeNamespaceTool::registerMatchers(ast_matchers::MatchFinder *Finder) {
|
||||||
.bind("old_ns"),
|
.bind("old_ns"),
|
||||||
this);
|
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(
|
Finder->addMatcher(
|
||||||
cxxRecordDecl(unless(anyOf(isImplicit(), isDefinition())), IsInMovedNs)
|
classTemplateDecl(unless(hasDescendant(cxxRecordDecl(isDefinition()))),
|
||||||
.bind("fwd_decl"),
|
IsInMovedNs, hasParent(namespaceDecl()))
|
||||||
|
.bind("template_class_fwd_decl"),
|
||||||
this);
|
this);
|
||||||
|
|
||||||
// Match references to types that are not defined in the old namespace.
|
// 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")) {
|
Result.Nodes.getNodeAs<NamespaceDecl>("old_ns")) {
|
||||||
moveOldNamespace(Result, NsDecl);
|
moveOldNamespace(Result, NsDecl);
|
||||||
} else if (const auto *FwdDecl =
|
} else if (const auto *FwdDecl =
|
||||||
Result.Nodes.getNodeAs<CXXRecordDecl>("fwd_decl")) {
|
Result.Nodes.getNodeAs<CXXRecordDecl>("class_fwd_decl")) {
|
||||||
moveClassForwardDeclaration(Result, FwdDecl);
|
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 =
|
} else if (const auto *UsingWithShadow =
|
||||||
Result.Nodes.getNodeAs<UsingDecl>("using_with_shadow")) {
|
Result.Nodes.getNodeAs<UsingDecl>("using_with_shadow")) {
|
||||||
fixUsingShadowDecl(Result, UsingWithShadow);
|
fixUsingShadowDecl(Result, UsingWithShadow);
|
||||||
|
@ -539,7 +551,7 @@ void ChangeNamespaceTool::moveOldNamespace(
|
||||||
// } // x
|
// } // x
|
||||||
void ChangeNamespaceTool::moveClassForwardDeclaration(
|
void ChangeNamespaceTool::moveClassForwardDeclaration(
|
||||||
const ast_matchers::MatchFinder::MatchResult &Result,
|
const ast_matchers::MatchFinder::MatchResult &Result,
|
||||||
const CXXRecordDecl *FwdDecl) {
|
const NamedDecl *FwdDecl) {
|
||||||
SourceLocation Start = FwdDecl->getLocStart();
|
SourceLocation Start = FwdDecl->getLocStart();
|
||||||
SourceLocation End = FwdDecl->getLocEnd();
|
SourceLocation End = FwdDecl->getLocEnd();
|
||||||
SourceLocation AfterSemi = Lexer::findLocationAfterToken(
|
SourceLocation AfterSemi = Lexer::findLocationAfterToken(
|
||||||
|
|
|
@ -64,7 +64,7 @@ private:
|
||||||
|
|
||||||
void moveClassForwardDeclaration(
|
void moveClassForwardDeclaration(
|
||||||
const ast_matchers::MatchFinder::MatchResult &Result,
|
const ast_matchers::MatchFinder::MatchResult &Result,
|
||||||
const CXXRecordDecl *FwdDecl);
|
const NamedDecl *FwdDecl);
|
||||||
|
|
||||||
void replaceQualifiedSymbolInDeclContext(
|
void replaceQualifiedSymbolInDeclContext(
|
||||||
const ast_matchers::MatchFinder::MatchResult &Result,
|
const ast_matchers::MatchFinder::MatchResult &Result,
|
||||||
|
|
|
@ -278,6 +278,7 @@ TEST_F(ChangeNamespaceTest, LeaveForwardDeclarationBehind) {
|
||||||
std::string Code = "namespace na {\n"
|
std::string Code = "namespace na {\n"
|
||||||
"namespace nb {\n"
|
"namespace nb {\n"
|
||||||
"class FWD;\n"
|
"class FWD;\n"
|
||||||
|
"class FWD2;\n"
|
||||||
"class A {\n"
|
"class A {\n"
|
||||||
" FWD *fwd;\n"
|
" FWD *fwd;\n"
|
||||||
"};\n"
|
"};\n"
|
||||||
|
@ -286,6 +287,7 @@ TEST_F(ChangeNamespaceTest, LeaveForwardDeclarationBehind) {
|
||||||
std::string Expected = "namespace na {\n"
|
std::string Expected = "namespace na {\n"
|
||||||
"namespace nb {\n"
|
"namespace nb {\n"
|
||||||
"class FWD;\n"
|
"class FWD;\n"
|
||||||
|
"class FWD2;\n"
|
||||||
"} // namespace nb\n"
|
"} // namespace nb\n"
|
||||||
"} // namespace na\n"
|
"} // namespace na\n"
|
||||||
"namespace x {\n"
|
"namespace x {\n"
|
||||||
|
@ -299,6 +301,58 @@ TEST_F(ChangeNamespaceTest, LeaveForwardDeclarationBehind) {
|
||||||
EXPECT_EQ(format(Expected), runChangeNamespaceOnCode(Code));
|
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));
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(ChangeNamespaceTest, MoveFunctions) {
|
TEST_F(ChangeNamespaceTest, MoveFunctions) {
|
||||||
std::string Code = "namespace na {\n"
|
std::string Code = "namespace na {\n"
|
||||||
"class C_A {};\n"
|
"class C_A {};\n"
|
||||||
|
|
Loading…
Reference in New Issue