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[] = {{Kind::Add,
"add"}, {Kind::Begin,
"begin"},
135 {Kind::BitAnd,
"&"}, {Kind::BitOr,
"|"},
136 {Kind::BitXor,
"^"}, {Kind::Call,
"call"},
137 {Kind::Cast,
"cast"}, {Kind::CustomAssign,
"="},
138 {Kind::DecrPostfix,
"--"}, {Kind::DecrPrefix,
"--"},
139 {Kind::Delete,
"delete"}, {Kind::Deref,
"*"},
140 {Kind::Division,
"/"}, {Kind::DivisionAssign,
"/="},
141 {Kind::Equal,
"=="}, {Kind::End,
"end"},
142 {Kind::Greater,
">"}, {Kind::GreaterEqual,
">="},
143 {Kind::HasMember,
"?."}, {Kind::In,
"in"},
144 {Kind::IncrPostfix,
"++"}, {Kind::IncrPrefix,
"++"},
145 {Kind::Index,
"index"}, {Kind::IndexAssign,
"index_assign"},
146 {Kind::Lower,
"<"}, {Kind::LowerEqual,
"<="},
147 {Kind::Member,
"."}, {Kind::MemberCall,
"method call"},
148 {Kind::Negate,
"~"}, {Kind::New,
"new"},
149 {Kind::Difference,
"-"}, {Kind::DifferenceAssign,
"-="},
150 {Kind::Modulo,
"%"}, {Kind::Multiple,
"*"},
151 {Kind::MultipleAssign,
"*="}, {Kind::Sum,
"+"},
152 {Kind::Pack,
"unpack"}, {Kind::Unset,
"unset"},
153 {Kind::SumAssign,
"+="}, {Kind::Power,
"**"},
154 {Kind::ShiftLeft,
"<<"}, {Kind::ShiftRight,
">>"},
155 {Kind::SignNeg,
"-"}, {Kind::SignPos,
"+"},
156 {Kind::Size,
"size"}, {Kind::TryMember,
".?"},
157 {Kind::Unequal,
"!="}, {Kind::Unknown,
"<unknown>"},
158 {Kind::Unpack,
"unpack"}, {Kind::Unset,
"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