8 #include <hilti/ast/types/vector.h> 10 #include <spicy/ast/aliases.h> 11 #include <spicy/ast/engine.h> 12 #include <spicy/ast/types/unit-items/field.h> 13 #include <spicy/ast/types/unit.h> 22 Case(std::vector<Expression> exprs, std::vector<type::unit::Item> items,
Meta m =
Meta())
23 :
NodeBase(hilti::nodes(std::move(items), std::move(exprs)), std::move(m)) {}
35 auto expressions()
const {
return childsOfType<Expression>(); }
36 auto items()
const {
return childsOfType<type::unit::Item>(); }
37 auto itemNodes() {
return nodesOfType<type::unit::Item>(); }
40 bool isDefault()
const {
return expressions().empty() && ! _look_ahead; }
45 auto properties()
const {
return node::Properties{{
"default",
isDefault()}, {
"look-ahead",
isLookAhead()}}; }
47 bool operator==(
const Case& other)
const {
48 return expressions() == other.expressions() && items() == other.items();
52 bool _look_ahead =
false;
55 inline Node to_node(
Case c) {
return Node(std::move(c)); }
62 Switch(std::optional<Expression> expr,
const std::vector<switch_::Case>& cases, Engine e,
63 std::optional<Expression> cond, std::vector<Hook> hooks, std::optional<AttributeSet> attributes,
65 : NodeBase(nodes(std::move(expr), std::move(cond), std::move(attributes), cases, std::move(hooks)),
69 _cases_end(_cases_start + static_cast<int>(cases.size())),
70 _hooks_start(_cases_end),
73 auto expression()
const {
return childs()[0].tryReferenceAs<Expression>(); }
74 Engine engine()
const {
return _engine; }
75 auto condition()
const {
return childs()[1].tryReferenceAs<Expression>(); }
76 auto cases()
const {
return childs<switch_::Case>(_cases_start, _cases_end); }
77 auto casesNodes() {
return nodesOfType<switch_::Case>(); }
80 auto hooks()
const {
return childs<Hook>(_hooks_start, _hooks_end); }
83 bool hasNoFields()
const;
92 bool operator==(
const Switch& other)
const {
93 return expression() == other.expression() && engine() == other.engine() && condition() == other.condition() &&
94 cases() == other.cases() && hooks() == other.hooks();
99 auto isEqual(
const Item& other)
const {
return node::isEqual(
this, other); }
102 auto properties()
const {
return node::Properties{{
"engine", to_string(_engine)}}; }
106 const int _cases_start;
107 const int _cases_end;
108 const int _hooks_start;
109 const int _hooks_end;
NodeBase(Meta meta)
Definition: node.h:325
auto & childs() const
Definition: node.h:445
Case(std::vector< type::unit::Item > items, Meta m=Meta())
Definition: switch.h:26
Definition: optional.h:79
Definition: attribute.h:159
bool isDefault() const
Definition: switch.h:40
Case(type::unit::Item field, Meta m=Meta())
Definition: switch.h:30
bool isLookAhead() const
Definition: switch.h:43
Definition: unit-item.h:19
Definition: unit-item.h:39