Skip to content

Commit f17a130

Browse files
committed
Do not skip renaming class template explicit specializations/instantiations
1 parent dff59da commit f17a130

File tree

2 files changed

+33
-75
lines changed

2 files changed

+33
-75
lines changed

clang_delta/CommonRenameClassRewriteVisitor.h

Lines changed: 16 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,6 @@ class CommonRenameClassRewriteVisitor : public RecursiveASTVisitor<T> {
5757
bool VisitDependentTemplateSpecializationTypeLoc(
5858
DependentTemplateSpecializationTypeLoc DTSLoc);
5959

60-
bool VisitClassTemplatePartialSpecializationDecl(
61-
ClassTemplatePartialSpecializationDecl *D);
62-
6360
bool VisitClassTemplateSpecializationDecl(
6461
ClassTemplateSpecializationDecl *TSD);
6562

@@ -122,35 +119,6 @@ bool CommonRenameClassRewriteVisitor<T>::TraverseConstructorInitializer(
122119
return true;
123120
}
124121

125-
template<typename T>
126-
bool CommonRenameClassRewriteVisitor<T>::
127-
VisitClassTemplatePartialSpecializationDecl(
128-
ClassTemplatePartialSpecializationDecl *D)
129-
{
130-
const Type *Ty = D->getInjectedSpecializationType().getTypePtr();
131-
TransAssert(Ty && "Bad TypePtr!");
132-
const TemplateSpecializationType *TST =
133-
dyn_cast<TemplateSpecializationType>(Ty);
134-
TransAssert(TST && "Bad TemplateSpecializationType!");
135-
136-
TemplateName TplName = TST->getTemplateName();
137-
const TemplateDecl *TplD = TplName.getAsTemplateDecl();
138-
TransAssert(TplD && "Invalid TemplateDecl!");
139-
NamedDecl *ND = TplD->getTemplatedDecl();
140-
TransAssert(ND && "Invalid NamedDecl!");
141-
142-
const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(ND);
143-
TransAssert(CXXRD && "Invalid CXXRecordDecl!");
144-
145-
std::string Name;
146-
if (getNewName(CXXRD, Name)) {
147-
SourceLocation LocStart = D->getLocation();
148-
TransAssert(LocStart.isValid() && "Invalid Location!");
149-
TheRewriter->ReplaceText(LocStart, CXXRD->getNameAsString().size(), Name);
150-
}
151-
return true;
152-
}
153-
154122
// ISSUE: I am not sure why, but RecursiveASTVisitor doesn't recursively
155123
// visit base classes from explicit template specialization, e.g.,
156124
// struct A { };
@@ -162,14 +130,24 @@ template<typename T>
162130
bool CommonRenameClassRewriteVisitor<T>::VisitClassTemplateSpecializationDecl(
163131
ClassTemplateSpecializationDecl *TSD)
164132
{
165-
if (!TSD->isExplicitSpecialization() || !TSD->isCompleteDefinition())
133+
if (!TSD->isExplicitInstantiationOrSpecialization())
166134
return true;
167135

168-
for (CXXRecordDecl::base_class_const_iterator I = TSD->bases_begin(),
169-
E = TSD->bases_end(); I != E; ++I) {
170-
TypeSourceInfo *TSI = (*I).getTypeSourceInfo();
171-
TransAssert(TSI && "Bad TypeSourceInfo!");
172-
getDerived().TraverseTypeLoc(TSI->getTypeLoc());
136+
const CXXRecordDecl *CXXRD = TSD->getSpecializedTemplate()->getTemplatedDecl();
137+
std::string Name;
138+
if (getNewName(CXXRD, Name)) {
139+
SourceLocation LocStart = TSD->getLocation();
140+
TransAssert(LocStart.isValid() && "Invalid Location!");
141+
TheRewriter->ReplaceText(LocStart, CXXRD->getNameAsString().size(), Name);
142+
}
143+
144+
if (TSD->isExplicitSpecialization() && TSD->isCompleteDefinition()) {
145+
for (CXXRecordDecl::base_class_const_iterator I = TSD->bases_begin(),
146+
E = TSD->bases_end(); I != E; ++I) {
147+
TypeSourceInfo *TSI = (*I).getTypeSourceInfo();
148+
TransAssert(TSI && "Bad TypeSourceInfo!");
149+
getDerived().TraverseTypeLoc(TSI->getTypeLoc());
150+
}
173151
}
174152
return true;
175153
}

clang_delta/RemoveNamespace.cpp

Lines changed: 17 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,6 @@ class RemoveNamespaceRewriteVisitor : public
9191
bool VisitTemplateSpecializationTypeLoc(
9292
TemplateSpecializationTypeLoc TSPLoc);
9393

94-
bool VisitClassTemplatePartialSpecializationDecl(
95-
ClassTemplatePartialSpecializationDecl *D);
96-
9794
bool VisitDependentTemplateSpecializationTypeLoc(
9895
DependentTemplateSpecializationTypeLoc DTSLoc);
9996

@@ -132,14 +129,25 @@ bool RemoveNamespaceASTVisitor::VisitNamespaceDecl(NamespaceDecl *ND)
132129
bool RemoveNamespaceRewriteVisitor::VisitClassTemplateSpecializationDecl(
133130
ClassTemplateSpecializationDecl *TSD)
134131
{
135-
if (!TSD->isExplicitSpecialization() || !TSD->isCompleteDefinition())
132+
if (!TSD->isExplicitInstantiationOrSpecialization())
136133
return true;
137134

138-
for (CXXRecordDecl::base_class_const_iterator I = TSD->bases_begin(),
139-
E = TSD->bases_end(); I != E; ++I) {
140-
TypeSourceInfo *TSI = (*I).getTypeSourceInfo();
141-
TransAssert(TSI && "Bad TypeSourceInfo!");
142-
TraverseTypeLoc(TSI->getTypeLoc());
135+
const CXXRecordDecl *CXXRD = TSD->getSpecializedTemplate()->getTemplatedDecl();
136+
std::string Name;
137+
if (ConsumerInstance->getNewName(CXXRD, Name)) {
138+
SourceLocation LocStart = TSD->getLocation();
139+
TransAssert(LocStart.isValid() && "Invalid Location!");
140+
ConsumerInstance->TheRewriter.ReplaceText(
141+
LocStart, CXXRD->getNameAsString().size(), Name);
142+
}
143+
144+
if (TSD->isExplicitSpecialization() && TSD->isCompleteDefinition()) {
145+
for (CXXRecordDecl::base_class_const_iterator I = TSD->bases_begin(),
146+
E = TSD->bases_end(); I != E; ++I) {
147+
TypeSourceInfo *TSI = (*I).getTypeSourceInfo();
148+
TransAssert(TSI && "Bad TypeSourceInfo!");
149+
TraverseTypeLoc(TSI->getTypeLoc());
150+
}
143151
}
144152
return true;
145153
}
@@ -419,34 +427,6 @@ bool RemoveNamespaceRewriteVisitor::VisitTemplateSpecializationTypeLoc(
419427
return true;
420428
}
421429

422-
bool RemoveNamespaceRewriteVisitor::VisitClassTemplatePartialSpecializationDecl(
423-
ClassTemplatePartialSpecializationDecl *D)
424-
{
425-
const Type *Ty = D->getInjectedSpecializationType().getTypePtr();
426-
TransAssert(Ty && "Bad TypePtr!");
427-
const TemplateSpecializationType *TST =
428-
dyn_cast<TemplateSpecializationType>(Ty);
429-
TransAssert(TST && "Bad TemplateSpecializationType!");
430-
431-
TemplateName TplName = TST->getTemplateName();
432-
const TemplateDecl *TplD = TplName.getAsTemplateDecl();
433-
TransAssert(TplD && "Invalid TemplateDecl!");
434-
NamedDecl *ND = TplD->getTemplatedDecl();
435-
TransAssert(ND && "Invalid NamedDecl!");
436-
437-
const CXXRecordDecl *CXXRD = dyn_cast<CXXRecordDecl>(ND);
438-
TransAssert(CXXRD && "Invalid CXXRecordDecl!");
439-
440-
std::string Name;
441-
if (ConsumerInstance->getNewName(CXXRD, Name)) {
442-
SourceLocation LocStart = D->getLocation();
443-
TransAssert(LocStart.isValid() && "Invalid Location!");
444-
ConsumerInstance->TheRewriter.ReplaceText(
445-
LocStart, CXXRD->getNameAsString().size(), Name);
446-
}
447-
return true;
448-
}
449-
450430
// handle the case where a template specialization type cannot be resolved, e.g.
451431
// template <class T> struct Base {};
452432
// template <class T> struct Derived: public Base<T> {

0 commit comments

Comments
 (0)