data: Fixed splitting of name hierarchy for template Arguments
* fixed bug where types used by templates as arguments have not been split into proper name hierarchy.
This commit is contained in:
@@ -957,18 +957,14 @@ void ASTVisitor::saveClassTemplateArgumentTypeUsages(const clang::TypeSourceInfo
|
||||
if (type->getTypeClass() == clang::Type::TemplateSpecialization)
|
||||
{
|
||||
const clang::TemplateSpecializationType* templateSpecializationType = type->getAs<clang::TemplateSpecializationType>();
|
||||
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<NameElement>(argumentName));
|
||||
|
||||
std::shared_ptr<DataType> argumentType = std::make_shared<NamedDataType>(argumentNameHierarchy);
|
||||
|
||||
m_client->onTypeUsageParsed(getParseTypeUsage(typeInfo->getTypeLoc(), argumentType), t);
|
||||
CxxTemplateArgumentNameResolver resolver;
|
||||
std::shared_ptr<DataType> 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<DataType> argumentType = resolver.getTemplateArgumentType(argumentList->get(i));
|
||||
if (argumentType->getFullTypeName().size() > 0)
|
||||
{
|
||||
NameHierarchy argumentNameHierarchy;
|
||||
argumentNameHierarchy.push(std::make_shared<NameElement>(argumentName));
|
||||
|
||||
std::shared_ptr<DataType> argumentType = std::make_shared<NamedDataType>(argumentNameHierarchy);
|
||||
|
||||
m_client->onTypeUsageParsed(getParseTypeUsage(sourceRange, argumentType), t);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <clang/AST/DeclTemplate.h>
|
||||
|
||||
#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<DataType> 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<NameElement>(typeName));
|
||||
return std::make_shared<NamedDataType>(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<NameElement>(""));
|
||||
return std::make_shared<NamedDataType>(typeNameHerarchy);
|
||||
}
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
#ifndef CXX_TEMPLATE_ARGUMENT_NAME_RESOLVER_H
|
||||
#define CXX_TEMPLATE_ARGUMENT_NAME_RESOLVER_H
|
||||
|
||||
#include <memory>
|
||||
|
||||
#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<DataType> getTemplateArgumentType(const clang::TemplateArgument& argument);
|
||||
};
|
||||
|
||||
#endif // CXX_TEMPLATE_ARGUMENT_NAME_RESOLVER_H
|
||||
|
||||
Reference in New Issue
Block a user