Spicy
function.h
1 // Copyright (c) 2020-now by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <utility>
6 
7 #include <hilti/ast/declaration.h>
8 #include <hilti/ast/declarations/type.h>
9 #include <hilti/ast/function.h>
10 #include <hilti/ast/node-range.h>
11 #include <hilti/ast/operator-registry.h>
12 #include <hilti/ast/operator.h>
13 #include <hilti/ast/types/type.h>
14 
15 namespace hilti::declaration {
16 
18 class Function : public Declaration {
19 public:
20  auto function() const { return child<::hilti::Function>(0); }
21 
23  auto operator_() const { return _operator; }
24 
37  if ( _linked_declaration_index ) {
38  auto* decl = ctx->lookup(_linked_declaration_index);
39  return decl->as<declaration::Type>();
40  }
41  else
42  return nullptr;
43  }
44 
51  auto linkedDeclarationIndex() const { return _linked_declaration_index; }
52 
65  if ( _linked_prototype_index ) {
66  auto* decl = ctx->lookup(_linked_prototype_index);
67  return decl->as<declaration::Function>();
68  }
69  else
70  return nullptr;
71  }
72 
77  auto linkedPrototypeIndex() const { return _linked_prototype_index; }
78 
79  void setOperator(const Operator* op) { _operator = op; }
80 
81  void setLinkedDeclarationIndex(ast::DeclarationIndex index) {
82  assert(index);
83  _linked_declaration_index = index;
84  }
85 
86  void setLinkedPrototypeIndex(ast::DeclarationIndex index) {
87  assert(index);
88  _linked_prototype_index = index;
89  }
90 
95  ID functionID(ASTContext* ctx) const;
96 
97  std::string_view displayName() const final { return "function"; }
98 
99  node::Properties properties() const final;
100 
101  static Function* create(ASTContext* ctx,
102  hilti::Function* function,
103  declaration::Linkage linkage = Linkage::Private,
104  Meta meta = {}) {
105  return ctx->make<Function>(ctx, {function}, function->id(), linkage, std::move(meta));
106  }
107 
108 protected:
109  Function(ASTContext* ctx, Nodes children, ID id, declaration::Linkage linkage, Meta meta)
110  : Declaration(ctx, NodeTags, std::move(children), std::move(id), linkage, std::move(meta)) {}
111 
112  HILTI_NODE_1(declaration::Function, Declaration, final);
113 
114 private:
115  const Operator* _operator = nullptr;
116 
117  ast::DeclarationIndex _linked_declaration_index;
118  ast::DeclarationIndex _linked_prototype_index;
119 };
120 
121 } // namespace hilti::declaration
Definition: ast-context.h:128
Declaration * lookup(ast::DeclarationIndex index)
Definition: ast-context.cc:497
Definition: declaration.h:53
const auto & id() const
Definition: declaration.h:58
auto linkage() const
Definition: declaration.h:61
Definition: function.h:19
Definition: meta.h:30
T * as() const
Definition: node.h:733
const auto & children() const
Definition: node.h:382
const auto & meta() const
Definition: node.h:324
Definition: operator.h:268
Definition: ast-context.h:58
Definition: function.h:18
auto linkedDeclarationIndex() const
Definition: function.h:51
auto linkedPrototypeIndex() const
Definition: function.h:77
std::string_view displayName() const final
Definition: function.h:97
auto operator_() const
Definition: function.h:23
ID functionID(ASTContext *ctx) const
Definition: function.cc:20
declaration::Type * linkedDeclaration(ASTContext *ctx) const
Definition: function.h:36
declaration::Function * linkedPrototype(ASTContext *ctx) const
Definition: function.h:64
node::Properties properties() const final
Definition: function.cc:12
Definition: type.h:14