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) 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