Spicy
keyword.h
1 // Copyright (c) 2020-2021 by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <ostream>
6 #include <utility>
7 
8 #include <hilti/ast/declaration.h>
9 #include <hilti/ast/declarations/expression.h>
10 #include <hilti/ast/expression.h>
11 #include <hilti/ast/types/auto.h>
12 #include <hilti/ast/types/unknown.h>
13 #include <hilti/base/util.h>
14 
15 namespace hilti {
16 namespace expression {
17 
18 namespace keyword {
19 // Type of a reserved keyword
20 enum class Kind {
21  Self,
22  DollarDollar,
23  Captures
24 };
25 
26 namespace detail {
27 constexpr util::enum_::Value<Kind> kinds[] = {{Kind::Self, "self"}, {Kind::DollarDollar, "$$"}, {Kind::Captures, "$@"}};
28 } // namespace detail
29 
30 namespace kind {
31 constexpr auto from_string(const std::string_view& s) { return util::enum_::from_string<Kind>(s, detail::kinds); }
32 } // namespace kind
33 
34 constexpr auto to_string(Kind m) { return util::enum_::to_string(m, detail::kinds); }
35 
36 } // namespace keyword
37 
40 public:
41  Keyword(keyword::Kind kind, Meta m = Meta()) : NodeBase(nodes(type::auto_), std::move(m)), _kind(kind) {}
42  Keyword(keyword::Kind kind, Type t, Meta m = Meta()) : NodeBase(nodes(std::move(t)), std::move(m)), _kind(kind) {}
43 
44  keyword::Kind kind() const { return _kind; }
45 
46  bool operator==(const Keyword& other) const { return _kind == other._kind && type() == other.type(); }
47 
49  bool isLhs() const { return true; }
51  bool isTemporary() const { return false; }
53  const Type& type() const { return childs()[0].as<Type>(); }
54 
56  auto isConstant() const { return false; }
58  auto isEqual(const Expression& other) const { return node::isEqual(this, other); }
59 
61  auto properties() const { return node::Properties{{"kind", to_string(_kind)}}; }
62 
65  Expression kw = hilti::expression::Keyword(hilti::expression::keyword::Kind::DollarDollar,
66  hilti::type::pruneWalk(std::move(t)));
67  return hilti::declaration::Expression("__dd", std::move(kw), hilti::declaration::Linkage::Private);
68  }
69 
70 private:
71  keyword::Kind _kind;
72 };
73 
74 inline std::ostream& operator<<(std::ostream& stream, const Keyword& keyword) {
75  switch ( keyword.kind() ) {
76  case keyword::Kind::Self: return stream << "<self>";
77  case keyword::Kind::DollarDollar: return stream << "<$$>";
78  case keyword::Kind::Captures: return stream << "<captures>";
79  }
80 
81  return stream;
82 }
83 
84 } // namespace expression
85 } // namespace hilti
auto isConstant() const
Definition: keyword.h:56
Definition: declaration.h:53
Definition: keyword.h:39
bool isLhs() const
Definition: keyword.h:49
Definition: expression.h:17
static Declaration createDollarDollarDeclaration(Type t)
Definition: keyword.h:64
Definition: meta.h:18
auto isEqual(const Expression &other) const
Definition: keyword.h:58
Definition: type.h:159
Definition: expression.h:17
std::map< std::string, node::detail::PropertyValue > Properties
Definition: node.h:99
bool isTemporary() const
Definition: keyword.h:51
const Type & type() const
Definition: keyword.h:53
auto properties() const
Definition: keyword.h:61
Definition: node.h:358