Instantiator
Generate c++ template instantiations
Loading...
Searching...
No Matches
Param.cpp
Go to the documentation of this file.
1#include "Param.hpp"
2
3#include <regex>
4
5#include "spdlog/spdlog.h"
6
7#include "clang/AST/TemplateName.h"
8
9Param Param::createFromParmVarDecl(const clang::ParmVarDecl* parm, const clang::PrintingPolicy pp)
10{
11 Param out;
12 out.name = parm->getOriginalType().getAsString(pp); //.getCanonicalType()
13
14 out.is_lvalue_reference = parm->getOriginalType().getTypePtr()->isLValueReferenceType();
15 out.is_rvalue_reference = parm->getOriginalType().getTypePtr()->isRValueReferenceType();
17
18 spdlog::debug("Loaded parameter with name={}", out.name);
19 if(out.is_reference) {
20 out.is_const = parm->getOriginalType().getNonReferenceType().isConstQualified();
21 out.is_volatile = parm->getOriginalType().getNonReferenceType().isVolatileQualified();
22 out.is_restrict = parm->getOriginalType().getNonReferenceType().isRestrictQualified();
23 out.is_dependent = parm->getOriginalType().getNonReferenceType().getTypePtr()->isDependentType();
24 if(const clang::TemplateSpecializationType* TST =
25 parm->getOriginalType().getCanonicalType().getNonReferenceType().getTypePtr()->getAs<const clang::TemplateSpecializationType>()) {
26 llvm::raw_string_ostream OS(out.template_name);
27 TST->getTemplateName().print(OS, pp); // clang::TemplateName::Qualified::AsWritten
28 OS.str();
29 }
30 out.is_template_param = parm->getOriginalType().getNonReferenceType().getTypePtr()->isTemplateTypeParmType();
31 } else {
32 out.is_const = parm->getOriginalType().isConstQualified();
33 out.is_volatile = parm->getOriginalType().isVolatileQualified();
34 out.is_restrict = parm->getOriginalType().isRestrictQualified();
35 out.is_dependent = parm->getOriginalType().getTypePtr()->isDependentType();
36 if(const clang::TemplateSpecializationType* TST =
37 parm->getOriginalType().getCanonicalType().getTypePtr()->getAs<const clang::TemplateSpecializationType>()) {
38 llvm::raw_string_ostream OS(out.template_name);
39 TST->getTemplateName().print(OS, pp); // clang::TemplateName::Qualified::AsWritten
40 OS.str();
41 }
42 out.is_template_param = parm->getOriginalType().getTypePtr()->isTemplateTypeParmType();
43 }
45 return out;
46}
47
48bool Param::compare_cvr(const Param& other) const
49{
50 return is_const == other.is_const and is_volatile == other.is_volatile and is_restrict == other.is_restrict;
51}
52
53bool Param::compare(const Param& other) const
54{
55 std::regex r("type-parameter-[0-9]+-[0-9]+");
56 auto name_corrected = std::regex_replace(name, r, "type-parameter-X-Y");
57 auto other_name_corrected = std::regex_replace(other.name, r, "type-parameter-X-Y");
58 return name_corrected == other_name_corrected;
59}
Struct for the collection of all relevant data for a function parameter.
Definition Param.hpp:16
bool is_dependent
Definition Param.hpp:26
bool is_restrict
Definition Param.hpp:25
bool is_template_param
Definition Param.hpp:28
bool is_reference
Definition Param.hpp:22
bool compare(const Param &other) const
Definition Param.cpp:53
bool is_const
Definition Param.hpp:23
bool is_lvalue_reference
Definition Param.hpp:19
std::string name
Definition Param.hpp:18
bool compare_cvr(const Param &other) const
Definition Param.cpp:48
bool is_volatile
Definition Param.hpp:24
std::string template_name
Definition Param.hpp:27
static Param createFromParmVarDecl(const clang::ParmVarDecl *parm, clang::PrintingPolicy pp)
Definition Param.cpp:9
bool is_rvalue_reference
Definition Param.hpp:20
bool is_forwarding_reference
Definition Param.hpp:21