data: fixed template specialization parse crash

handled conversion to DataType of clang::TemplateArgument when it is of integral kind.
This commit is contained in:
malte_langkabel
2015-02-05 12:08:57 +01:00
parent 9fc71f9d7f
commit 0649644663
3 changed files with 39 additions and 6 deletions
+1 -1
View File
@@ -320,7 +320,7 @@ bool ASTVisitor::VisitClassTemplateDecl(clang::ClassTemplateDecl* declaration)
const clang::TemplateArgumentList &argList = specializationDecl->getTemplateArgs();
for (int i = 0; i < argList.size(); i++)
{
std::vector<std::string> argumentNameHierarchy = utility::qualTypeToDataType(argList.get(i).getAsType()).getTypeNameHierarchy();
std::vector<std::string> argumentNameHierarchy = utility::templateArgumentToDataType(argList.get(i)).getTypeNameHierarchy();
m_client->onTemplateRecordArgumentTypeParsed(ParseLocation(), argumentNameHierarchy, specializedRecordNameHierarchy); // TODO: What about the ParseLocation
}
}
+37 -5
View File
@@ -167,12 +167,28 @@ namespace utility
}
else if (clang::isa<clang::ClassTemplatePartialSpecializationDecl>(declaration))
{
int templateArgumentCount = clang::dyn_cast<clang::ClassTemplatePartialSpecializationDecl>(declaration)->getTemplateArgs().size();
const clang::ASTTemplateArgumentListInfo* templateArgumentListInfo = clang::dyn_cast<clang::ClassTemplatePartialSpecializationDecl>(declaration)->getTemplateArgsAsWritten();
const clang::ClassTemplatePartialSpecializationDecl* partialSpecializationDecl =
clang::dyn_cast<clang::ClassTemplatePartialSpecializationDecl>(declaration);
int templateArgumentCount = partialSpecializationDecl->getTemplateArgs().size();
const clang::ASTTemplateArgumentListInfo* templateArgumentListInfo = partialSpecializationDecl->getTemplateArgsAsWritten();
std::string specializedParameterNamePart = "<";
for (int i = 0; i < templateArgumentCount; i++)
{
specializedParameterNamePart += templateArgumentListInfo->getTemplateArgs()[i].getArgument().getAsType().getAsString();
const clang::TemplateArgument& templateArgument = templateArgumentListInfo->getTemplateArgs()[i].getArgument();
const clang::TemplateArgument::ArgKind kind = templateArgument.getKind();
switch (kind)
{
case clang::TemplateArgument::Type:
specializedParameterNamePart += templateArgument.getAsType().getAsString();
break;
case clang::TemplateArgument::Integral:
specializedParameterNamePart += templateArgument.getIntegralType().getAsString();
break;
default:
LOG_ERROR("Type of template argument not handled.");
break;
}
specializedParameterNamePart += (i < templateArgumentCount - 1) ? ", " : "";
}
specializedParameterNamePart += ">";
@@ -184,8 +200,8 @@ namespace utility
const clang::TemplateArgumentList& templateArgumentList = clang::dyn_cast<clang::ClassTemplateSpecializationDecl>(declaration)->getTemplateArgs();
for (size_t i = 0; i < templateArgumentList.size(); i++)
{
DataType datatype = utility::qualTypeToDataType(templateArgumentList.get(i).getAsType());
specializedParameterNamePart += datatype.getFullTypeName();
const clang::TemplateArgument& templateArgument = templateArgumentList.get(i);
specializedParameterNamePart += templateArgumentToDataType(templateArgument).getFullTypeName();
specializedParameterNamePart += (i < templateArgumentList.size() - 1) ? ", " : "";
}
specializedParameterNamePart += ">";
@@ -229,4 +245,20 @@ namespace utility
}
return specializationParentNameHierarchy;
}
DataType templateArgumentToDataType(const clang::TemplateArgument& argument)
{
const clang::TemplateArgument::ArgKind kind = argument.getKind();
switch (kind)
{
case clang::TemplateArgument::Type:
return utility::qualTypeToDataType(argument.getAsType());
case clang::TemplateArgument::Integral:
return utility::qualTypeToDataType(argument.getIntegralType());
default:
LOG_ERROR("Type of template argument not handled.");
break;
}
return DataType(std::vector<std::string>());
}
}
+1
View File
@@ -19,6 +19,7 @@ namespace utility
std::vector<std::string> getContextNameHierarchy(clang::DeclContext* declaration);
std::string getDeclName(clang::NamedDecl* declaration);
std::vector<std::string> getTemplateSpecializationParentNameHierarchy(clang::ClassTemplateSpecializationDecl* declaration);
DataType templateArgumentToDataType(const clang::TemplateArgument& argument);
}
#endif // UTILITY_CLANG_H