* removed trial target * updated deploy scripts to exclude trial * cleanup CMakeLists * removed Eigen dependencies * split parser lib into lib_cxx and lib_java * added ProjectFactory and ProjectFactoryModules * removed old installer projects * updated wix installer * updated readme for wix setup * updated to use obfuscated exe * added qt.conf * added indexing dialog images * added jars * added coatidb files of sample projects * added source code of javaparser sample * removed auto-refresh image * intermediate files of windows installer are created in build folder * preselected desktop shortcut * build bat is executed from deploy_windows script
76 lines
2.3 KiB
C++
76 lines
2.3 KiB
C++
#include "data/parser/cxx/name_resolver/CxxTemplateArgumentNameResolver.h"
|
|
|
|
#include <clang/AST/PrettyPrinter.h>
|
|
#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()
|
|
: CxxNameResolver(std::vector<const clang::Decl*>())
|
|
{
|
|
}
|
|
|
|
CxxTemplateArgumentNameResolver::CxxTemplateArgumentNameResolver(std::vector<const clang::Decl*> ignoredContextDecls)
|
|
: CxxNameResolver(ignoredContextDecls)
|
|
{
|
|
}
|
|
|
|
CxxTemplateArgumentNameResolver::~CxxTemplateArgumentNameResolver()
|
|
{
|
|
}
|
|
|
|
std::string CxxTemplateArgumentNameResolver::getTemplateArgumentName(const clang::TemplateArgument& argument)
|
|
{
|
|
// This doesn't work correctly if the template argument is dependent.
|
|
// If that's required: build name from depth and index of template arg.
|
|
const clang::TemplateArgument::ArgKind kind = argument.getKind();
|
|
switch (kind)
|
|
{
|
|
case clang::TemplateArgument::Type:
|
|
{
|
|
CxxTypeNameResolver typeNameResolver(getIgnoredContextDecls());
|
|
return typeNameResolver.qualTypeToDataType(argument.getAsType())->getFullTypeName();
|
|
}
|
|
case clang::TemplateArgument::Integral:
|
|
case clang::TemplateArgument::Null:
|
|
case clang::TemplateArgument::Declaration:
|
|
case clang::TemplateArgument::NullPtr:
|
|
case clang::TemplateArgument::Template:
|
|
case clang::TemplateArgument::TemplateExpansion: // handled correctly? template template parameter...
|
|
case clang::TemplateArgument::Expression:
|
|
{
|
|
clang::PrintingPolicy pp = clang::PrintingPolicy(clang::LangOptions());
|
|
pp.SuppressTagKeyword = true; // value "true": for a class A it prints "A" instead of "class A"
|
|
pp.Bool = true; // value "true": prints bool type as "bool" instead of "_Bool"
|
|
|
|
std::string buf;
|
|
llvm::raw_string_ostream os(buf);
|
|
argument.print(pp, os);
|
|
const std::string typeName = os.str();
|
|
|
|
return typeName;
|
|
}
|
|
case clang::TemplateArgument::Pack:
|
|
{
|
|
std::string typeName = "<";
|
|
argument.getPackAsArray();
|
|
llvm::ArrayRef<clang::TemplateArgument> pack = argument.getPackAsArray();
|
|
for (size_t i = 0; i < pack.size(); i++)
|
|
{
|
|
typeName += getTemplateArgumentName(pack[i]);
|
|
if (i < pack.size() - 1)
|
|
{
|
|
typeName += ", ";
|
|
}
|
|
}
|
|
typeName += ">";
|
|
|
|
return typeName;
|
|
}
|
|
}
|
|
|
|
return "";
|
|
}
|