diff --git a/src/lib/data/parser/cxx/ASTVisitor.cpp b/src/lib/data/parser/cxx/ASTVisitor.cpp index 59cf03b1..daf56d74 100644 --- a/src/lib/data/parser/cxx/ASTVisitor.cpp +++ b/src/lib/data/parser/cxx/ASTVisitor.cpp @@ -957,18 +957,14 @@ void ASTVisitor::saveClassTemplateArgumentTypeUsages(const clang::TypeSourceInfo if (type->getTypeClass() == clang::Type::TemplateSpecialization) { const clang::TemplateSpecializationType* templateSpecializationType = type->getAs(); - CxxDeclNameResolver declNameResolver(templateSpecializationType->getTemplateName().getAsTemplateDecl()); - - CxxTemplateArgumentNameResolver resolver; for (size_t i = 0; i < templateSpecializationType->getNumArgs(); i++) { - std::string argumentName = resolver.getTemplateArgumentName(templateSpecializationType->getArg(i)); - NameHierarchy argumentNameHierarchy; - argumentNameHierarchy.push(std::make_shared(argumentName)); - - std::shared_ptr argumentType = std::make_shared(argumentNameHierarchy); - - m_client->onTypeUsageParsed(getParseTypeUsage(typeInfo->getTypeLoc(), argumentType), t); + CxxTemplateArgumentNameResolver resolver; + std::shared_ptr argumentType = resolver.getTemplateArgumentType(templateSpecializationType->getArg(i)); + if (argumentType->getFullTypeName().size() > 0) + { + m_client->onTypeUsageParsed(getParseTypeUsage(typeInfo->getTypeLoc(), argumentType), t); + } } } } @@ -983,17 +979,12 @@ void ASTVisitor::saveFunctionTemplateArgumentTypeUsages( return; } - CxxTemplateArgumentNameResolver resolver; for (size_t i = 0; i < argumentList->size(); i++) { - std::string argumentName = resolver.getTemplateArgumentName(argumentList->get(i)); - if (argumentName.size()) + CxxTemplateArgumentNameResolver resolver; + std::shared_ptr argumentType = resolver.getTemplateArgumentType(argumentList->get(i)); + if (argumentType->getFullTypeName().size() > 0) { - NameHierarchy argumentNameHierarchy; - argumentNameHierarchy.push(std::make_shared(argumentName)); - - std::shared_ptr argumentType = std::make_shared(argumentNameHierarchy); - m_client->onTypeUsageParsed(getParseTypeUsage(sourceRange, argumentType), t); } } diff --git a/src/lib/data/parser/cxx/name_resolver/CxxTemplateArgumentNameResolver.cpp b/src/lib/data/parser/cxx/name_resolver/CxxTemplateArgumentNameResolver.cpp index ceb6b106..bae9307c 100644 --- a/src/lib/data/parser/cxx/name_resolver/CxxTemplateArgumentNameResolver.cpp +++ b/src/lib/data/parser/cxx/name_resolver/CxxTemplateArgumentNameResolver.cpp @@ -4,6 +4,7 @@ #include #include "data/parser/cxx/name_resolver/CxxTypeNameResolver.h" +#include "data/type/NamedDataType.h" #include "utility/logging/logging.h" CxxTemplateArgumentNameResolver::CxxTemplateArgumentNameResolver() @@ -21,6 +22,11 @@ CxxTemplateArgumentNameResolver::~CxxTemplateArgumentNameResolver() } std::string CxxTemplateArgumentNameResolver::getTemplateArgumentName(const clang::TemplateArgument& argument) +{ + return getTemplateArgumentType(argument)->getFullTypeName(); +} + +std::shared_ptr CxxTemplateArgumentNameResolver::getTemplateArgumentType(const clang::TemplateArgument& argument) { const clang::TemplateArgument::ArgKind kind = argument.getKind(); switch (kind) @@ -28,7 +34,7 @@ std::string CxxTemplateArgumentNameResolver::getTemplateArgumentName(const clang case clang::TemplateArgument::Type: { CxxTypeNameResolver typeNameResolver(getIgnoredContextDecls()); - return typeNameResolver.qualTypeToDataType(argument.getAsType())->getFullTypeName(); + return typeNameResolver.qualTypeToDataType(argument.getAsType()); } case clang::TemplateArgument::Integral: case clang::TemplateArgument::Null: @@ -45,11 +51,18 @@ std::string CxxTemplateArgumentNameResolver::getTemplateArgumentName(const clang std::string buf; llvm::raw_string_ostream os(buf); argument.print(pp, os); - return os.str(); + const std::string typeName = os.str(); + + NameHierarchy typeNameHerarchy; + typeNameHerarchy.push(std::make_shared(typeName)); + return std::make_shared(typeNameHerarchy); } case clang::TemplateArgument::Pack: LOG_ERROR("Type of template argument not handled: Pack"); break; } - return std::string(); + + NameHierarchy typeNameHerarchy; + typeNameHerarchy.push(std::make_shared("")); + return std::make_shared(typeNameHerarchy); } diff --git a/src/lib/data/parser/cxx/name_resolver/CxxTemplateArgumentNameResolver.h b/src/lib/data/parser/cxx/name_resolver/CxxTemplateArgumentNameResolver.h index 29763dbb..c0b4d5ac 100644 --- a/src/lib/data/parser/cxx/name_resolver/CxxTemplateArgumentNameResolver.h +++ b/src/lib/data/parser/cxx/name_resolver/CxxTemplateArgumentNameResolver.h @@ -1,8 +1,12 @@ #ifndef CXX_TEMPLATE_ARGUMENT_NAME_RESOLVER_H #define CXX_TEMPLATE_ARGUMENT_NAME_RESOLVER_H +#include + #include "data/parser/cxx/name_resolver/CxxNameResolver.h" +class DataType; + class CxxTemplateArgumentNameResolver: public CxxNameResolver { public: @@ -11,6 +15,7 @@ public: ~CxxTemplateArgumentNameResolver(); std::string getTemplateArgumentName(const clang::TemplateArgument& argument); + std::shared_ptr getTemplateArgumentType(const clang::TemplateArgument& argument); }; #endif // CXX_TEMPLATE_ARGUMENT_NAME_RESOLVER_H