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 {
15 namespace declaration {
16 
18 class Function : public DeclarationBase {
19 public:
20  Function(::hilti::Function function, Linkage linkage = Linkage::Private, Meta m = Meta())
21  : DeclarationBase(nodes(std::move(function)), std::move(m)), _linkage(linkage) {}
22 
23  const ::hilti::Function& function() const { return child<::hilti::Function>(0); }
24 
30  if ( _parent )
31  return _parent->as<Declaration>();
32  else
33  return {};
34  }
35 
41  if ( ! _parent )
42  return {};
43 
44  return _parent->as<declaration::Type>().type().tryAs<type::Struct>();
45  }
46 
47  void setFunction(::hilti::Function f) { childs()[0] = std::move(f); }
48  void setLinkage(Linkage x) { _linkage = x; }
49  void setParentRef(NodeRef p) {
50  assert(p && p->isA<Declaration>());
51  _parent = std::move(p);
52  }
53 
54  bool operator==(const Function& other) const { return id() == other.id() && function() == other.function(); }
55 
57  bool isConstant() const { return true; }
59  const ID& id() const { return function().id(); }
61  Linkage linkage() const { return _linkage; }
63  std::string displayName() const { return "function"; };
65  auto isEqual(const Declaration& other) const { return node::isEqual(this, other); }
66 
68  auto properties() const {
69  return node::Properties{{"linkage", to_string(_linkage)}, {"parent_type", _parent.renderedRid()}};
70  }
71 
72 private:
73  Linkage _linkage;
74  NodeRef _parent;
75 };
76 
77 } // namespace declaration
78 } // namespace hilti
std::string renderedRid() const
Definition: node-ref.h:68
Definition: type.h:16
Definition: declaration.h:53
Definition: function.h:18
Definition: struct.h:33
Definition: function.h:44
Definition: meta.h:18
bool isConstant() const
Definition: function.h:57
auto properties() const
Definition: function.h:68
Definition: declaration.h:87
Definition: optional-ref.h:22
const ID & id() const
Definition: function.h:59
auto isEqual(const Declaration &other) const
Definition: function.h:65
std::map< std::string, node::detail::PropertyValue > Properties
Definition: node.h:99
std::string displayName() const
Definition: function.h:63
Definition: node-ref.h:44
hilti::optional_ref< const Declaration > parent() const
Definition: function.h:29
const auto & childs() const
Definition: node.h:470
Linkage linkage() const
Definition: function.h:61
hilti::optional_ref< const type::Struct > parentStructType() const
Definition: function.h:40
Definition: id.h:18