9 #include <hilti/ast/types/vector.h> 10 #include <hilti/base/uniquer.h> 12 #include <spicy/ast/aliases.h> 13 #include <spicy/ast/engine.h> 14 #include <spicy/ast/types/unit-item.h> 21 Field(
const std::optional<ID>&
id, Type type, Engine e,
const std::vector<Expression>& args,
22 std::optional<Expression> repeat,
const std::vector<Expression>& sinks,
23 std::optional<AttributeSet> attrs = {}, std::optional<Expression> cond = {}, std::vector<Hook> hooks = {},
25 :
NodeBase(nodes((
id ?
id : _uniquer.get(
"anon")), std::move(type), node::none, repeat, std::move(attrs),
26 std::move(cond), args, sinks, hooks),
28 _is_forwarding(
false),
29 _is_transient(!
id.has_value()),
32 _args_end(_args_start + static_cast<int>(args.size())),
33 _sinks_start(_args_end),
34 _sinks_end(_sinks_start + static_cast<int>(sinks.size())),
35 _hooks_start(_sinks_end),
36 _hooks_end(_hooks_start + static_cast<int>(hooks.size())) {}
38 Field(
const std::optional<ID>&
id, Ctor ctor, Engine e,
const std::vector<Expression>& args,
39 std::optional<Expression> repeat,
const std::vector<Expression>& sinks,
40 std::optional<AttributeSet> attrs = {}, std::optional<Expression> cond = {}, std::vector<Hook> hooks = {},
42 :
NodeBase(nodes((
id ?
id : _uniquer.get(
"anon")), ctor.type(), ctor, repeat, std::move(attrs), std::move(cond),
45 _is_forwarding(
false),
46 _is_transient(!
id.has_value()),
49 _args_end(_args_start + static_cast<int>(args.size())),
50 _sinks_start(_args_end),
51 _sinks_end(_sinks_start + static_cast<int>(sinks.size())),
52 _hooks_start(_sinks_end),
53 _hooks_end(_hooks_start + static_cast<int>(hooks.size())) {}
55 Field(
const std::optional<ID>&
id, Item item, Engine e,
const std::vector<Expression>& args,
56 std::optional<Expression> repeat,
const std::vector<Expression>& sinks,
57 std::optional<AttributeSet> attrs = {}, std::optional<Expression> cond = {}, std::vector<Hook> hooks = {},
59 :
NodeBase(nodes((
id ?
id : _uniquer.get(
"anon")), item.itemType(), item, repeat, std::move(attrs),
60 std::move(cond), args, sinks, hooks),
62 _is_forwarding(
false),
63 _is_transient(!
id.has_value()),
66 _args_end(_args_start + static_cast<int>(args.size())),
67 _sinks_start(_args_end),
68 _sinks_end(_sinks_start + static_cast<int>(sinks.size())),
69 _hooks_start(_sinks_end),
70 _hooks_end(_hooks_start + static_cast<int>(hooks.size())) {}
77 const auto& id()
const {
return childs()[0].as<
ID>(); }
78 auto index()
const {
return _index; }
79 auto ctor()
const {
return childs()[2].tryReferenceAs<Ctor>(); }
80 auto item()
const {
return childs()[2].tryReferenceAs<Item>(); }
82 auto repeatCount()
const {
return childs()[3].tryReferenceAs<Expression>(); }
84 auto condition()
const {
return childs()[5].tryReferenceAs<Expression>(); }
85 auto arguments()
const {
return childs<Expression>(_args_start, _args_end); }
86 auto sinks()
const {
return childs<Expression>(_sinks_start, _sinks_end); }
87 auto hooks()
const {
return childs<Hook>(_hooks_start, _hooks_end); }
88 Engine engine()
const {
return _engine; }
90 bool isContainer()
const {
return repeatCount().has_value(); }
91 bool isForwarding()
const {
return _is_forwarding; }
92 bool isTransient()
const {
return _is_transient; }
93 bool emitHook()
const {
return ! isTransient() || hooks().size(); }
95 Type parseType()
const;
97 Type originalType()
const {
return childs()[1].as<Type>(); }
99 Node& originalTypeNode() {
return childs()[1]; }
102 Node& attributesNode() {
return childs()[4]; }
107 std::optional<std::pair<Expression, std::optional<Type>>> convertExpression()
const;
109 bool operator==(
const Field& other)
const {
110 return _engine == other._engine && id() == other.id() && originalType() == other.originalType() &&
111 attributes() == other.attributes() && arguments() == other.arguments() && sinks() == other.sinks() &&
112 condition() == other.condition() && hooks() == other.hooks();
115 Field& operator=(
const Field& other) =
default;
119 Type itemType()
const;
120 auto isEqual(
const Item& other)
const {
return node::isEqual(
this, other); }
123 auto properties()
const {
124 return node::Properties{{
"engine", to_string(_engine)},
125 {
"transient", _is_transient},
126 {
"forwarding", _is_forwarding}};
142 static Type vectorElementTypeThroughSelf(
ID id);
152 auto x = Item(f)._clone().as<
Field>();
157 static Field setForwarding(
const Field& f,
bool is_forwarding) {
158 auto x = Item(f)._clone().as<
Field>();
159 x._is_forwarding = is_forwarding;
164 std::optional<uint64_t> _index;
NodeBase(Meta meta)
Definition: node.h:325
auto & childs() const
Definition: node.h:445
Definition: attribute.h:159
Definition: unit-item.h:19
static Field setIndex(const Field &f, uint64_t index)
Definition: field.h:151
Definition: unit-item.h:39