Spicy
constant.h
1 // Copyright (c) 2020-now by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <sys/types.h>
6 
7 #include <memory>
8 #include <string>
9 #include <utility>
10 
11 #include <hilti/ast/declaration.h>
12 #include <hilti/ast/expression.h>
13 #include <hilti/ast/type.h>
14 
15 namespace hilti::declaration {
16 
18 class Constant : public Declaration {
19 public:
20  auto value() const { return child<hilti::Expression>(1); }
21 
22  QualifiedType* type() const {
23  if ( auto* t = child<QualifiedType>(0) )
24  return t;
25  else
26  return value()->type();
27  }
28 
29  std::string_view displayName() const final { return "constant"; }
30 
31  void setValue(ASTContext* ctx, hilti::Expression* e) { setChild(ctx, 1, e); }
32 
33  static auto create(ASTContext* ctx, ID id, QualifiedType* type, hilti::Expression* value,
34  declaration::Linkage linkage = Linkage::Private, Meta meta = {}) {
35  QualifiedType* t = type;
36 
37  if ( t )
38  t = t->recreateAsConst(ctx);
39 
40  return ctx->make<Constant>(ctx, {t, value}, std::move(id), linkage, std::move(meta));
41  }
42 
43  static auto create(ASTContext* ctx, ID id, hilti::Expression* value,
44  declaration::Linkage linkage = Linkage::Private, Meta meta = {}) {
45  return create(ctx, std::move(id), {}, value, linkage, std::move(meta));
46  }
47 
48 protected:
49  Constant(ASTContext* ctx, Nodes children, ID id, declaration::Linkage linkage, Meta meta)
50  : Declaration(ctx, NodeTags, std::move(children), std::move(id), linkage, std::move(meta)) {
51  assert(! child(0) || child(0)->as<QualifiedType>()->isConstant());
52  }
53 
54  HILTI_NODE_1(declaration::Constant, Declaration, final);
55 };
56 
57 } // 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
T * child(unsigned int i) const
Definition: node.h:374
Definition: type.h:362
auto recreateAsConst(ASTContext *ctx) const
Definition: type.h:504
Definition: constant.h:18
std::string_view displayName() const final
Definition: constant.h:29