7 #include <hilti/ast/expressions/keyword.h>
8 #include <hilti/ast/function.h>
9 #include <hilti/ast/node.h>
10 #include <hilti/ast/types/function.h>
11 #include <hilti/ast/types/void.h>
13 #include <spicy/ast/attribute.h>
14 #include <spicy/ast/forward.h>
15 #include <spicy/ast/node.h>
23 namespace unit::item {
29 namespace declaration {
50 {.value = Type::Standard, .name =
"standard"},
51 {.value = Type::ForEach, .name =
"foreach"},
52 {.value = Type::Error, .name =
"error"},
57 constexpr
auto to_string(Type cc) {
return hilti::util::enum_::to_string(cc, detail::Types); }
65 auto function()
const {
return child<Function>(0); }
66 auto attributes()
const {
return function()->attributes(); }
67 auto dd()
const {
return child<Declaration>(1); }
69 auto body()
const {
return function()->body(); }
70 auto ftype()
const {
return function()->ftype(); }
71 auto type()
const {
return function()->type(); }
73 auto unitTypeIndex() {
return _unit_type_index; }
74 auto unitFieldIndex() {
return _unit_field_index; }
77 if (
auto* attr = attributes()->find(attribute::kind::Priority) )
78 return *attr->valueAsExpression();
83 hook::Type hookType()
const {
84 if ( attributes()->find(attribute::kind::Foreach) )
85 return hook::Type::ForEach;
86 else if ( attributes()->find(attribute::kind::Error) )
87 return hook::Type::Error;
89 return hook::Type::Standard;
92 auto isDebug()
const {
return attributes()->find(attribute::kind::Debug); }
96 _unit_type_index = index;
101 _unit_field_index = index;
108 void setParameters(
ASTContext* ctx,
const hilti::declaration::Parameters& params) {
109 ftype()->setParameters(ctx, params);
113 std::string_view
displayName()
const override {
return "Spicy hook"; }
116 static auto create(
ASTContext* ctx, const hilti::declaration::Parameters& parameters,
Statement* body,
119 attrs = AttributeSet::create(ctx);
121 auto* ftype = hilti::type::Function::create(ctx,
123 hilti::Constness::Const),
124 parameters, hilti::type::function::Flavor::Hook,
125 hilti::type::function::CallingConvention::Standard, m);
126 auto* func = hilti::Function::create(ctx,
hilti::ID(), ftype, body, attrs, m);
127 return ctx->make<
Hook>(ctx, {func,
nullptr}, m);
131 Hook(ASTContext* ctx, Nodes
children, Meta m = Meta())
132 : Declaration(ctx, NodeTags, std::move(
children), hilti::ID(), hilti::declaration::Linkage::Private,
135 SPICY_NODE_1(declaration::Hook, Declaration,
final);
142 using Hooks = NodeVector<Hook>;
Definition: ast-context.h:121
Definition: attribute.h:200
Definition: declaration.h:48
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
static auto create(ASTContext *ctx, UnqualifiedType *t, Constness const_, Meta m=Meta())
Definition: type.h:427
Definition: statement.h:15
Definition: ast-context.h:54
static auto createDollarDollarDeclaration(ASTContext *ctx, QualifiedType *type)
Definition: keyword.h:61
node::Properties properties() const final
Definition: hook.cc:11
std::string_view displayName() const override
Definition: hook.h:113