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 #include <vector>
8 
9 #include <hilti/ast/expressions/id.h>
10 #include <hilti/ast/operators/common.h>
11 #include <hilti/ast/types/bool.h>
12 #include <hilti/ast/types/string.h>
13 
14 namespace hilti {
15 namespace operator_ {
16 
17 OPERATOR_DECLARE_ONLY(function, Call)
18 
19 namespace function {
20 
22 public:
23  using hilti::expression::ResolvedOperatorBase::ResolvedOperatorBase;
24 
26  Operator(const Scope::Referee& r, const type::Function& ftype) {
27  auto op0 = operator_::Operand{.type = type::Any()}; // IDs won't be resolved
28  auto op1 = operator_::Operand{.type = type::OperandList::fromParameters(ftype.parameters())};
29  _referee = r;
30  _operands = {op0, op1};
31  _result = ftype.result().type();
32  }
33 
34  static operator_::Kind kind() { return operator_::Kind::Call; }
35  std::vector<operator_::Operand> operands() const { return _operands; }
36  Type result(const hilti::node::Range<Expression>& /* ops */) const { return _result; }
37  bool isLhs() const { return false; }
38  auto priority() const { return hilti::operator_::Priority::Normal; }
39  void validate(const expression::ResolvedOperator& /* i */, operator_::position_t /* p */) const {}
40  std::string doc() const { return "<dynamic - no doc>"; }
41  std::string docNamespace() const { return "<dynamic - no ns>"; }
42 
43  Expression instantiate(const std::vector<Expression>& operands, const Meta& meta) const {
44  auto ops = std::vector<Expression>{expression::ResolvedID(ID(_referee.qualified), NodeRef(_referee.node),
45  _referee.node->meta()),
46  operands[1]};
47 
48  auto ro = expression::ResolvedOperator(Call(*this, ops, meta));
49  ro.setMeta(meta);
50  return std::move(ro);
51  }
52 
53  private:
54  Scope::Referee _referee;
55  std::vector<operator_::Operand> _operands;
56  Type _result;
57  };
58 };
59 
60 } // namespace function
61 
62 } // namespace operator_
63 } // namespace hilti
Definition: function.h:71
Definition: function.h:21
Definition: operator.h:194
Definition: node.h:39
OperandType type
Definition: operator.h:196
Definition: visitor-types.h:28
NodeRef node
Definition: scope.h:39
Definition: operator.h:38
Definition: meta.h:18
Definition: type.h:159
std::string qualified
Definition: scope.h:40
Definition: any.h:13
Definition: resolved-operator.h:40
Definition: scope.h:38
void setMeta(Meta m)
Definition: node.h:476
Definition: node-ref.h:44
auto & meta() const
Definition: node.h:474
Definition: id.h:18