void StmtProfiler::VisitTemplateArgument(const TemplateArgument &Arg) { // Mostly repetitive with TemplateArgument::Profile! ID.AddInteger(Arg.getKind()); switch (Arg.getKind()) { case TemplateArgument::Null: break; case TemplateArgument::Type: VisitType(Arg.getAsType()); break; case TemplateArgument::Template: case TemplateArgument::TemplateExpansion: VisitTemplateName(Arg.getAsTemplateOrTemplatePattern()); break; case TemplateArgument::Declaration: VisitDecl(Arg.getAsDecl()); break; case TemplateArgument::NullPtr: VisitType(Arg.getNullPtrType()); break; case TemplateArgument::Integral: Arg.getAsIntegral().Profile(ID); VisitType(Arg.getIntegralType()); break; case TemplateArgument::Expression: Visit(Arg.getAsExpr()); break; case TemplateArgument::Pack: for (const auto &P : Arg.pack_elements()) VisitTemplateArgument(P); break; } }
static void PrintTemplateArgument(std::string &Buffer, const TemplateArgument &Arg, const PrintingPolicy &Policy) { switch (Arg.getKind()) { case TemplateArgument::Null: assert(false && "Null template argument"); break; case TemplateArgument::Type: Arg.getAsType().getAsStringInternal(Buffer, Policy); break; case TemplateArgument::Declaration: Buffer = cast<NamedDecl>(Arg.getAsDecl())->getNameAsString(); break; case TemplateArgument::Template: { llvm::raw_string_ostream s(Buffer); Arg.getAsTemplate().print(s, Policy); break; } case TemplateArgument::Integral: Buffer = Arg.getAsIntegral()->toString(10, true); break; case TemplateArgument::Expression: { llvm::raw_string_ostream s(Buffer); Arg.getAsExpr()->printPretty(s, 0, Policy); break; } case TemplateArgument::Pack: assert(0 && "FIXME: Implement!"); break; } }
void StmtProfiler::VisitTemplateArgument(const TemplateArgument &Arg) { // Mostly repetitive with TemplateArgument::Profile! ID.AddInteger(Arg.getKind()); switch (Arg.getKind()) { case TemplateArgument::Null: break; case TemplateArgument::Type: VisitType(Arg.getAsType()); break; case TemplateArgument::Template: case TemplateArgument::TemplateExpansion: VisitTemplateName(Arg.getAsTemplateOrTemplatePattern()); break; case TemplateArgument::Declaration: VisitDecl(Arg.getAsDecl()); break; case TemplateArgument::Integral: Arg.getAsIntegral()->Profile(ID); VisitType(Arg.getIntegralType()); break; case TemplateArgument::Expression: Visit(Arg.getAsExpr()); break; case TemplateArgument::Pack: const TemplateArgument *Pack = Arg.pack_begin(); for (unsigned i = 0, e = Arg.pack_size(); i != e; ++i) VisitTemplateArgument(Pack[i]); break; } }
string getTemplateArgumentName(const TemplateArgument & argument) { string qualifiedName; switch(argument.getKind()) { case TemplateArgument::Null: qualifiedName = "NULL"; break; case TemplateArgument::Type: qualifiedName = CppType(argument.getAsType()).getQualifiedName(); break; case TemplateArgument::Declaration: qualifiedName = dyn_cast<NamedDecl>(argument.getAsDecl())->getQualifiedNameAsString(); break; case TemplateArgument::Integral: case TemplateArgument::Expression: qualifiedName = exprToText(argument.getAsExpr()); break; case TemplateArgument::Template: qualifiedName = argument.getAsTemplate().getAsTemplateDecl()->getQualifiedNameAsString(); break; case TemplateArgument::TemplateExpansion: break; case TemplateArgument::Pack: break; } return qualifiedName; }
// Adapted from tools\clang\lib\AST\TemplateBase.cpp TemplateArgument::print void printTemplateArgument(raw_ostream &out, const PrintingPolicy &policy, TemplateArgument const &arg, bool qualifyNames) { switch (arg.getKind()) { case TemplateArgument::Null: out << "(no value)"; break; case TemplateArgument::Type: { PrintingPolicy SubPolicy(policy); SubPolicy.SuppressStrongLifetime = true; arg.getAsType().print(out, SubPolicy); break; } case TemplateArgument::Declaration: { NamedDecl *ND = cast<NamedDecl>(arg.getAsDecl()); out << '&'; if (ND->getDeclName()) { // FIXME: distinguish between pointer and reference args? ND->printQualifiedName(out); } else { out << "(anonymous)"; } break; } case TemplateArgument::NullPtr: out << "nullptr"; break; case TemplateArgument::Template: // Orig: arg.getAsTemplate().print(out, policy); { auto templateName = arg.getAsTemplate(); printTemplateName(out, policy, templateName, qualifyNames); break; } case TemplateArgument::TemplateExpansion: arg.getAsTemplateOrTemplatePattern().print(out, policy); out << "..."; break; case TemplateArgument::Integral: { printIntegral(arg, out, policy); break; } case TemplateArgument::Expression: arg.getAsExpr()->printPretty(out, nullptr, policy); break; case TemplateArgument::Pack: out << "<"; bool First = true; for (const auto &P : arg.pack_elements()) { if (First) First = false; else out << ", "; P.print(policy, out); } out << ">"; break; } }