Spicy
name.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/ast-context.h>
10 #include <hilti/ast/declaration.h>
11 #include <hilti/ast/expression.h>
12 #include <hilti/ast/id.h>
13 #include <hilti/ast/type.h>
14 
15 namespace hilti::expression {
16 
18 class Name : public Expression {
19 public:
21  const auto& id() const { return _id; }
22 
24  const auto& fullyQualifiedID() const { return _fqid; }
25 
28  if ( ! _resolved_declaration_index )
29  return nullptr;
30 
31  return context()->lookup(_resolved_declaration_index);
32  }
33 
35  auto resolvedDeclarationIndex() const { return _resolved_declaration_index; }
36 
43  QualifiedType* type() const final;
44 
51  void setResolvedDeclarationIndex(ASTContext* ctx, ast::DeclarationIndex index);
52 
58  if ( ! _resolved_declaration_index )
59  return;
60 
61  _resolved_declaration_index = ast::DeclarationIndex::None;
62 
63  clearChildren();
65  }
66 
68  void setID(ID id) { _id = std::move(id); }
69 
71  void setFullyQualifiedID(ID id) { _fqid = std::move(id); }
72 
73  node::Properties properties() const final;
74 
75  static auto create(ASTContext* ctx, const hilti::ID& id, const Meta& meta = {}) {
76  return ctx->make<Name>(ctx, {QualifiedType::createAuto(ctx, meta)}, id, meta);
77  }
78 
79 protected:
80  Name(ASTContext* ctx, Nodes children, hilti::ID id, Meta meta)
81  : Expression(ctx, NodeTags, std::move(children), std::move(meta)), _id(std::move(id)), _context(ctx) {}
82 
83  ASTContext* context() const { return _context; }
84 
85  HILTI_NODE_1(expression::Name, Expression, final);
86 
87 private:
88  hilti::ID _id;
89  hilti::ID _fqid;
90  ast::DeclarationIndex _resolved_declaration_index;
91 
92  ASTContext* _context;
93 };
94 
95 } // namespace hilti::expression
Definition: ast-context.h:121
Declaration * lookup(ast::DeclarationIndex index)
Definition: ast-context.cc:462
Definition: declaration.h:48
Definition: expression.h:15
Definition: id.h:15
Definition: meta.h:30
void addChild(ASTContext *ctx, Node *n)
Definition: node.h:522
const auto & children() const
Definition: node.h:364
const auto & meta() const
Definition: node.h:306
void clearChildren()
Definition: node.cc:131
Definition: type.h:362
static QualifiedType * createAuto(ASTContext *ctx, const Meta &m=Meta())
Definition: type.cc:121
static const ContextIndex None
Definition: ast-context.h:84
Definition: name.h:18
auto resolvedDeclarationIndex() const
Definition: name.h:35
void clearResolvedDeclarationIndex(ASTContext *ctx)
Definition: name.h:57
void setID(ID id)
Definition: name.h:68
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:21
node::Properties properties() const final
Definition: name.cc:54
const auto & fullyQualifiedID() const
Definition: name.h:24
void setFullyQualifiedID(ID id)
Definition: name.h:71
Declaration * resolvedDeclaration()
Definition: name.h:27