Spicy
name.h
1 // Copyright (c) 2020-now by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <utility>
6 
7 #include <hilti/ast/ast-context.h>
8 #include <hilti/ast/declaration.h>
9 #include <hilti/ast/expression.h>
10 #include <hilti/ast/id.h>
11 #include <hilti/ast/type.h>
12 
13 namespace hilti::expression {
14 
16 class Name : public Expression {
17 public:
19  const auto& id() const { return _id; }
20 
22  const auto& fullyQualifiedID() const { return _fqid; }
23 
26  if ( ! _resolved_declaration_index )
27  return nullptr;
28 
29  return context()->lookup(_resolved_declaration_index);
30  }
31 
33  auto resolvedDeclarationIndex() const { return _resolved_declaration_index; }
34 
41  QualifiedType* type() const final;
42 
49  void setResolvedDeclarationIndex(ASTContext* ctx, ast::DeclarationIndex index);
50 
56  if ( ! _resolved_declaration_index )
57  return;
58 
59  _resolved_declaration_index = ast::DeclarationIndex::None;
60 
61  clearChildren();
63  }
64 
66  void setID(ID id) { _id = std::move(id); }
67 
69  void setFullyQualifiedID(ID id) { _fqid = std::move(id); }
70 
71  node::Properties properties() const final;
72 
73  static auto create(ASTContext* ctx, const hilti::ID& id, const Meta& meta = {}) {
74  return ctx->make<Name>(ctx, {QualifiedType::createAuto(ctx, meta)}, id, meta);
75  }
76 
77 protected:
78  Name(ASTContext* ctx, Nodes children, hilti::ID id, Meta meta)
79  : Expression(ctx, NodeTags, std::move(children), std::move(meta)), _id(std::move(id)), _context(ctx) {}
80 
81  ASTContext* context() const { return _context; }
82 
83  HILTI_NODE_1(expression::Name, Expression, final);
84 
85 private:
86  hilti::ID _id;
87  hilti::ID _fqid;
88  ast::DeclarationIndex _resolved_declaration_index;
89 
90  ASTContext* _context;
91 };
92 
93 } // namespace hilti::expression
Definition: ast-context.h:128
Declaration * lookup(ast::DeclarationIndex index)
Definition: ast-context.cc:497
Definition: declaration.h:53
Definition: expression.h:15
Definition: id.h:15
Definition: meta.h:30
void addChild(ASTContext *ctx, Node *n)
Definition: node.h:551
const auto & children() const
Definition: node.h:382
const auto & meta() const
Definition: node.h:324
void clearChildren()
Definition: node.cc:141
Definition: type.h:365
static QualifiedType * createAuto(ASTContext *ctx, const Meta &m=Meta())
Definition: type.cc:134
static const ContextIndex None
Definition: ast-context.h:88
Definition: name.h:16
auto resolvedDeclarationIndex() const
Definition: name.h:33
void clearResolvedDeclarationIndex(ASTContext *ctx)
Definition: name.h:55
void setID(ID id)
Definition: name.h:66
void setResolvedDeclarationIndex(ASTContext *ctx, ast::DeclarationIndex index)
Definition: name.cc:39
QualifiedType * type() const final
Definition: name.cc:10
const auto & id() const
Definition: name.h:19
node::Properties properties() const final
Definition: name.cc:56
Declaration * resolvedDeclaration() const
Definition: name.h:25
const auto & fullyQualifiedID() const
Definition: name.h:22
void setFullyQualifiedID(ID id)
Definition: name.h:69