Spicy
function.h
1 // Copyright (c) 2020-now by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <string>
6 #include <utility>
7 
8 #include <hilti/ast/attribute.h>
9 #include <hilti/ast/forward.h>
10 #include <hilti/ast/node.h>
11 #include <hilti/ast/statement.h>
12 #include <hilti/ast/statements/block.h>
13 #include <hilti/ast/type.h>
14 #include <hilti/ast/types/function.h>
15 
16 namespace hilti {
17 
19 class Function : public Node {
20 public:
21  const auto& id() const { return _id; }
22  auto type() const { return child<QualifiedType>(0); }
23  auto ftype() const { return child<QualifiedType>(0)->type()->as<type::Function>(); }
24  auto body() const { return child<statement::Block>(1); }
25  auto attributes() const { return child<AttributeSet>(2); }
26  auto isStatic() const { return attributes()->find(hilti::attribute::kind::Static) != nullptr; }
27 
28  void setBody(ASTContext* ctx, statement::Block* b) { setChild(ctx, 1, b); }
29  void setID(ID id) { _id = std::move(id); }
30  void setResultType(ASTContext* ctx, QualifiedType* t) { ftype()->setResultType(ctx, t); }
31 
32  node::Properties properties() const override {
33  auto p = node::Properties{{"id", _id}};
34  return Node::properties() + std::move(p);
35  }
36 
37  static auto create(ASTContext* ctx,
38  const ID& id,
39  type::Function* ftype,
40  statement::Block* body,
41  AttributeSet* attrs = nullptr,
42  const Meta& meta = {}) {
43  if ( ! attrs )
44  attrs = AttributeSet::create(ctx);
45 
46  return ctx->make<Function>(ctx,
47  {QualifiedType::create(ctx, ftype, Constness::Const, meta), body, attrs},
48  id,
49  meta);
50  }
51 
52 protected:
53  Function(ASTContext* ctx, Nodes children, ID id, Meta meta = {})
54  : Node(ctx, NodeTags, std::move(children), std::move(meta)), _id(std::move(id)) {}
55 
56  std::string _dump() const override;
57 
58  HILTI_NODE_0(Function, final);
59 
60 private:
61  ID _id;
62 };
63 
64 } // namespace hilti
Definition: ast-context.h:128
T * make(Args &&... args)
Definition: ast-context.h:382
Definition: attribute.h:200
Definition: function.h:19
node::Properties properties() const override
Definition: function.h:32
std::string _dump() const override
Definition: function.cc:8
Definition: id.h:15
Definition: meta.h:30
Definition: node.h:243
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
Node(ASTContext *ctx, node::Tags node_tags, Nodes children, Meta meta)
Definition: node.h:984
virtual node::Properties properties() const
Definition: node.h:953
Definition: type.h:365
static auto create(ASTContext *ctx, UnqualifiedType *t, Constness const_, Meta m=Meta())
Definition: type.h:436
Definition: block.h:12
Definition: function.h:72