11 #include <hilti/ast/expressions/type.h> 13 #include <spicy/ast/types/unit-item.h> 14 #include <spicy/ast/types/unit-items/field.h> 15 #include <spicy/ast/types/unit-items/property.h> 16 #include <spicy/ast/types/unit-items/switch.h> 17 #include <spicy/ast/types/unit-items/unresolved-field.h> 18 #include <spicy/compiler/detail/codegen/grammar.h> 22 namespace detail::codegen {
44 std::vector<unit::Item> assignIndices(std::vector<unit::Item> items);
46 uint64_t _next_index = 0;
57 Unit(std::vector<type::function::Parameter> p, std::vector<unit::Item> i,
58 const std::optional<AttributeSet>& = {},
Meta m =
Meta())
59 : TypeBase(hilti::nodes(std::move(p), assignIndices(std::move(i))), std::move(m)) {
60 _state().
flags += type::Flag::NoInheritScope;
64 _state().flags += type::Flag::NoInheritScope;
67 auto parameters()
const {
return childsOfType<type::function::Parameter>(); }
68 auto items()
const {
return childsOfType<unit::Item>(); }
70 std::optional<AttributeSet> attributes()
const {
71 auto x = childsOfType<AttributeSet>();
79 std::vector<Type> types;
80 for (
auto c : childs() )
81 types.push_back(c.as<unit::Item>().itemType());
88 if (
auto context = propertyItem(
"%context") )
98 std::optional<unit::Item> field(
const ID&
id)
const;
106 for (
const auto& c : childs() ) {
107 if (
auto x = c.tryAs<T>() )
117 std::optional<unit::item::Property>
propertyItem(
const std::string& name)
const {
118 for (
auto i : items<unit::item::Property>() ) {
119 if ( i.id() == name )
128 std::vector<unit::item::Property> props;
130 for (
const auto& i : items<unit::item::Property>() ) {
131 if ( i.id() == name )
180 bool isFilter()
const {
return propertyItem(
"%filter").has_value(); }
188 bool operator==(
const Unit& other)
const {
return typeID() == other.
typeID(); }
191 auto isEqual(
const Type& other)
const {
return node::isEqual(
this, other); }
194 auto typeParameters()
const {
return childs(); }
195 auto isWildcard()
const {
return _wildcard; }
198 auto properties()
const {
return node::Properties{{
"public", _public}}; }
208 auto x = Type(unit)._clone().as<
Unit>();
221 auto x = Type(unit)._clone().as<
Unit>();
224 for (
auto i : new_items )
225 x.childs().emplace_back(std::move(i));
238 auto x = Type(unit)._clone().as<
Unit>();
239 x.
childs().push_back(std::move(attrs));
251 auto x = Type(unit)._clone().as<
Unit>();
252 x._grammar = std::move(g);
257 bool _public =
false;
258 bool _wildcard =
false;
259 std::shared_ptr<spicy::detail::codegen::Grammar> _grammar;
bool supportsSinks() const
Definition: unit.h:162
std::vector< unit::Item > assignIndices(std::vector< unit::Item > items)
Definition: unit.cc:34
std::vector< T > childs(int begin, int end) const
Definition: node.h:373
bool supportsFilters() const
Definition: unit.h:171
auto items() const
Definition: unit.h:104
const spicy::detail::codegen::Grammar & grammar() const
Definition: unit.h:183
auto propertyItems(const std::string &name) const
Definition: unit.h:127
type::Flags flags() const
Definition: type.h:159
std::optional< unit::item::Property > propertyItem(const std::string &name) const
Definition: unit.h:117
Definition: attribute.h:159
static Unit addAttributes(const Unit &unit, AttributeSet attrs)
Definition: unit.h:237
auto isPublic() const
Definition: unit.h:142
bool usesRandomAccess() const
Definition: unit.h:153
std::optional< ID > typeID() const
Definition: type.h:163
bool isFilter() const
Definition: unit.h:180
std::optional< Type > contextType() const
Definition: unit.h:87
static Unit setPublic(const Unit &unit, bool p)
Definition: unit.h:207
static Unit addItems(const Unit &unit, std::vector< unit::Item > items)
Definition: unit.h:220
static Unit setGrammar(const Unit &unit, std::shared_ptr< spicy::detail::codegen::Grammar > g)
Definition: unit.h:250