 |
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 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; } \ 63 void validate(const hilti::expression::ResolvedOperator& , hilti::operator_::position_t ) const {} \ 74 #define BEGIN_OPERATOR_CUSTOM(ns, op) __BEGIN_OPERATOR_CUSTOM(ns, op, op) 80 #define END_OPERATOR_CUSTOM __END_OPERATOR_CUSTOM 91 #define BEGIN_OPERATOR_CUSTOM_x(ns, cls, op) __BEGIN_OPERATOR_CUSTOM(ns, op, cls) 97 #define END_OPERATOR_CUSTOM_x __END_OPERATOR_CUSTOM 103 #define STANDARD_OPERATOR_1(ns, op, result_, ty_op1, doc_) \ 104 BEGIN_OPERATOR(ns, op) \ 105 auto signature() const { \ 106 return hilti::operator_::Signature{.result = result_, \ 109 {.id = "op", .type = ty_op1}, \ 118 #define STANDARD_OPERATOR_1x(ns, cls, op, result_, ty_op1, doc_) \ 119 __BEGIN_OPERATOR_CUSTOM(ns, op, cls) \ 120 auto signature() const { \ 121 return hilti::operator_::Signature{.result = result_, \ 124 {.id = "op", .type = ty_op1}, \ 133 #define STANDARD_OPERATOR_2(ns, op, result_, ty_op1, ty_op2, doc_) \ 134 BEGIN_OPERATOR(ns, op) \ 135 auto signature() const { \ 136 return hilti::operator_::Signature{.result = result_, \ 137 .args = {{.id = "op0", .type = ty_op1}, {.id = "op1", .type = ty_op2}}, \ 145 #define STANDARD_OPERATOR_2x(ns, cls, op, result_, ty_op1, ty_op2, doc_) \ 146 __BEGIN_OPERATOR_CUSTOM(ns, op, cls) \ 147 auto signature() const { \ 148 return hilti::operator_::Signature{.result = result_, \ 149 .args = {{.id = "op0", .type = ty_op1}, {.id = "op1", .type = ty_op2}}, \ 157 #define STANDARD_OPERATOR_2x_lhs(ns, cls, op, result_, ty_op1, ty_op2, doc_) \ 158 __BEGIN_OPERATOR_CUSTOM(ns, op, cls) \ 159 auto signature() const { \ 160 return hilti::operator_::Signature{.lhs = true, \ 162 .args = {{.id = "op0", .type = ty_op1}, {.id = "op1", .type = ty_op2}}, \ 170 #define STANDARD_OPERATOR_3(ns, op, result_, ty_op1, ty_op2, ty_op3, doc_) \ 171 BEGIN_OPERATOR(ns, op) \ 172 auto signature() const { \ 173 return hilti::operator_::Signature{.result = result_, \ 174 .args = {{.id = "op0", .type = ty_op1}, \ 175 {.id = "op1", .type = ty_op2}, \ 176 {.id = "op2", .type = ty_op3}}, \ 188 #define BEGIN_METHOD(ns, method) __BEGIN_OPERATOR_CUSTOM(ns, MemberCall, method) 197 #define BEGIN_METHOD_CUSTOM_RESULT(ns, method) __BEGIN_OPERATOR_CUSTOM(ns, MemberCall, method) 200 #define __END_METHOD \ 201 std::vector<hilti::operator_::Operand> operands() const { \ 202 return {{.type = signature().self}, \ 203 {.type = hilti::type::Member(signature().id)}, \ 204 {.type = hilti::type::OperandList(signature().args)}}; \ 207 std::string doc() const { return signature().doc; } 213 hilti::Type result(const hilti::node::Range<hilti::Expression>& ops) const { \ 214 return *hilti::operator_::type(signature().result, hilti::node::Range(ops), ops); \ 217 bool isLhs() const { return false; } \ 219 void validate(const hilti::expression::ResolvedOperator& , hilti::operator_::position_t ) const {} \ 221 __END_OPERATOR_CUSTOM 227 #define END_METHOD_CUSTOM_RESULT \ 229 __END_OPERATOR_CUSTOM 237 #define BEGIN_CTOR(ns, cls) __BEGIN_OPERATOR_CUSTOM(ns, Call, cls) 240 std::vector<hilti::operator_::Operand> operands() const { \ 241 return {{.type = hilti::type::Type_(ctorType())}, {.type = hilti::type::OperandList(signature().args)}}; \ 244 std::string doc() const { return signature().doc; } \ 246 hilti::Type result(const hilti::node::Range<hilti::Expression>& ops) const { \ 248 return ops[0].type().as<hilti::type::Type_>().typeValue(); \ 253 bool isLhs() const { return false; } \ 255 void validate(const hilti::expression::ResolvedOperator& , hilti::operator_::position_t ) const {} \ 257 __END_OPERATOR_CUSTOM 263 #define OPERATOR_DECLARE_ONLY(ns, cls)