Spicy
function.h
1 // Copyright (c) 2020-2021 by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <string>
6 #include <utility>
7 
8 #include <hilti/ast/declarations/type.h>
9 #include <hilti/ast/function.h>
10 #include <hilti/ast/id.h>
11 #include <hilti/ast/statement.h>
12 #include <hilti/ast/types/struct.h>
13 
14 namespace hilti::declaration {
15 
17 class Function : public DeclarationBase {
18 public:
19  Function(::hilti::Function function, Linkage linkage = Linkage::Private, Meta m = Meta())
20  : DeclarationBase(nodes(std::move(function)), std::move(m)), _linkage(linkage) {}
21 
22  const ::hilti::Function& function() const { return child<::hilti::Function>(0); }
23 
29  if ( _parent )
30  return _parent->as<Declaration>();
31  else
32  return {};
33  }
34 
40  if ( ! _parent )
41  return {};
42 
43  return _parent->as<declaration::Type>().type().tryAs<type::Struct>();
44  }
45 
46  void setFunction(const ::hilti::Function& f) { children()[0] = f; }
47  void setLinkage(Linkage x) { _linkage = x; }
48  void setParentRef(NodeRef p) {
49  assert(p && p->isA<Declaration>());
50  _parent = std::move(p);
51  }
52 
53  bool operator==(const Function& other) const { return id() == other.id() && function() == other.function(); }
54 
56  bool isConstant() const { return true; }
58  const ID& id() const { return function().id(); }
60  Linkage linkage() const { return _linkage; }
62  std::string displayName() const { return "function"; };
64  auto isEqual(const Declaration& other) const { return node::isEqual(this, other); }
65 
67  auto properties() const {
68  return node::Properties{{"linkage", to_string(_linkage)}, {"parent_type", _parent.renderedRid()}};
69  }
70 
71 private:
72  Linkage _linkage;
73  NodeRef _parent;
74 };
75 
76 } // namespace hilti::declaration
std::string renderedRid() const
Definition: node-ref.h:69
Definition: type.h:15
Definition: declaration.h:53
Definition: function.h:17
const auto & children() const
Definition: node.h:471
Definition: struct.h:32
Definition: function.h:44
Definition: meta.h:19
bool isConstant() const
Definition: function.h:56
auto properties() const
Definition: function.h:67
Definition: declaration.h:87
Definition: optional-ref.h:22
const ID & id() const
Definition: function.h:58
auto isEqual(const Declaration &other) const
Definition: function.h:64
std::map< std::string, node::detail::PropertyValue > Properties
Definition: node.h:97
std::string displayName() const
Definition: function.h:62
Definition: node-ref.h:45
Definition: declaration.h:18
hilti::optional_ref< const Declaration > parent() const
Definition: function.h:28
Linkage linkage() const
Definition: function.h:60
hilti::optional_ref< const type::Struct > parentStructType() const
Definition: function.h:39
Definition: id.h:18