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, ID id, QualifiedType* type, Expressions args, hilti::Expression* init = nullptr,
50  Meta meta = {}) {
51  return ctx->make<LocalVariable>(ctx, node::flatten(type->recreateAsLhs(ctx), init, std::move(args)),
52  std::move(id), std::move(meta));
53  }
54 
55  static auto create(ASTContext* ctx, ID id, QualifiedType* type, hilti::Expression* init, Meta meta = {}) {
56  return create(ctx, std::move(id), type->recreateAsLhs(ctx), {}, init, std::move(meta));
57  }
58 
59  static auto create(ASTContext* ctx, ID id, QualifiedType* type, Meta meta = {}) {
60  return create(ctx, std::move(id), type->recreateAsLhs(ctx), {}, nullptr, std::move(meta));
61  }
62 
63  static auto create(ASTContext* ctx, ID id, hilti::Expression* init, const Meta& meta = {}) {
64  return create(ctx, std::move(id), QualifiedType::createAuto(ctx, meta), {}, init, meta);
65  }
66 
67  static auto create(ASTContext* ctx, ID id, const Meta& meta = {}) {
68  return create(ctx, std::move(id), QualifiedType::createAuto(ctx, meta), meta);
69  }
70 
71 protected:
72  LocalVariable(ASTContext* ctx, Nodes children, ID id, Meta meta)
73  : Declaration(ctx, NodeTags, std::move(children), std::move(id), declaration::Linkage::Private,
74  std::move(meta)) {}
75 
76  HILTI_NODE_1(declaration::LocalVariable, Declaration, final);
77 };
78 
79 } // 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
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: local-variable.h:32
std::string_view displayName() const final
Definition: local-variable.h:47
void init()
Definition: init.cc:21