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(
const 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 ( children()[0].isA<Declaration>() )
84 auto id()
const {
return children()[1].tryAs<
ID>(); }
85 auto parameters()
const {
return childrenOfType<type::function::Parameter>(); }
86 auto parameterRefs()
const {
return childRefsOfType<type::function::Parameter>(); }
87 auto items()
const {
return childrenOfType<unit::Item>(); }
88 auto itemRefs()
const {
return childRefsOfType<unit::Item>(); }
89 auto attributes()
const {
return children()[2].tryAs<
AttributeSet>(); }
93 if (
auto context = propertyItem(
"%context") )
106 NodeRef itemRefByName(
const ID&
id)
const;
113 return childrenOfType<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 )
154 bool isFilter()
const {
return propertyItem(
"%filter").has_value(); }
165 auto new_items = assignIndices(std::move(items));
167 for (
auto i : new_items )
168 children().emplace_back(std::move(i));
171 void setAttributes(
const AttributeSet& attrs) { children()[2] = attrs; }
172 void setGrammar(std::shared_ptr<spicy::detail::codegen::Grammar> g) { _grammar = std::move(g); }
173 void setID(
const ID&
id) { children()[1] = id; }
174 void setPublic(
bool p) { _public = p; }
176 bool operator==(
const Unit& other)
const {
183 auto isEqual(
const Type& other)
const {
return node::isEqual(
this, other); }
185 auto _isResolved(ResolvedState* rstate)
const {
187 return std::all_of(xs.begin(), xs.end(), [](
const auto& x) {
return x.isResolved(); });
191 auto typeParameters()
const {
return children(); }
192 auto isWildcard()
const {
return _wildcard; }
195 auto properties()
const {
return node::Properties{{
"public", _public}}; }
209 n->children()[0] = d;
213 bool _public =
false;
214 bool _wildcard =
false;
215 std::shared_ptr<spicy::detail::codegen::Grammar> _grammar;
auto items() const
Definition: unit.h:112
Definition: declaration.h:53
const spicy::detail::codegen::Grammar & grammar() const
Definition: unit.h:158
auto propertyItems(const std::string &name) const
Definition: unit.h:130
Definition: reference.h:15
static void setSelf(Node *n)
Definition: unit.h:203
Definition: attribute.h:145
Definition: expression.h:16
Definition: optional-ref.h:22
auto isPublic() const
Definition: unit.h:145
void addItems(std::vector< unit::Item > items)
Definition: unit.h:164
bool isFilter() const
Definition: unit.h:154
hilti::optional_ref< const unit::item::Property > propertyItem(const std::string &name) const
Definition: unit.h:120
Definition: node-ref.h:45
hilti::optional_ref< const Type > contextType() const
Definition: unit.h:92