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);
166 extern std::string printSignature(Kind kind,
const Expressions& operands,
const Meta& meta);
175 constexpr
auto to_string(Kind m) {
return util::enum_::to_string(m, detail::Kinds); }
178 enum class Priority { Low, Normal };
180 using Operand = type::operand_list::Operand;
181 using Operands = type::operand_list::Operands;
187 parameter::Kind
kind = parameter::Kind::Unknown;
199 operator bool()
const {
return kind != parameter::Kind::Unknown && getType(); }
207 operator bool()
const {
return type !=
nullptr; }
217 operator bool()
const {
return type; }
220 operator_::Kind kind;
221 operator_::Priority priority = operator_::Priority::Normal;
228 std::optional<std::string> member;
247 operator_::Kind kind = operator_::Kind::Unknown;
251 operator_::Priority priority;
330 const auto&
meta()
const {
return _meta; }
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 std::string
doc =
"");
417 std::optional<operator_::detail::ProcessedSignature> _signature;
429 std::string
print()
const final;
Definition: operator.h:424
std::string print() const final
Definition: operator.cc:343
Definition: expression.h:15
Definition: operator.h:269
static operator_::Operand * operandForType(Builder *builder, parameter::Kind kind, UnqualifiedType *t, std::string doc="")
Definition: operator.cc:334
virtual QualifiedType * result(Builder *builder, const Expressions &operands, const Meta &meta) const
Definition: operator.cc:310
bool init(Builder *builder, Node *scope_root=nullptr)
Definition: operator.cc:209
Operator(Meta meta=Meta(), bool builtin=true)
Definition: operator.h:281
auto hasOperands() const
Definition: operator.h:300
static operator_::Operand * operandForExpression(Builder *builder, parameter::Kind kind, const Expressions &e, size_t i)
Definition: operator.h:409
auto isBuiltIn() const
Definition: operator.h:315
virtual std::optional< operator_::Operands > filter(Builder *builder, const Expressions &operands) const
Definition: operator.h:353
auto operands() const
Definition: operator.h:318
virtual std::string dump() const
Definition: operator.cc:326
virtual operator_::Signature signature(Builder *builder) const =0
auto op2() const
Definition: operator.h:327
auto kind() const
Definition: operator.h:309
const auto & signature() const
Definition: operator.h:303
auto op1() const
Definition: operator.h:324
virtual ~Operator()
Definition: operator.h:284
virtual std::string _typename() const
Definition: operator.h:392
auto isInitialized() const
Definition: operator.h:293
virtual std::string name() const =0
auto typename_() const
Definition: operator.h:339
const auto & doc() const
Definition: operator.h:333
virtual std::string print() const
Definition: operator.cc:319
const auto & meta() const
Definition: operator.h:330
virtual Result< expression::ResolvedOperator * > instantiate(Builder *builder, Expressions operands, Meta meta) const =0
virtual void validate(expression::ResolvedOperator *n) const
Definition: operator.h:361
auto op0() const
Definition: operator.h:321
Definition: resolved-operator.h:19
Definition: operator-registry.h:32
Definition: operand-list.h:18
void print(const T &t, const hilti::rt::TypeInfo *, bool newline=true)
Definition: hilti.h:23
Definition: operator.h:211
Expression * default_
Definition: operator.h:214
QType type
Definition: operator.h:213
std::string name
Definition: operator.h:212
bool optional
Definition: operator.h:215
Definition: operator.h:202
Constness constness
Definition: operator.h:203
std::string doc
Definition: operator.h:205
UnqualifiedType * type
Definition: operator.h:204
Definition: operator.h:186
parameter::Kind kind
Definition: operator.h:187
std::string doc
Definition: operator.h:189
UnqualifiedType * type
Definition: operator.h:188
UnqualifiedType * external_type
Definition: operator.h:190
Definition: operator.h:184
QResult result
Definition: operator.h:235
std::string result_doc
Definition: operator.h:236
std::string ns
Definition: operator.h:238
bool skip_doc
Definition: operator.h:240
std::string doc
Definition: operator.h:239
Definition: operator.h:246
std::string result_doc
Definition: operator.h:253
std::string namespace_
Definition: operator.h:254
std::string doc
Definition: operator.h:252
node::RetainedPtr< QualifiedType > result
Definition: operator.h:249
node::RetainedPtr< type::OperandList > operands
Definition: operator.h:250
bool skip_doc
Definition: operator.h:255