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}};
75 attrs = AttributeSet::create(ctx);
77 return ctx->
make<Parameter>(ctx,
78 {_qtype(ctx, type, kind), default_, attrs},
85 static auto create(ASTContext* ctx,
87 UnqualifiedType* type,
94 attrs = AttributeSet::create(ctx);
96 return ctx->make<Parameter>(ctx,
97 {_qtype(ctx, type, kind), default_, attrs},
105 Parameter(ASTContext* ctx, Nodes
children, ID
id, parameter::Kind kind,
bool is_type_param, Meta
meta)
106 : Declaration(ctx, NodeTags, std::move(
children), std::move(
id), Linkage::Private, std::move(
meta)),
108 _is_type_param(is_type_param) {}
110 std::string
_dump()
const override {
return isResolved() ?
"(resolved)" :
"(not resolved)"; }
125 parameter::Kind _kind = parameter::Kind::Unknown;
126 bool _is_type_param =
false;
129 using Parameters = NodeVector<Parameter>;
133 namespace hilti::declaration {
136 inline bool areEquivalent(Parameter* p1, Parameter* p2) {
137 if ( p1->kind() != p2->kind() )
140 if ( (p1->default_() && ! p2->default_()) || (p2->default_() && ! p1->default_()) )
143 if ( p1->default_() && p2->default_() && p1->default_()->print() != p2->default_()->print() )
146 auto auto1 = p1->type()->type()->isA<type::Auto>();
147 auto auto2 = p2->type()->type()->isA<type::Auto>();
149 if ( auto1 || auto2 )
152 return type::same(p1->type(), p2->type());
156 inline bool areEquivalent(
const node::Set<Parameter>& params1,
const node::Set<Parameter>& params2) {
157 return std::ranges::equal(params1, params2, [](
const auto& p1,
const auto& p2) {
return areEquivalent(p1, p2); });
Definition: ast-context.h:128
T * make(Args &&... args)
Definition: ast-context.h:382
Definition: attribute.h:200
Definition: declaration.h:53
node::Properties properties() const override
Definition: declaration.h:126
const auto & id() const
Definition: declaration.h:58
Definition: expression.h:15
void setChild(ASTContext *ctx, size_t idx, Node *n)
Definition: node.h:631
const auto & children() const
Definition: node.h:382
const auto & meta() const
Definition: node.h:324
static auto create(ASTContext *ctx, UnqualifiedType *t, Constness const_, Meta m=Meta())
Definition: type.h:436
Definition: parameter.h:47
std::string _dump() const override
Definition: parameter.h:110
node::Properties properties() const final
Definition: parameter.h:62
std::string_view displayName() const final
Definition: parameter.h:60