11 #include <hilti/ast/expression.h>
12 #include <hilti/ast/forward.h>
13 #include <hilti/ast/node.h>
14 #include <hilti/base/util.h>
32 explicit Kind(std::string name) : _name(std::move(name)) { _register(); }
40 operator std::string()
const {
return _name; }
42 Kind& operator=(
const Kind& other) =
default;
43 Kind& operator=(
Kind&& other) =
default;
45 bool operator==(
const Kind& other)
const {
return _name == other._name; }
46 bool operator!=(
const Kind& other)
const {
return ! operator==(other); }
51 static Kind fromString(
const std::string_view& s) {
52 if ( _known_attributes && _known_attributes->contains(std::string(s)) )
53 return Kind(std::string(s));
55 throw std::out_of_range(
"unknown attribute kind: " + std::string(s));
61 std::string _name =
"<unset attribute>";
62 static std::set<std::string>* _known_attributes;
66 inline bool isOneOf(
const Kind& kind, std::initializer_list<Kind> kinds) {
67 return std::ranges::find(kinds, kind) != kinds.end();
70 inline auto to_string(
const Kind& kind) {
return std::string(kind); }
72 inline std::ostream& operator<<(std::ostream& out,
const Kind& x) {
78 inline auto from_string(
const std::string_view& s) {
return Kind::fromString(s); }
82 const Kind AlwaysEmit(
"&always-emit");
83 const Kind Anchor(
"&anchor");
84 const Kind Anonymous(
"&anonymous");
85 const Kind Convert(
"&convert");
86 const Kind Cxxname(
"&cxxname");
87 const Kind CxxAnyAsPtr(
"&cxx-any-as-ptr");
88 const Kind Debug(
"&debug");
89 const Kind Default(
"&default");
90 const Kind HavePrototype(
"&have_prototype");
91 const Kind Internal(
"&internal");
92 const Kind NeededByFeature(
"&needed-by-feature");
93 const Kind NoEmit(
"&no-emit");
94 const Kind Nosub(
"&nosub");
95 const Kind OnHeap(
"&on-heap");
96 const Kind Optional(
"&optional");
97 const Kind Priority(
"&priority");
98 const Kind Public(
"&public");
99 const Kind RequiresTypeFeature(
"&requires-type-feature");
100 const Kind Static(
"&static");
109 const auto&
kind()
const {
return _kind; }
161 auto p = node::Properties{{
"tag", to_string(
kind())}};
189 :
Node(ctx, NodeTags, std::move(
children), std::move(m)), _kind(std::move(
kind)) {}
191 std::string
_dump()
const override;
193 HILTI_NODE_0(Attribute,
final);
196 attribute::Kind _kind;
203 auto attributes()
const {
return children<Attribute>(0, {}); }
233 static auto create(
ASTContext* ctx,
const Attributes& attrs = {}, Meta m = Meta()) {
245 :
Node(ctx, NodeTags, std::move(
children), std::move(m)) {}
254 std::string
_dump()
const override;
263 struct hash<hilti::attribute::Kind> {
Definition: ast-context.h:121
T * make(Args &&... args)
Definition: ast-context.h:366
Definition: attribute.h:106
static auto create(ASTContext *ctx, const attribute::Kind &kind, Expression *v, const Meta &m=Meta())
Definition: attribute.h:173
std::string _dump() const override
Definition: attribute.cc:80
Result< Expression * > valueAsExpression() const
Definition: attribute.cc:24
Node * value() const
Definition: attribute.h:119
Result< int64_t > valueAsInteger() const
Definition: attribute.cc:45
Result< bool > coerceValueTo(Builder *builder, QualifiedType *dst)
Definition: attribute.cc:60
static auto create(ASTContext *ctx, const attribute::Kind &kind, const Meta &m=Meta())
Definition: attribute.h:183
const auto & kind() const
Definition: attribute.h:109
node::Properties properties() const final
Definition: attribute.h:160
Result< std::string > valueAsString() const
Definition: attribute.cc:34
auto hasValue() const
Definition: attribute.h:112
Definition: attribute.h:200
std::string _dump() const override
Definition: attribute.cc:82
hilti::node::Set< Attribute > findAll(const attribute::Kind &kind) const
Definition: attribute.cc:92
void add(ASTContext *ctx, Attribute *a)
Definition: attribute.h:221
auto attributes() const
Definition: attribute.h:203
void remove(const attribute::Kind &kind)
Definition: attribute.cc:102
Attribute * find(const attribute::Kind &kind) const
Definition: attribute.cc:84
AttributeSet(ASTContext *ctx, Meta m=Meta())
Definition: attribute.h:252
AttributeSet(ASTContext *ctx, Nodes children, Meta m=Meta())
Definition: attribute.h:244
Definition: expression.h:15
void setMeta(Meta m)
Definition: node.h:312
void addChild(ASTContext *ctx, Node *n)
Definition: node.h:522
const auto & location() const
Definition: node.h:309
const auto & children() const
Definition: node.h:364
const auto & meta() const
Definition: node.h:306
T * child(unsigned int i) const
Definition: node.h:374
virtual node::Properties properties() const
Definition: node.h:891
Definition: forward.h:758
Definition: attribute.h:30