Spicy
global-variable.h
1 // Copyright (c) 2020-now by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <memory>
6 #include <string>
7 #include <utility>
8 
9 #include <hilti/ast/declaration.h>
10 #include <hilti/ast/declarations/expression.h>
11 #include <hilti/ast/expression.h>
12 #include <hilti/ast/type.h>
13 
14 namespace hilti::declaration {
15 
17 class GlobalVariable : public Declaration {
18 public:
19  auto type() const { return child<QualifiedType>(0); }
20  auto init() const { return child<hilti::Expression>(1); }
21  auto typeArguments() const { return children<hilti::Expression>(2, {}); }
22 
23  void setType(ASTContext* ctx, QualifiedType* t) { setChild(ctx, 0, t->recreateAsLhs(ctx)); }
24  void setInit(ASTContext* ctx, hilti::Expression* init) { setChild(ctx, 1, init); }
25 
26  void setTypeArguments(ASTContext* ctx, Expressions args) {
27  removeChildren(2, {});
28  addChildren(ctx, std::move(args));
29  }
30 
31  std::string_view displayName() const final { return "global variable"; }
32 
33  static auto create(ASTContext* ctx, ID id, QualifiedType* type, Expressions args, hilti::Expression* init = nullptr,
34  declaration::Linkage linkage = Linkage::Private, Meta meta = {}) {
35  return ctx->make<GlobalVariable>(ctx, node::flatten(type->recreateAsLhs(ctx), init, std::move(args)),
36  std::move(id), linkage, std::move(meta));
37  }
38 
39  static auto create(ASTContext* ctx, ID id, QualifiedType* type, hilti::Expression* init = nullptr,
40  declaration::Linkage linkage = Linkage::Private, Meta meta = {}) {
41  return create(ctx, std::move(id), type->recreateAsLhs(ctx), {}, init, linkage, std::move(meta));
42  }
43 
44  static auto create(ASTContext* ctx, ID id, QualifiedType* type, declaration::Linkage linkage = Linkage::Private,
45  Meta meta = {}) {
46  return create(ctx, std::move(id), type->recreateAsLhs(ctx), {}, nullptr, linkage, std::move(meta));
47  }
48 
49  static auto create(ASTContext* ctx, ID id, hilti::Expression* init, declaration::Linkage linkage = Linkage::Private,
50  const Meta& meta = {}) {
51  return create(ctx, std::move(id), QualifiedType::createAuto(ctx, meta), {}, init, linkage, meta);
52  }
53 
54  static auto create(ASTContext* ctx, ID id, declaration::Linkage linkage = Linkage::Private, const Meta& meta = {}) {
55  return create(ctx, std::move(id), QualifiedType::createAuto(ctx, meta), linkage, meta);
56  }
57 
58 protected:
59  GlobalVariable(ASTContext* ctx, Nodes children, ID id, declaration::Linkage linkage, Meta meta)
60  : Declaration(ctx, NodeTags, std::move(children), std::move(id), linkage, std::move(meta)) {}
61 
62  HILTI_NODE_1(declaration::GlobalVariable, Declaration, final);
63 };
64 
65 } // namespace hilti::declaration
Definition: ast-context.h:121
T * make(Args &&... args)
Definition: ast-context.h:366
Definition: declaration.h:48
const auto & id() const
Definition: declaration.h:53
auto linkage() const
Definition: declaration.h:56
Definition: expression.h:15
Definition: id.h:15
Definition: meta.h:30
void setChild(ASTContext *ctx, size_t idx, Node *n)
Definition: node.h:602
const auto & children() const
Definition: node.h:364
const auto & meta() const
Definition: node.h:306
void removeChildren(int begin, std::optional< int > end)
Definition: node.h:575
void addChildren(ASTContext *ctx, const Nodes &children)
Definition: node.h:545
Definition: type.h:362
auto recreateAsLhs(ASTContext *ctx) const
Definition: type.h:496
static QualifiedType * createAuto(ASTContext *ctx, const Meta &m=Meta())
Definition: type.cc:121
Definition: global-variable.h:17
std::string_view displayName() const final
Definition: global-variable.h:31
void init()
Definition: init.cc:21