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->count(std::string(s)) > 0 )
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::find(kinds.begin(), kinds.end(), 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 Debug(
"&debug");
88 const Kind Default(
"&default");
89 const Kind HavePrototype(
"&have_prototype");
90 const Kind Internal(
"&internal");
91 const Kind NeededByFeature(
"&needed-by-feature");
92 const Kind NoEmit(
"&no-emit");
93 const Kind Nosub(
"&nosub");
94 const Kind OnHeap(
"&on-heap");
95 const Kind Optional(
"&optional");
96 const Kind Priority(
"&priority");
97 const Kind RequiresTypeFeature(
"&requires-type-feature");
98 const Kind Static(
"&static");
107 const auto&
kind()
const {
return _kind; }
159 auto p = node::Properties{{
"tag", to_string(
kind())}};
187 :
Node(ctx, NodeTags, std::move(
children), std::move(m)), _kind(std::move(
kind)) {}
189 std::string
_dump()
const override;
191 HILTI_NODE_0(Attribute,
final);
194 attribute::Kind _kind;
201 auto attributes()
const {
return children<Attribute>(0, {}); }
238 static auto create(
ASTContext* ctx,
const Attributes& attrs = {}, Meta m = Meta()) {
250 :
Node(ctx, NodeTags, std::move(
children), std::move(m)) {}
259 std::string
_dump()
const override;
268 struct hash<hilti::attribute::Kind> {
Definition: ast-context.h:121
T * make(Args &&... args)
Definition: ast-context.h:366
Definition: attribute.h:104
static auto create(ASTContext *ctx, const attribute::Kind &kind, Expression *v, const Meta &m=Meta())
Definition: attribute.h:171
std::string _dump() const override
Definition: attribute.cc:80
Result< Expression * > valueAsExpression() const
Definition: attribute.cc:24
Node * value() const
Definition: attribute.h:117
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:181
const auto & kind() const
Definition: attribute.h:107
node::Properties properties() const final
Definition: attribute.h:158
Result< std::string > valueAsString() const
Definition: attribute.cc:34
auto hasValue() const
Definition: attribute.h:110
Definition: attribute.h:198
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:226
bool has(const attribute::Kind &kind) const
Definition: attribute.h:223
auto attributes() const
Definition: attribute.h:201
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:257
AttributeSet(ASTContext *ctx, Nodes children, Meta m=Meta())
Definition: attribute.h:249
Definition: expression.h:15
void setMeta(Meta m)
Definition: node.h:311
void addChild(ASTContext *ctx, Node *n)
Definition: node.h:497
const auto & location() const
Definition: node.h:308
const auto & children() const
Definition: node.h:363
const auto & meta() const
Definition: node.h:305
T * child(unsigned int i) const
Definition: node.h:373
virtual node::Properties properties() const
Definition: node.h:866
Definition: forward.h:758
Definition: attribute.h:30