8 #include <hilti/ast/forward.h>
9 #include <hilti/ast/node.h>
10 #include <hilti/ast/types/operand-list.h>
11 #include <hilti/base/logger.h>
15 namespace expression {
16 class ResolvedOperator;
76 inline auto isCommutative(Kind k) {
84 case Kind::Sum:
return true;
90 case Kind::CustomAssign:
91 case Kind::DecrPostfix:
92 case Kind::DecrPrefix:
95 case Kind::Difference:
96 case Kind::DifferenceAssign:
98 case Kind::DivisionAssign:
101 case Kind::GreaterEqual:
102 case Kind::HasMember:
104 case Kind::IncrPostfix:
105 case Kind::IncrPrefix:
107 case Kind::IndexAssign:
109 case Kind::LowerEqual:
111 case Kind::MemberCall:
113 case Kind::MultipleAssign:
118 case Kind::ShiftLeft:
119 case Kind::ShiftRight:
123 case Kind::SumAssign:
124 case Kind::TryMember:
127 case Kind::Unset:
return false;
130 util::cannotBeReached();
134 constexpr util::enum_::Value<Kind> Kinds[] =
135 {{.value = Kind::Add, .name =
"add"}, {.value = Kind::Begin, .name =
"begin"},
136 {.value = Kind::BitAnd, .name =
"&"}, {.value = Kind::BitOr, .name =
"|"},
137 {.value = Kind::BitXor, .name =
"^"}, {.value = Kind::Call, .name =
"call"},
138 {.value = Kind::Cast, .name =
"cast"}, {.value = Kind::CustomAssign, .name =
"="},
139 {.value = Kind::DecrPostfix, .name =
"--"}, {.value = Kind::DecrPrefix, .name =
"--"},
140 {.value = Kind::Delete, .name =
"delete"}, {.value = Kind::Deref, .name =
"*"},
141 {.value = Kind::Division, .name =
"/"}, {.value = Kind::DivisionAssign, .name =
"/="},
142 {.value = Kind::Equal, .name =
"=="}, {.value = Kind::End, .name =
"end"},
143 {.value = Kind::Greater, .name =
">"}, {.value = Kind::GreaterEqual, .name =
">="},
144 {.value = Kind::HasMember, .name =
"?."}, {.value = Kind::In, .name =
"in"},
145 {.value = Kind::IncrPostfix, .name =
"++"}, {.value = Kind::IncrPrefix, .name =
"++"},
146 {.value = Kind::Index, .name =
"index"}, {.value = Kind::IndexAssign, .name =
"index_assign"},
147 {.value = Kind::Lower, .name =
"<"}, {.value = Kind::LowerEqual, .name =
"<="},
148 {.value = Kind::Member, .name =
"."}, {.value = Kind::MemberCall, .name =
"method call"},
149 {.value = Kind::Negate, .name =
"~"}, {.value = Kind::New, .name =
"new"},
150 {.value = Kind::Difference, .name =
"-"}, {.value = Kind::DifferenceAssign, .name =
"-="},
151 {.value = Kind::Modulo, .name =
"%"}, {.value = Kind::Multiple, .name =
"*"},
152 {.value = Kind::MultipleAssign, .name =
"*="}, {.value = Kind::Sum, .name =
"+"},
153 {.value = Kind::Pack, .name =
"pack"}, {.value = Kind::Unset, .name =
"unset"},
154 {.value = Kind::SumAssign, .name =
"+="}, {.value = Kind::Power, .name =
"**"},
155 {.value = Kind::ShiftLeft, .name =
"<<"}, {.value = Kind::ShiftRight, .name =
">>"},
156 {.value = Kind::SignNeg, .name =
"-"}, {.value = Kind::SignPos, .name =
"+"},
157 {.value = Kind::Size, .name =
"size"}, {.value = Kind::TryMember, .name =
".?"},
158 {.value = Kind::Unequal, .name =
"!="}, {.value = Kind::Unknown, .name =
"<unknown>"},
159 {.value = Kind::Unpack, .name =
"unpack"}, {.value = Kind::Unset, .name =
"unset"}};
162 extern std::string
print(Kind kind,
const Expressions& operands);
165 extern std::string printSignature(Kind kind,
const Expressions& operands,
const Meta& meta);
174 constexpr
auto to_string(Kind m) {
return util::enum_::to_string(m, detail::Kinds); }
177 enum class Priority { Low, Normal };
179 using Operand = type::operand_list::Operand;
180 using Operands = type::operand_list::Operands;
186 parameter::Kind
kind = parameter::Kind::Unknown;
198 operator bool()
const {
return kind != parameter::Kind::Unknown && getType(); }
206 operator bool()
const {
return type !=
nullptr; }
216 operator bool()
const {
return type; }
219 operator_::Kind kind;
220 operator_::Priority priority = operator_::Priority::Normal;
227 std::optional<std::string> member;
246 operator_::Kind kind = operator_::Kind::Unknown;
250 operator_::Priority priority;
329 const auto&
meta()
const {
return _meta; }
352 virtual std::optional<operator_::Operands>
filter(
Builder* ,
const Expressions& )
const {
371 virtual std::string
name()
const = 0;
374 virtual std::string
print()
const;
377 virtual std::string
dump()
const;
392 virtual std::string
_typename()
const {
return util::typename_(*
this); }
401 parameter::Kind
kind,
403 std::string
doc =
"");
412 parameter::Kind
kind,
413 const Expressions& e,
421 std::optional<operator_::detail::ProcessedSignature> _signature;
433 std::string
print()
const final;
Definition: operator.h:428
std::string print() const final
Definition: operator.cc:360
Definition: expression.h:15
Definition: operator.h:268
static operator_::Operand * operandForType(Builder *builder, parameter::Kind kind, UnqualifiedType *t, std::string doc="")
Definition: operator.cc:347
virtual QualifiedType * result(Builder *builder, const Expressions &operands, const Meta &meta) const
Definition: operator.cc:324
bool init(Builder *builder, Node *scope_root=nullptr)
Definition: operator.cc:217
Operator(Meta meta=Meta(), bool builtin=true)
Definition: operator.h:280
auto hasOperands() const
Definition: operator.h:299
static operator_::Operand * operandForExpression(Builder *builder, parameter::Kind kind, const Expressions &e, size_t i)
Definition: operator.h:411
auto isBuiltIn() const
Definition: operator.h:314
auto operands() const
Definition: operator.h:317
virtual std::optional< operator_::Operands > filter(Builder *, const Expressions &) const
Definition: operator.h:352
virtual std::string dump() const
Definition: operator.cc:339
virtual operator_::Signature signature(Builder *builder) const =0
auto op2() const
Definition: operator.h:326
auto kind() const
Definition: operator.h:308
const auto & signature() const
Definition: operator.h:302
auto op1() const
Definition: operator.h:323
virtual ~Operator()
Definition: operator.h:283
virtual std::string _typename() const
Definition: operator.h:392
auto isInitialized() const
Definition: operator.h:292
virtual std::string name() const =0
auto typename_() const
Definition: operator.h:338
const auto & doc() const
Definition: operator.h:332
virtual std::string print() const
Definition: operator.cc:332
const auto & meta() const
Definition: operator.h:329
virtual Result< expression::ResolvedOperator * > instantiate(Builder *builder, Expressions operands, Meta meta) const =0
virtual void validate(expression::ResolvedOperator *n) const
Definition: operator.h:360
auto op0() const
Definition: operator.h:320
Definition: resolved-operator.h:23
Definition: operator-registry.h:35
Definition: operand-list.h:18
void print(const T &t, const hilti::rt::TypeInfo *, bool newline=true)
Definition: hilti.h:23
Definition: operator.h:210
Expression * default_
Definition: operator.h:213
QType type
Definition: operator.h:212
std::string name
Definition: operator.h:211
bool optional
Definition: operator.h:214
Definition: operator.h:201
Constness constness
Definition: operator.h:202
std::string doc
Definition: operator.h:204
UnqualifiedType * type
Definition: operator.h:203
Definition: operator.h:185
parameter::Kind kind
Definition: operator.h:186
std::string doc
Definition: operator.h:188
UnqualifiedType * type
Definition: operator.h:187
UnqualifiedType * external_type
Definition: operator.h:189
Definition: operator.h:183
QResult result
Definition: operator.h:234
std::string result_doc
Definition: operator.h:235
std::string ns
Definition: operator.h:237
bool skip_doc
Definition: operator.h:239
std::string doc
Definition: operator.h:238
Definition: operator.h:245
std::string result_doc
Definition: operator.h:252
std::string namespace_
Definition: operator.h:253
std::string doc
Definition: operator.h:251
node::RetainedPtr< QualifiedType > result
Definition: operator.h:248
node::RetainedPtr< type::OperandList > operands
Definition: operator.h:249
bool skip_doc
Definition: operator.h:254