8 #include <hilti/ast/declaration.h> 9 #include <hilti/ast/expression.h> 10 #include <hilti/ast/id.h> 11 #include <hilti/ast/type.h> 12 #include <hilti/ast/types/auto.h> 15 namespace declaration {
28 constexpr util::enum_::Value<Kind> kinds[] = {
29 {Kind::Unknown,
"unknown"},
32 {Kind::InOut,
"inout"},
36 constexpr
auto to_string(Kind k) {
return util::enum_::to_string(k, detail::kinds); }
39 constexpr
auto from_string(
const std::string_view& s) {
return util::enum_::from_string<Kind>(s, detail::kinds); }
47 Parameter(
ID id, hilti::Type type, parameter::Kind kind, std::optional<hilti::Expression> default_,
Meta m =
Meta())
48 :
NodeBase(nodes(std::move(
id), std::move(type), std::move(default_)), std::move(m)), _kind(kind) {}
50 Parameter(
ID id, hilti::Type type, parameter::Kind kind, std::optional<hilti::Expression> default_,
51 bool is_struct_param,
Meta m =
Meta())
52 :
NodeBase(nodes(std::move(
id), std::move(type), std::move(default_)), std::move(m)),
54 _is_struct_param(is_struct_param) {}
58 auto type()
const {
return type::effectiveType(child<hilti::Type>(1)); }
60 auto default_()
const {
return childs()[2].tryReferenceAs<hilti::Expression>(); }
61 auto kind()
const {
return _kind; }
62 auto isStructParameter()
const {
return _is_struct_param; }
64 bool operator==(
const Parameter& other)
const {
65 return id() == other.
id() && type() == other.type() && kind() == other.kind() && default_() == other.default_();
69 bool isConstant()
const {
return _kind == parameter::Kind::In; }
71 const ID&
id()
const {
return child<ID>(0); }
73 Linkage
linkage()
const {
return Linkage::Private; }
77 auto isEqual(
const Declaration& other)
const {
return node::isEqual(
this, other); }
81 return node::Properties{{
"kind", to_string(_kind)}, {
"is_struct_param", _is_struct_param}};
92 auto x = Declaration(d)._clone().as<
Parameter>();
109 auto x = Declaration(d)._clone().as<
Parameter>();
120 auto x = Declaration(d)._clone().as<
Parameter>();
121 x._is_struct_param =
true;
126 parameter::Kind _kind = parameter::Kind::Unknown;
127 bool _is_struct_param =
false;
132 if ( p1.kind() != p2.kind() || p1.default_() != p2.default_() )
138 if ( auto1 || auto2 )
141 return p1.type() == p2.type();
static Declaration setDefault(const Parameter &d, const hilti::Expression &e)
Definition: parameter.h:108
std::vector< T > childs(int begin, int end) const
Definition: node.h:373
static Declaration setIsStructParameter(const Parameter &d)
Definition: parameter.h:119
const Node none
Definition: node.cc:12
bool isConstant() const
Definition: parameter.h:69
Definition: parameter.h:45
auto isEqual(const Declaration &other) const
Definition: parameter.h:77
const ID & id() const
Definition: parameter.h:71
std::map< std::string, node::detail::PropertyValue > Properties
Definition: node.h:83
auto properties() const
Definition: parameter.h:80
static Declaration setType(const Parameter &d, std::optional< hilti::Type > t)
Definition: parameter.h:91
Definition: declaration.h:15
Linkage linkage() const
Definition: parameter.h:73
std::string displayName() const
Definition: parameter.h:75