Spicy
local-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 
32 class LocalVariable : public Declaration {
33 public:
34  auto type() const { return child<QualifiedType>(0); }
35  auto init() const { return child<hilti::Expression>(1); }
36 
37  auto typeArguments() const { return children<hilti::Expression>(2, {}); }
38 
39  void setType(ASTContext* ctx, QualifiedType* t) { setChild(ctx, 0, t->recreateAsLhs(ctx)); }
40  void setInit(ASTContext* ctx, hilti::Expression* init) { setChild(ctx, 1, init); }
41 
42  void setTypeArguments(ASTContext* ctx, Expressions args) {
43  removeChildren(2, {});
44  addChildren(ctx, std::move(args));
45  }
46 
47  std::string_view displayName() const final { return "local variable"; }
48 
49  static auto create(ASTContext* ctx,
50  ID id,
51  QualifiedType* type,
52  Expressions args,
53  hilti::Expression* init = nullptr,
54  Meta meta = {}) {
55  return ctx->make<LocalVariable>(ctx,
56  node::flatten(type->recreateAsLhs(ctx), init, std::move(args)),
57  std::move(id),
58  std::move(meta));
59  }
60 
61  static auto create(ASTContext* ctx, ID id, QualifiedType* type, hilti::Expression* init, Meta meta = {}) {
62  return create(ctx, std::move(id), type->recreateAsLhs(ctx), {}, init, std::move(meta));
63  }
64 
65  static auto create(ASTContext* ctx, ID id, QualifiedType* type, Meta meta = {}) {
66  return create(ctx, std::move(id), type->recreateAsLhs(ctx), {}, nullptr, std::move(meta));
67  }
68 
69  static auto create(ASTContext* ctx, ID id, hilti::Expression* init, const Meta& meta = {}) {
70  return create(ctx, std::move(id), QualifiedType::createAuto(ctx, meta), {}, init, meta);
71  }
72 
73  static auto create(ASTContext* ctx, ID id, const Meta& meta = {}) {
74  return create(ctx, std::move(id), QualifiedType::createAuto(ctx, meta), meta);
75  }
76 
77 protected:
78  LocalVariable(ASTContext* ctx, Nodes children, ID id, Meta meta)
79  : Declaration(ctx,
80  NodeTags,
81  std::move(children),
82  std::move(id),
83  declaration::Linkage::Private,
84  std::move(meta)) {}
85 
86  HILTI_NODE_1(declaration::LocalVariable, Declaration, final);
87 };
88 
89 } // namespace hilti::declaration
Definition: ast-context.h:128
T * make(Args &&... args)
Definition: ast-context.h:382
Definition: declaration.h:53
const auto & id() const
Definition: declaration.h:58
Definition: expression.h:15
Definition: id.h:15
Definition: meta.h:30
void setChild(ASTContext *ctx, size_t idx, Node *n)
Definition: node.h:631
const auto & children() const
Definition: node.h:382
const auto & meta() const
Definition: node.h:324
void removeChildren(int begin, std::optional< int > end)
Definition: node.h:604
void addChildren(ASTContext *ctx, const Nodes &children)
Definition: node.h:574
Definition: type.h:365
auto recreateAsLhs(ASTContext *ctx) const
Definition: type.h:508
static QualifiedType * createAuto(ASTContext *ctx, const Meta &m=Meta())
Definition: type.cc:134
Definition: local-variable.h:32
std::string_view displayName() const final
Definition: local-variable.h:47
void init()
Definition: init.cc:21