10 #include <hilti/ast/attribute.h>
11 #include <hilti/ast/declaration.h>
12 #include <hilti/ast/expression.h>
13 #include <hilti/ast/type.h>
14 #include <hilti/ast/types/auto.h>
15 #include <hilti/ast/types/unknown.h>
17 namespace hilti::parameter {
28 constexpr util::enum_::Value<Kind> Kinds[] = {
29 {.value = Kind::Unknown, .name =
"unknown"},
30 {.value = Kind::Copy, .name =
"copy"},
31 {.value = Kind::In, .name =
"in"},
32 {.value = Kind::InOut, .name =
"inout"},
36 constexpr
auto to_string(Kind k) {
return util::enum_::to_string(k, detail::Kinds); }
39 constexpr
auto from_string(std::string_view s) {
return util::enum_::from_string<Kind>(s, detail::Kinds); }
44 namespace hilti::declaration {
49 auto attributes()
const {
return child<AttributeSet>(2); }
50 auto default_()
const {
return child<hilti::Expression>(1); }
51 auto kind()
const {
return _kind; }
52 auto type()
const {
return child<hilti::QualifiedType>(0); }
53 auto isTypeParameter()
const {
return _is_type_param; }
57 void setIsTypeParameter() { _is_type_param =
true; }
60 std::string_view
displayName() const final {
return "parameter"; }
63 auto p = node::Properties{{
"kind", to_string(_kind)}, {
"is_type_param", _is_type_param}};
70 attrs = AttributeSet::create(ctx);
72 return ctx->
make<Parameter>(ctx, {_qtype(ctx, type, kind), default_, attrs}, std::move(
id), kind,
false,
76 static auto create(ASTContext* ctx, ID
id, UnqualifiedType* type, parameter::Kind kind,
hilti::Expression* default_,
77 bool is_type_param, AttributeSet* attrs, Meta
meta = {}) {
79 attrs = AttributeSet::create(ctx);
81 return ctx->make<Parameter>(ctx, {_qtype(ctx, type, kind), default_, attrs}, std::move(
id), kind, is_type_param,
86 Parameter(ASTContext* ctx, Nodes
children, ID
id, parameter::Kind kind,
bool is_type_param, Meta
meta)
87 : Declaration(ctx, NodeTags, std::move(
children), std::move(
id), Linkage::Private, std::move(
meta)),
89 _is_type_param(is_type_param) {}
91 std::string
_dump()
const override {
return isResolved() ?
"(resolved)" :
"(not resolved)"; }
106 parameter::Kind _kind = parameter::Kind::Unknown;
107 bool _is_type_param =
false;
110 using Parameters = NodeVector<Parameter>;
114 namespace hilti::declaration {
117 inline bool areEquivalent(Parameter* p1, Parameter* p2) {
118 if ( p1->kind() != p2->kind() )
121 if ( (p1->default_() && ! p2->default_()) || (p2->default_() && ! p1->default_()) )
124 if ( p1->default_() && p2->default_() && p1->default_()->print() != p2->default_()->print() )
127 auto auto1 = p1->type()->type()->isA<type::Auto>();
128 auto auto2 = p2->type()->type()->isA<type::Auto>();
130 if ( auto1 || auto2 )
133 return type::same(p1->type(), p2->type());
137 inline bool areEquivalent(
const node::Set<Parameter>& params1,
const node::Set<Parameter>& params2) {
138 return std::ranges::equal(params1, params2, [](
const auto& p1,
const auto& p2) {
return areEquivalent(p1, p2); });
Definition: ast-context.h:121
T * make(Args &&... args)
Definition: ast-context.h:366
Definition: attribute.h:200
Definition: declaration.h:48
node::Properties properties() const override
Definition: declaration.h:116
const auto & id() const
Definition: declaration.h:53
Definition: expression.h:15
void setChild(ASTContext *ctx, size_t idx, Node *n)
Definition: node.h:602
const auto & children() const
Definition: node.h:364
const auto & meta() const
Definition: node.h:306
static auto create(ASTContext *ctx, UnqualifiedType *t, Constness const_, Meta m=Meta())
Definition: type.h:427
Definition: parameter.h:47
std::string _dump() const override
Definition: parameter.h:91
node::Properties properties() const final
Definition: parameter.h:62
std::string_view displayName() const final
Definition: parameter.h:60