9std::vector<std::string>
parseTemplateArgs(
const clang::TemplateArgumentList* TAL, clang::PrintingPolicy pp)
11 std::vector<std::string> out;
13 out.resize(TAL->size());
14 for(std::size_t i = 0; i < TAL->size(); i++) {
15 if(TAL->get(i).isDependent()) { spdlog::debug(
"Dependent template argument."); }
16 switch(TAL->get(i).getKind()) {
17 case clang::TemplateArgument::ArgKind::Type: {
18 out[i] = TAL->get(i).getAsType().getAsString(pp);
19 spdlog::debug(
"type: {}", out[i]);
22 case clang::TemplateArgument::ArgKind::Integral: {
23 llvm::SmallString<10> name;
24 TAL->get(i).getAsIntegral().toString(name);
25 out[i] = name.str().str();
26 spdlog::debug(
"integral: {}", out[i]);
29 case clang::TemplateArgument::ArgKind::Pack: {
30 out.resize(out.size() + TAL->get(i).pack_size() - 1);
31 for(
auto pack_it = TAL->get(i).pack_begin(); pack_it != TAL->get(i).pack_end(); pack_it++) {
32 switch(pack_it->getKind()) {
33 case clang::TemplateArgument::ArgKind::Type: {
34 out[i + std::distance(TAL->get(i).pack_begin(), pack_it)] = pack_it->getAsType().getAsString(pp);
37 case clang::TemplateArgument::ArgKind::Integral: {
38 llvm::SmallString<10> name;
39 pack_it->getAsIntegral().toString(name);
40 out[i + std::distance(TAL->get(i).pack_begin(), pack_it)] = name.str().str();
50 case clang::TemplateArgument::ArgKind::Template: {
51 llvm::raw_string_ostream OS(out[i]);
52#if INSTANTIATOR_LLVM_MAJOR > 13
53 TAL->get(i).getAsTemplate().print(OS, pp, clang::TemplateName::Qualified::Fully);
55 TAL->get(i).getAsTemplate().print(OS, pp,
false);