Spicy
declaration.h
1 // Copyright (c) 2020-now by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <string>
6 #include <utility>
7 
8 #include <hilti/ast/ast-context.h>
9 #include <hilti/ast/forward.h>
10 #include <hilti/ast/id.h>
11 #include <hilti/ast/node.h>
12 
13 namespace hilti {
14 
15 namespace declaration {
16 
18 enum class Linkage {
19  Init,
20  PreInit,
21  Struct,
22  Private,
23  Public,
24 };
25 
26 namespace detail {
27 constexpr util::enum_::Value<Linkage> Linkages[] = {
28  {Linkage::Struct, "struct"}, {Linkage::Public, "public"}, {Linkage::Private, "private"},
29  {Linkage::Init, "init"}, {Linkage::PreInit, "preinit"},
30 };
31 } // namespace detail
32 
34 constexpr auto to_string(Linkage f) { return util::enum_::to_string(f, detail::Linkages); }
35 
36 namespace linkage {
42 constexpr auto from_string(std::string_view s) { return util::enum_::from_string<Linkage>(s, detail::Linkages); }
43 } // namespace linkage
44 } // namespace declaration
45 
47 class Declaration : public Node, public node::WithDocString {
48 public:
49  ~Declaration() override;
50 
52  const auto& id() const { return _id; }
53 
55  auto linkage() const { return _linkage; }
56 
62  const auto& fullyQualifiedID() const { return _fqid; }
63 
71  const auto& canonicalID() const { return _canonical_id; }
72 
77  auto declarationIndex() const { return _declaration_index; }
78 
83  void setID(const ID& id) {
84  _id = id;
85  _fqid = {}, _canonical_id = {};
86  }
87 
89  void setLinkage(declaration::Linkage linkage) { _linkage = linkage; }
90 
97  void setFullyQualifiedID(ID id) { _fqid = std::move(id); }
98 
105  void setCanonicalID(ID id) { _canonical_id = std::move(id); }
106 
112  virtual std::string_view displayName() const = 0;
113 
115  node::Properties properties() const override {
116  auto p = node::Properties{{"id", _id},
117  {"linkage", declaration::to_string(_linkage)},
118  {"declaration", to_string(_declaration_index)},
119  {"fqid", _fqid},
120  {"canonical-id", _canonical_id}};
121 
122  return Node::properties() + std::move(p);
123  }
124 
125  Declaration(const Declaration& other) : Node(other), node::WithDocString(other) {
126  _id = other._id;
127  _linkage = other._linkage;
128  // Do not copy computed state, we'll want to recompute that eventually.
129  }
130 
131  Declaration(Declaration&& other) = default;
132 
133  Declaration& operator=(const Declaration& other) = delete;
134  Declaration& operator=(Declaration&& other) = delete;
135 
136 protected:
137  friend class ASTContext;
138 
139  Declaration(ASTContext* ctx, node::Tags node_tags, Nodes children, ID id, declaration::Linkage linkage,
140  Meta meta = {})
141  : Node(ctx, node_tags, std::move(children), std::move(meta)), _id(std::move(id)), _linkage(linkage) {}
142 
143  // For the AST context to set the declaration index.
144  void setDeclarationIndex(ast::DeclarationIndex index) {
145  assert(index);
146  _declaration_index = index;
147  }
148 
149  std::string _dump() const override;
150 
151  HILTI_NODE_0(Declaration, override);
152 
153 private:
154  ID _id;
155  declaration::Linkage _linkage;
156 
157  ast::DeclarationIndex _declaration_index; // index registered by the context
158  ID _fqid; // computed during AST processing
159  ID _canonical_id; // computed during AST processing
160 };
161 
162 } // namespace hilti
Definition: declaration.h:47
void setLinkage(declaration::Linkage linkage)
Definition: declaration.h:89
const auto & canonicalID() const
Definition: declaration.h:71
void setCanonicalID(ID id)
Definition: declaration.h:105
auto declarationIndex() const
Definition: declaration.h:77
node::Properties properties() const override
Definition: declaration.h:115
void setID(const ID &id)
Definition: declaration.h:83
void setFullyQualifiedID(ID id)
Definition: declaration.h:97
const auto & fullyQualifiedID() const
Definition: declaration.h:62
const auto & id() const
Definition: declaration.h:52
std::string _dump() const override
Definition: declaration.cc:10
virtual std::string_view displayName() const =0
auto linkage() const
Definition: declaration.h:55
Definition: id.h:15
Definition: node.h:239
const auto & children() const
Definition: node.h:363
const auto & meta() const
Definition: node.h:305
Node(ASTContext *ctx, node::Tags node_tags, Nodes children, Meta meta)
Definition: node.h:897
virtual node::Properties properties() const
Definition: node.h:866
Definition: node.h:1082