 |
Spicy
|
8 #include <hilti/ast/expression.h> 9 #include <hilti/ast/expressions/member.h> 10 #include <hilti/ast/expressions/resolved-operator.h> 11 #include <hilti/ast/expressions/unresolved-operator.h> 12 #include <hilti/ast/operator.h> 13 #include <hilti/ast/statements/expression.h> 14 #include <hilti/ast/types/doc-only.h> 15 #include <hilti/ast/types/operand-list.h> 18 #define __BEGIN_OPERATOR_CUSTOM(ns, op, cls) \ 21 class cls : public hilti::expression::ResolvedOperatorBase { \ 23 using hilti::expression::ResolvedOperatorBase::ResolvedOperatorBase; \ 26 struct Operator : public hilti::trait::isOperator { \ 27 static ::hilti::operator_::Kind kind() { return ::hilti::operator_::Kind::op; } \ 29 hilti::Expression instantiate(const std::vector<hilti::Expression>& operands, const Meta& meta) const; \ 30 std::string docNamespace() const { return #ns; } 33 #define __END_OPERATOR_CUSTOM \ 49 #define BEGIN_OPERATOR(ns, op) __BEGIN_OPERATOR_CUSTOM(ns, op, op) 52 #define END_OPERATOR \ 53 const std::vector<hilti::operator_::Operand>& operands() const { return signature().args; } \ 55 std::string doc() const { return signature().doc; } \ 57 hilti::Type result(const hilti::node::Range<hilti::Expression>& ops) const { \ 58 return *hilti::operator_::type(signature().result, ops, ops); \ 61 bool isLhs() const { return signature().lhs; } \ 62 hilti::operator_::Priority priority() const { return signature().priority; } \ 64 void validate(const hilti::expression::ResolvedOperator& , hilti::operator_::position_t ) const {} \ 75 #define BEGIN_OPERATOR_CUSTOM(ns, op) __BEGIN_OPERATOR_CUSTOM(ns, op, op) 81 #define END_OPERATOR_CUSTOM __END_OPERATOR_CUSTOM 92 #define BEGIN_OPERATOR_CUSTOM_x(ns, cls, op) __BEGIN_OPERATOR_CUSTOM(ns, op, cls) 98 #define END_OPERATOR_CUSTOM_x __END_OPERATOR_CUSTOM 104 #define STANDARD_OPERATOR_1(ns, op, result_, ty_op1, doc_) \ 105 BEGIN_OPERATOR(ns, op) \ 106 const auto& signature() const { \ 107 static hilti::operator_::Signature _signature = {.result = result_, \ 120 #define STANDARD_OPERATOR_1x(ns, cls, op, result_, ty_op1, doc_) \ 121 __BEGIN_OPERATOR_CUSTOM(ns, op, cls) \ 122 const auto& signature() const { \ 123 static hilti::operator_::Signature _signature = {.result = result_, \ 136 #define STANDARD_OPERATOR_2(ns, op, result_, ty_op1, ty_op2, doc_) \ 137 BEGIN_OPERATOR(ns, op) \ 138 const auto& signature() const { \ 139 static hilti::operator_::Signature _signature = {.result = result_, \ 140 .args = {{"op0", ty_op1}, {"op1", ty_op2}}, \ 149 #define STANDARD_OPERATOR_2x(ns, cls, op, result_, ty_op1, ty_op2, doc_) \ 150 __BEGIN_OPERATOR_CUSTOM(ns, op, cls) \ 151 const auto& signature() const { \ 152 static hilti::operator_::Signature _signature = {.result = result_, \ 153 .args = {{"op0", ty_op1}, {"op1", ty_op2}}, \ 162 #define STANDARD_OPERATOR_2x_low_prio(ns, cls, op, result_, ty_op1, ty_op2, doc_) \ 163 __BEGIN_OPERATOR_CUSTOM(ns, op, cls) \ 164 const auto& signature() const { \ 165 static hilti::operator_::Signature _signature = {.priority = operator_::Priority::Low, \ 167 .args = {{"op0", ty_op1}, {"op1", ty_op2}}, \ 176 #define STANDARD_OPERATOR_2x_lhs(ns, cls, op, result_, ty_op1, ty_op2, doc_) \ 177 __BEGIN_OPERATOR_CUSTOM(ns, op, cls) \ 178 const auto& signature() const { \ 179 static hilti::operator_::Signature _signature = {.lhs = true, \ 181 .args = {{"op0", ty_op1}, {"op1", ty_op2}}, \ 190 #define STANDARD_OPERATOR_3(ns, op, result_, ty_op1, ty_op2, ty_op3, doc_) \ 191 BEGIN_OPERATOR(ns, op) \ 192 const auto& signature() const { \ 193 static hilti::operator_::Signature _signature = \ 194 {.result = result_, .args = {{"op0", ty_op1}, {"op1", ty_op2}, {"op2", ty_op3}}, .doc = doc_}; \ 206 #define BEGIN_METHOD(ns, method) __BEGIN_OPERATOR_CUSTOM(ns, MemberCall, method) 215 #define BEGIN_METHOD_CUSTOM_RESULT(ns, method) __BEGIN_OPERATOR_CUSTOM(ns, MemberCall, method) 218 #define __END_METHOD \ 219 const std::vector<hilti::operator_::Operand>& operands() const { \ 220 static std::vector<hilti::operator_::Operand> _operands = {{{}, signature().self}, \ 221 {{}, hilti::type::Member(signature().id)}, \ 222 {{}, hilti::type::OperandList(signature().args)}}; \ 226 std::string doc() const { return signature().doc; } 232 hilti::Type result(const hilti::node::Range<hilti::Expression>& ops) const { \ 233 return *hilti::operator_::type(signature().result, hilti::node::Range(ops), ops); \ 236 bool isLhs() const { return false; } \ 237 hilti::operator_::Priority priority() const { return signature().priority; } \ 239 void validate(const hilti::expression::ResolvedOperator& , hilti::operator_::position_t ) const {} \ 241 __END_OPERATOR_CUSTOM 247 #define END_METHOD_CUSTOM_RESULT \ 249 __END_OPERATOR_CUSTOM 257 #define BEGIN_CTOR(ns, cls) __BEGIN_OPERATOR_CUSTOM(ns, Call, cls) 260 const std::vector<hilti::operator_::Operand>& operands() const { \ 261 static std::vector<hilti::operator_::Operand> _operands = {{{}, hilti::type::Type_(ctorType())}, \ 262 {{}, hilti::type::OperandList(signature().args)}}; \ 266 std::string doc() const { return signature().doc; } \ 268 hilti::Type result(const hilti::node::Range<hilti::Expression>& ops) const { \ 270 return ops[0].type().as<hilti::type::Type_>().typeValue(); \ 275 bool isLhs() const { return false; } \ 276 hilti::operator_::Priority priority() const { return signature().priority; } \ 278 void validate(const hilti::expression::ResolvedOperator& , hilti::operator_::position_t ) const {} \ 280 __END_OPERATOR_CUSTOM 286 #define OPERATOR_DECLARE_ONLY(ns, cls)