Spicy
unresolved-operator.h
1 // Copyright (c) 2020-2021 by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <algorithm>
6 #include <utility>
7 #include <vector>
8 
9 #include <hilti/ast/expression.h>
10 #include <hilti/ast/operator.h>
11 #include <hilti/ast/types/auto.h>
12 
13 namespace hilti::expression {
14 
17 public:
18  UnresolvedOperator(operator_::Kind op, std::vector<Expression> operands, Meta meta = Meta())
19  : NodeBase(nodes(type::auto_, std::move(operands)), std::move(meta)), _kind(op) {}
20 
21  UnresolvedOperator(operator_::Kind op, hilti::node::Range<Expression> operands, Meta meta = Meta())
22  : NodeBase(nodes(type::auto_, operands), std::move(meta)), _kind(op) {}
23 
24  auto kind() const { return _kind; }
25 
26  bool areOperandsResolved() const {
27  const auto& xs = children<Expression>(1, -1);
28  return std::all_of(xs.begin(), xs.end(), [](const auto& x) { return type::isResolved(x.type()); });
29  }
30 
31  bool operator==(const UnresolvedOperator& other) const {
32  return kind() == other.kind() && operands() == other.operands();
33  }
34 
36  hilti::node::Range<Expression> operands() const { return children<Expression>(1, -1); }
37 
38  // Dummy implementations as the node will be rejected in validation anyway.
39 
41  bool isLhs() const { return false; }
43  bool isTemporary() const { return false; }
45  const auto& type() const { return child<Type>(0); }
47  auto isConstant() const { return false; }
49  auto isEqual(const Expression& other) const { return node::isEqual(this, other); }
50 
52  auto properties() const { return node::Properties{{"kind", to_string(_kind)}}; }
53 
54 private:
55  operator_::Kind _kind;
56 };
57 
58 } // namespace hilti::expression
Definition: node.h:37
auto isConstant() const
Definition: unresolved-operator.h:47
hilti::node::Range< Expression > operands() const
Definition: unresolved-operator.h:36
Definition: unresolved-operator.h:16
Definition: expression.h:18
Definition: meta.h:19
const auto & type() const
Definition: unresolved-operator.h:45
bool isTemporary() const
Definition: unresolved-operator.h:43
auto isEqual(const Expression &other) const
Definition: unresolved-operator.h:49
std::map< std::string, node::detail::PropertyValue > Properties
Definition: node.h:97
bool isLhs() const
Definition: unresolved-operator.h:41
auto properties() const
Definition: unresolved-operator.h:52
auto & meta() const
Definition: node.h:475
Definition: node.h:359
Definition: expression.h:21