From 7e71f5a9fadd08db6a25401e16d5bcc370ebb480 Mon Sep 17 00:00:00 2001 From: Joao Matos Date: Mon, 17 Jul 2023 21:52:13 +0100 Subject: [PATCH] Add qualified template name to GetCXXRecordDeclFromBaseType. --- src/CppParser/Parser.cpp | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src/CppParser/Parser.cpp b/src/CppParser/Parser.cpp index 3d8d8796..97d77366 100644 --- a/src/CppParser/Parser.cpp +++ b/src/CppParser/Parser.cpp @@ -874,14 +874,31 @@ static bool IsRecordValid(const clang::RecordDecl* RC) return IsRecordValid(RC, Visited); } -static clang::CXXRecordDecl* GetCXXRecordDeclFromBaseType(const clang::QualType& Ty) { +static clang::CXXRecordDecl* GetCXXRecordDeclFromTemplateName(const clang::TemplateName& Name) +{ + using namespace clang; + + switch (Name.getKind()) { + case clang::TemplateName::Template: + return dyn_cast( + Name.getAsTemplateDecl()->getTemplatedDecl()); + case clang::TemplateName::QualifiedTemplate: + return dyn_cast( + Name.getAsQualifiedTemplateName()->getTemplateDecl()->getTemplatedDecl()); + default: + assert(0 && "Unknown template name kind"); + return nullptr; + } +} + +static clang::CXXRecordDecl* GetCXXRecordDeclFromBaseType(const clang::QualType& Ty) +{ using namespace clang; if (auto RT = Ty->getAs()) return dyn_cast(RT->getDecl()); else if (auto TST = Ty->getAs()) - return dyn_cast( - TST->getTemplateName().getAsTemplateDecl()->getTemplatedDecl()); + return GetCXXRecordDeclFromTemplateName(TST->getTemplateName()); else if (auto Injected = Ty->getAs()) return Injected->getDecl();