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:
malte_langkabel
2015-05-27 10:35:41 +02:00
parent 149bb52c4c
commit 8949470848
3 changed files with 30 additions and 21 deletions
+9 -18
View File
@@ -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