13 #include <hilti/ast/declarations/expression.h> 14 #include <hilti/ast/expressions/grouping.h> 15 #include <hilti/ast/expressions/keyword.h> 16 #include <hilti/ast/expressions/type.h> 17 #include <hilti/ast/types/reference.h> 19 #include <spicy/ast/types/unit-item.h> 20 #include <spicy/ast/types/unit-items/field.h> 21 #include <spicy/ast/types/unit-items/property.h> 22 #include <spicy/ast/types/unit-items/switch.h> 23 #include <spicy/ast/types/unit-items/unresolved-field.h> 24 #include <spicy/compiler/detail/codegen/grammar.h> 28 namespace detail::codegen {
50 std::vector<unit::Item> assignIndices(std::vector<unit::Item> items);
52 uint64_t _next_index = 0;
64 Unit(std::vector<type::function::Parameter> params, std::vector<unit::Item> i,
65 const std::optional<AttributeSet>& = {},
Meta m =
Meta())
66 : TypeBase(hilti::nodes(node::none, node::none, node::none,
67 hilti::util::transform(params,
69 p.setIsTypeParameter();
72 assignIndices(std::move(i))),
78 if ( childs()[0].isA<Declaration>() )
84 auto id()
const {
return childs()[1].tryAs<
ID>(); }
85 auto parameters()
const {
return childsOfType<type::function::Parameter>(); }
86 auto parameterRefs()
const {
return childRefsOfType<type::function::Parameter>(); }
87 auto items()
const {
return childsOfType<unit::Item>(); }
88 auto itemRefs()
const {
return childRefsOfType<unit::Item>(); }
89 auto attributes()
const {
return childs()[2].tryAs<
AttributeSet>(); }
93 if (
auto context = propertyItem(
"%context") )
106 NodeRef itemRefByName(
const ID&
id)
const;
113 return childsOfType<T>();
121 for (
const auto& i : items<unit::item::Property>() ) {
122 if ( i.id() == name )
133 for (
const auto& i : items<unit::item::Property>() ) {
134 if ( i.id() == name )
183 bool isFilter()
const {
return propertyItem(
"%filter").has_value(); }
194 auto new_items = assignIndices(items);
196 for (
auto i : new_items )
197 childs().emplace_back(std::move(i));
200 void setAttributes(
AttributeSet attrs) { childs()[2] = std::move(attrs); }
201 void setGrammar(std::shared_ptr<spicy::detail::codegen::Grammar> g) { _grammar = std::move(g); }
202 void setID(
ID id) { childs()[1] = std::move(
id); }
203 void setPublic(
bool p) { _public = p; }
205 bool operator==(
const Unit& other)
const {
212 auto isEqual(
const Type& other)
const {
return node::isEqual(
this, other); }
214 auto _isResolved(ResolvedState* rstate)
const {
215 for (
const auto& i : items() ) {
216 if ( ! i.isResolved() )
224 auto typeParameters()
const {
return childs(); }
225 auto isWildcard()
const {
return _wildcard; }
228 auto properties()
const {
return node::Properties{{
"public", _public}}; }
242 n->childs()[0] = std::move(d);
246 bool _public =
false;
247 bool _wildcard =
false;
248 std::shared_ptr<spicy::detail::codegen::Grammar> _grammar;
bool supportsSinks() const
Definition: unit.h:165
bool supportsFilters() const
Definition: unit.h:174
auto items() const
Definition: unit.h:112
Definition: declaration.h:53
const spicy::detail::codegen::Grammar & grammar() const
Definition: unit.h:187
auto propertyItems(const std::string &name) const
Definition: unit.h:130
Definition: reference.h:16
static void setSelf(Node *n)
Definition: unit.h:236
Definition: attribute.h:145
Definition: expression.h:17
Definition: optional-ref.h:22
auto isPublic() const
Definition: unit.h:145
bool usesRandomAccess() const
Definition: unit.h:156
void addItems(std::vector< unit::Item > items)
Definition: unit.h:193
bool isFilter() const
Definition: unit.h:183
hilti::optional_ref< const unit::item::Property > propertyItem(const std::string &name) const
Definition: unit.h:120
Definition: node-ref.h:44
hilti::optional_ref< const Type > contextType() const
Definition: unit.h:92