Instantiator
Generate c++ template instantiations
Loading...
Searching...
No Matches
Parsing.cpp
Go to the documentation of this file.
1#include "Parsing.hpp"
2
3#include "spdlog/spdlog.h"
4
5#include "clang/AST/DeclTemplate.h"
6#include "clang/AST/TemplateName.h"
7
8namespace internal {
9std::vector<std::string> parseTemplateArgs(const clang::TemplateArgumentList* TAL, clang::PrintingPolicy pp)
10{
11 std::vector<std::string> out;
12 if(TAL) {
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]);
20 break;
21 }
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]);
27 break;
28 }
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);
35 break;
36 }
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();
41 break;
42 }
43 default: {
44 break;
45 }
46 }
47 }
48 break;
49 }
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);
54#else
55 TAL->get(i).getAsTemplate().print(OS, pp, false);
56#endif
57 OS.str();
58 break;
59 }
60 default: {
61 break;
62 }
63 }
64 }
65 }
66 return out;
67}
68
69std::vector<Param> parseFunctionArgs(std::vector<clang::ParmVarDecl*> Args, clang::PrintingPolicy pp)
70{
71 std::vector<Param> out;
72 out.resize(Args.size());
73 for(auto it = Args.begin(); it != Args.end(); it++) { out[std::distance(Args.begin(), it)] = Param::createFromParmVarDecl(*it, pp); }
74 return out;
75}
76} // namespace internal
Helper functions for parsing information from AST nodes.
std::vector< std::string > parseTemplateArgs(const clang::TemplateArgumentList *TAL, clang::PrintingPolicy pp)
Definition Parsing.cpp:9
std::vector< Param > parseFunctionArgs(std::vector< clang::ParmVarDecl * > Args, clang::PrintingPolicy pp)
Definition Parsing.cpp:69
static Param createFromParmVarDecl(const clang::ParmVarDecl *parm, clang::PrintingPolicy pp)
Definition Param.cpp:9