Spicy
hook.h
1 // Copyright (c) 2020-2021 by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <utility>
6 #include <vector>
7 
8 #include <hilti/ast/attribute.h>
9 #include <hilti/ast/declarations/type.h>
10 #include <hilti/ast/expressions/keyword.h>
11 #include <hilti/ast/function.h>
12 
13 #include <spicy/ast/aliases.h>
14 #include <spicy/ast/engine.h>
15 
16 namespace spicy {
17 
18 namespace type {
19 
20 class Unit;
21 
22 namespace unit::item {
23 class Field;
24 }
25 
26 } // namespace type
27 
29 class Hook : public hilti::NodeBase {
30 public:
31  Hook(const std::vector<type::function::Parameter>& params, std::optional<Statement> body, Engine engine,
32  std::optional<AttributeSet> attrs = {}, const Meta& m = Meta())
33  : NodeBase(nodes(Function(ID(),
34  type::Function(type::function::Result(type::void_, m), params,
35  type::function::Flavor::Hook, m),
36  std::move(body), hilti::function::CallingConvention::Standard, std::move(attrs), m),
38  m),
39  _engine(engine) {}
40 
41  Hook() = default;
42 
43  const auto& function() const { return child<Function>(0); }
44 
45  auto body() const { return function().body(); }
46  const auto& ftype() const { return function().ftype(); }
47  const auto& id() const { return function().id(); }
48  const auto& type() const { return function().type(); }
49 
50  Engine engine() const { return _engine; }
51  NodeRef ddRef() const;
54  std::optional<Expression> priority() const;
55 
56  bool isForEach() const { return AttributeSet::find(function().attributes(), "foreach").has_value(); }
57  bool isDebug() const { return AttributeSet::find(function().attributes(), "%debug").has_value(); }
58 
59  void setID(const ID& id) { children()[0].as<Function>().setID(id); }
60  void setUnitTypeRef(NodeRef p) { _unit_type = std::move(p); }
61  void setFieldRef(NodeRef p) { _unit_field = std::move(p); }
62  void setDDType(Type t) { children()[1] = hilti::expression::Keyword::createDollarDollarDeclaration(std::move(t)); }
63  void setParameters(const std::vector<type::function::Parameter>& params) {
64  children()[0].as<Function>().setFunctionType(
65  type::Function(type::function::Result(type::void_, meta()), params, type::function::Flavor::Hook, meta()));
66  }
67 
68  void setResultType(const Type& t) { children()[0].as<Function>().setResultType(t); }
69 
70  bool operator==(const Hook& other) const { return function() == other.function() && _engine == other._engine; }
71 
72  auto properties() const {
73  return node::Properties{{"engine", to_string(_engine)},
74  {"unit_type", _unit_type.renderedRid()},
75  {"unit_field", _unit_field.renderedRid()}};
76  }
77 
78 private:
79  Engine _engine = {};
80  NodeRef _unit_type;
81  NodeRef _unit_field;
82 };
83 
85 inline Node to_node(Hook f) { return Node(std::move(f)); }
86 
87 } // namespace spicy
Definition: function.h:71
const Node none
Definition: node.cc:14
Definition: function.h:44
Definition: hook.h:29
static Declaration createDollarDollarDeclaration(Type t)
Definition: keyword.h:69
Definition: meta.h:19
Definition: type.h:160
Definition: optional-ref.h:22
hilti::optional_ref< const Attribute > find(std::string_view tag) const
Definition: attribute.h:200
Definition: node.h:112
Definition: node-ref.h:45
Definition: id.h:18
Definition: node.h:360