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)
|
if (type->getTypeClass() == clang::Type::TemplateSpecialization)
|
||||||
{
|
{
|
||||||
const clang::TemplateSpecializationType* templateSpecializationType = type->getAs<clang::TemplateSpecializationType>();
|
const clang::TemplateSpecializationType* templateSpecializationType = type->getAs<clang::TemplateSpecializationType>();
|
||||||
CxxDeclNameResolver declNameResolver(templateSpecializationType->getTemplateName().getAsTemplateDecl());
|
|
||||||
|
|
||||||
CxxTemplateArgumentNameResolver resolver;
|
|
||||||
for (size_t i = 0; i < templateSpecializationType->getNumArgs(); i++)
|
for (size_t i = 0; i < templateSpecializationType->getNumArgs(); i++)
|
||||||
{
|
{
|
||||||
std::string argumentName = resolver.getTemplateArgumentName(templateSpecializationType->getArg(i));
|
CxxTemplateArgumentNameResolver resolver;
|
||||||
NameHierarchy argumentNameHierarchy;
|
std::shared_ptr<DataType> argumentType = resolver.getTemplateArgumentType(templateSpecializationType->getArg(i));
|
||||||
argumentNameHierarchy.push(std::make_shared<NameElement>(argumentName));
|
if (argumentType->getFullTypeName().size() > 0)
|
||||||
|
{
|
||||||
std::shared_ptr<DataType> argumentType = std::make_shared<NamedDataType>(argumentNameHierarchy);
|
m_client->onTypeUsageParsed(getParseTypeUsage(typeInfo->getTypeLoc(), argumentType), t);
|
||||||
|
}
|
||||||
m_client->onTypeUsageParsed(getParseTypeUsage(typeInfo->getTypeLoc(), argumentType), t);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -983,17 +979,12 @@ void ASTVisitor::saveFunctionTemplateArgumentTypeUsages(
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
CxxTemplateArgumentNameResolver resolver;
|
|
||||||
for (size_t i = 0; i < argumentList->size(); i++)
|
for (size_t i = 0; i < argumentList->size(); i++)
|
||||||
{
|
{
|
||||||
std::string argumentName = resolver.getTemplateArgumentName(argumentList->get(i));
|
CxxTemplateArgumentNameResolver resolver;
|
||||||
if (argumentName.size())
|
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);
|
m_client->onTypeUsageParsed(getParseTypeUsage(sourceRange, argumentType), t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
#include <clang/AST/DeclTemplate.h>
|
#include <clang/AST/DeclTemplate.h>
|
||||||
|
|
||||||
#include "data/parser/cxx/name_resolver/CxxTypeNameResolver.h"
|
#include "data/parser/cxx/name_resolver/CxxTypeNameResolver.h"
|
||||||
|
#include "data/type/NamedDataType.h"
|
||||||
#include "utility/logging/logging.h"
|
#include "utility/logging/logging.h"
|
||||||
|
|
||||||
CxxTemplateArgumentNameResolver::CxxTemplateArgumentNameResolver()
|
CxxTemplateArgumentNameResolver::CxxTemplateArgumentNameResolver()
|
||||||
@@ -21,6 +22,11 @@ CxxTemplateArgumentNameResolver::~CxxTemplateArgumentNameResolver()
|
|||||||
}
|
}
|
||||||
|
|
||||||
std::string CxxTemplateArgumentNameResolver::getTemplateArgumentName(const clang::TemplateArgument& argument)
|
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();
|
const clang::TemplateArgument::ArgKind kind = argument.getKind();
|
||||||
switch (kind)
|
switch (kind)
|
||||||
@@ -28,7 +34,7 @@ std::string CxxTemplateArgumentNameResolver::getTemplateArgumentName(const clang
|
|||||||
case clang::TemplateArgument::Type:
|
case clang::TemplateArgument::Type:
|
||||||
{
|
{
|
||||||
CxxTypeNameResolver typeNameResolver(getIgnoredContextDecls());
|
CxxTypeNameResolver typeNameResolver(getIgnoredContextDecls());
|
||||||
return typeNameResolver.qualTypeToDataType(argument.getAsType())->getFullTypeName();
|
return typeNameResolver.qualTypeToDataType(argument.getAsType());
|
||||||
}
|
}
|
||||||
case clang::TemplateArgument::Integral:
|
case clang::TemplateArgument::Integral:
|
||||||
case clang::TemplateArgument::Null:
|
case clang::TemplateArgument::Null:
|
||||||
@@ -45,11 +51,18 @@ std::string CxxTemplateArgumentNameResolver::getTemplateArgumentName(const clang
|
|||||||
std::string buf;
|
std::string buf;
|
||||||
llvm::raw_string_ostream os(buf);
|
llvm::raw_string_ostream os(buf);
|
||||||
argument.print(pp, os);
|
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:
|
case clang::TemplateArgument::Pack:
|
||||||
LOG_ERROR("Type of template argument not handled: Pack");
|
LOG_ERROR("Type of template argument not handled: Pack");
|
||||||
break;
|
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
|
#ifndef CXX_TEMPLATE_ARGUMENT_NAME_RESOLVER_H
|
||||||
#define CXX_TEMPLATE_ARGUMENT_NAME_RESOLVER_H
|
#define CXX_TEMPLATE_ARGUMENT_NAME_RESOLVER_H
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
|
||||||
#include "data/parser/cxx/name_resolver/CxxNameResolver.h"
|
#include "data/parser/cxx/name_resolver/CxxNameResolver.h"
|
||||||
|
|
||||||
|
class DataType;
|
||||||
|
|
||||||
class CxxTemplateArgumentNameResolver: public CxxNameResolver
|
class CxxTemplateArgumentNameResolver: public CxxNameResolver
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -11,6 +15,7 @@ public:
|
|||||||
~CxxTemplateArgumentNameResolver();
|
~CxxTemplateArgumentNameResolver();
|
||||||
|
|
||||||
std::string getTemplateArgumentName(const clang::TemplateArgument& argument);
|
std::string getTemplateArgumentName(const clang::TemplateArgument& argument);
|
||||||
|
std::shared_ptr<DataType> getTemplateArgumentType(const clang::TemplateArgument& argument);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // CXX_TEMPLATE_ARGUMENT_NAME_RESOLVER_H
|
#endif // CXX_TEMPLATE_ARGUMENT_NAME_RESOLVER_H
|
||||||
|
|||||||
Reference in New Issue
Block a user