Skip to content

Commit d14f09a

Browse files
committed
Add qualified template name to GetCXXRecordDeclFromBaseType.
1 parent 9f3ce76 commit d14f09a

File tree

1 file changed

+21
-3
lines changed

1 file changed

+21
-3
lines changed

src/CppParser/Parser.cpp

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -874,14 +874,32 @@ static bool IsRecordValid(const clang::RecordDecl* RC)
874874
return IsRecordValid(RC, Visited);
875875
}
876876

877-
static clang::CXXRecordDecl* GetCXXRecordDeclFromBaseType(const clang::QualType& Ty) {
877+
static clang::CXXRecordDecl* GetCXXRecordDeclFromTemplateName(const clang::TemplateName& Name)
878+
{
879+
using namespace clang;
880+
881+
switch (Name.getKind()) {
882+
case clang::TemplateName::Template:
883+
return dyn_cast<clang::CXXRecordDecl>(
884+
Name.getAsTemplateDecl()->getTemplatedDecl());
885+
case clang::TemplateName::QualifiedTemplate:
886+
return GetCXXRecordDeclFromTemplateName(
887+
Name.getAsQualifiedTemplateName()->getUnderlyingTemplate());
888+
default:
889+
Name.dump();
890+
assert(0 && "Unknown template name kind");
891+
return nullptr;
892+
}
893+
}
894+
895+
static clang::CXXRecordDecl* GetCXXRecordDeclFromBaseType(const clang::QualType& Ty)
896+
{
878897
using namespace clang;
879898

880899
if (auto RT = Ty->getAs<clang::RecordType>())
881900
return dyn_cast<clang::CXXRecordDecl>(RT->getDecl());
882901
else if (auto TST = Ty->getAs<clang::TemplateSpecializationType>())
883-
return dyn_cast<clang::CXXRecordDecl>(
884-
TST->getTemplateName().getAsTemplateDecl()->getTemplatedDecl());
902+
return GetCXXRecordDeclFromTemplateName(TST->getTemplateName());
885903
else if (auto Injected = Ty->getAs<clang::InjectedClassNameType>())
886904
return Injected->getDecl();
887905

0 commit comments

Comments
 (0)