Spicy
builtin-function.h
1 // Copyright (c) 2020-2021 by the Zeek Project. See LICENSE for details.
2 
3 #include <string>
4 #include <utility>
5 #include <vector>
6 
7 #include <hilti/ast/declarations/parameter.h>
8 #include <hilti/ast/expression.h>
9 #include <hilti/ast/node.h>
10 #include <hilti/ast/type.h>
11 
12 namespace hilti {
13 namespace expression {
14 
17 public:
27  BuiltinFunction(std::string name, std::string cxxname, hilti::Type type,
28  std::vector<declaration::Parameter> parameters, std::vector<Expression> arguments, Meta m = Meta())
29  : NodeBase(nodes(std::move(type), parameters, std::move(arguments)), std::move(m)),
30  _name(std::move(name)),
31  _cxxname(std::move(cxxname)),
32  _num_parameters(parameters.size()) {}
33 
35  auto type() const { return child<hilti::Type>(0); };
36 
38  bool isConstant() const { return false; }
39 
41  auto isEqual(const Expression& other) const { return node::isEqual(this, other); }
42 
44  auto isLhs() const { return false; }
45 
47  auto isTemporary() const { return true; }
48 
50  auto properties() const { return node::Properties{{"name", _name}}; }
51 
52  const auto& name() const { return _name; }
53 
54  const auto& cxxname() const { return _cxxname; }
55 
56  auto arguments() const { return childs<Expression>(_num_parameters + 1, -1); }
57 
58  const auto parameters() const { return childs<declaration::Parameter>(1, _num_parameters); }
59 
67  static BuiltinFunction setArguments(const BuiltinFunction& d, std::vector<hilti::Expression> args) {
68  auto x = Expression(d)._clone().as<BuiltinFunction>();
69 
70  x.childs().clear();
71 
72  for ( auto& a : args )
73  x.childs().emplace_back(std::move(a));
74 
75  return x;
76  }
77 
78  friend bool operator==(const BuiltinFunction& lhs, const BuiltinFunction& rhs) {
79  return lhs._cxxname == rhs._cxxname && lhs.type() == rhs.type() && lhs.parameters() == rhs.parameters() &&
80  lhs.arguments() == rhs.arguments();
81  }
82 
83 private:
84  std::string _name;
85  std::string _cxxname;
86  size_t _num_parameters = 0;
87 };
88 
89 } // namespace expression
90 } // namespace hilti
Definition: builtin-function.h:16
std::vector< T > childs(int begin, int end) const
Definition: node.h:373
static BuiltinFunction setArguments(const BuiltinFunction &d, std::vector< hilti::Expression > args)
Definition: builtin-function.h:67
Definition: optional.h:79
auto properties() const
Definition: builtin-function.h:50
Definition: expression.h:16
Definition: meta.h:18
auto type() const
Definition: builtin-function.h:35
std::map< std::string, node::detail::PropertyValue > Properties
Definition: node.h:83
BuiltinFunction(std::string name, std::string cxxname, hilti::Type type, std::vector< declaration::Parameter > parameters, std::vector< Expression > arguments, Meta m=Meta())
Definition: builtin-function.h:27
auto isEqual(const Expression &other) const
Definition: builtin-function.h:41
auto isLhs() const
Definition: builtin-function.h:44
auto isTemporary() const
Definition: builtin-function.h:47
bool isConstant() const
Definition: builtin-function.h:38
Definition: node.h:318