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::expression {
16 
17 namespace keyword {
18 // Type of a reserved keyword
19 enum class Kind {
20  Self,
21  DollarDollar,
22  Captures
23 };
24 
25 namespace detail {
26 constexpr util::enum_::Value<Kind> kinds[] = {{Kind::Self, "self"}, {Kind::DollarDollar, "$$"}, {Kind::Captures, "$@"}};
27 } // namespace detail
28 
29 namespace kind {
30 constexpr auto from_string(const std::string_view& s) { return util::enum_::from_string<Kind>(s, detail::kinds); }
31 } // namespace kind
32 
33 constexpr auto to_string(Kind m) { return util::enum_::to_string(m, detail::kinds); }
34 
35 } // namespace keyword
36 
39 public:
40  Keyword(keyword::Kind kind, Meta m = Meta()) : NodeBase(nodes(type::auto_), std::move(m)), _kind(kind) {}
41  Keyword(keyword::Kind kind, Type t, Meta m = Meta()) : NodeBase(nodes(std::move(t)), std::move(m)), _kind(kind) {}
42 
43  keyword::Kind kind() const { return _kind; }
44 
45  bool operator==(const Keyword& other) const { return _kind == other._kind && type() == other.type(); }
46 
48  bool isLhs() const { return true; }
50  bool isTemporary() const { return false; }
52  const Type& type() const { return children()[0].as<Type>(); }
53 
55  auto isConstant() const { return false; }
57  auto isEqual(const Expression& other) const { return node::isEqual(this, other); }
58 
60  auto properties() const { return node::Properties{{"kind", to_string(_kind)}}; }
61 
64  Expression kw = hilti::expression::Keyword(hilti::expression::keyword::Kind::DollarDollar,
65  hilti::type::pruneWalk(std::move(t)));
66  return hilti::declaration::Expression("__dd", std::move(kw), hilti::declaration::Linkage::Private);
67  }
68 
69 private:
70  keyword::Kind _kind;
71 };
72 
73 inline std::ostream& operator<<(std::ostream& stream, const Keyword& keyword) {
74  switch ( keyword.kind() ) {
75  case keyword::Kind::Self: return stream << "<self>";
76  case keyword::Kind::DollarDollar: return stream << "<$$>";
77  case keyword::Kind::Captures: return stream << "<captures>";
78  }
79 
80  return stream;
81 }
82 
83 } // namespace hilti::expression
auto isConstant() const
Definition: keyword.h:55
Definition: declaration.h:53
Definition: keyword.h:38
bool isLhs() const
Definition: keyword.h:48
Definition: expression.h:18
static Declaration createDollarDollarDeclaration(Type t)
Definition: keyword.h:63
Definition: meta.h:19
auto isEqual(const Expression &other) const
Definition: keyword.h:57
Definition: type.h:160
Definition: expression.h:16
std::map< std::string, node::detail::PropertyValue > Properties
Definition: node.h:97
bool isTemporary() const
Definition: keyword.h:50
const Type & type() const
Definition: keyword.h:52
auto properties() const
Definition: keyword.h:60
Definition: node.h:359
Definition: expression.h:21