Spicy
module.h
1 // Copyright (c) 2020-now by the Zeek Project. See LICENSE for details.
2 
3 #pragma once
4 
5 #include <memory>
6 #include <set>
7 #include <string>
8 #include <utility>
9 #include <vector>
10 
11 #include <hilti/rt/util.h>
12 
13 #include <hilti/ast/declaration.h>
14 #include <hilti/ast/declarations/module-uid.h>
15 #include <hilti/ast/declarations/property.h>
16 #include <hilti/ast/forward.h>
17 #include <hilti/ast/node.h>
18 #include <hilti/ast/statements/block.h>
19 
20 namespace hilti {
21 
22 namespace detail::cxx {
23 class Unit;
24 }
25 
26 namespace declaration {
27 
29 class Module : public Declaration {
30 public:
31  const auto& uid() const { return _uid; }
32  const auto& id() const { return _uid.unique; }
33  const auto& scopeID() const { return _uid.id; }
34  const auto& scopePath() const { return _scope_path; }
35  auto statements() const { return child<statement::Block>(0); }
36  auto declarations() const { return childrenOfType<Declaration>(); }
37  const auto& dependencies() const { return _dependencies; }
38 
39  bool isEmpty() const {
40  // We always have a block as children.
41  return children().size() <= 1 && statements()->statements().empty();
42  }
43 
45  bool skipImplementation() const { return _skip_implementation; }
46 
48  void setSkipImplementation(bool skip_implementation) { _skip_implementation = skip_implementation; }
49 
50  auto cxxUnit() const { return _cxx_unit; }
51  void setCxxUnit(std::shared_ptr<::hilti::detail::cxx::Unit> unit) { _cxx_unit = std::move(unit); }
52 
57  void clear();
58 
66  Property* moduleProperty(const ID& id) const;
67 
74  hilti::node::Set<declaration::Property> moduleProperties(const ID& id) const;
75 
80  void add(ASTContext* ctx, Declaration* d) { addChild(ctx, d); }
81 
87  void add(ASTContext* ctx, Statement* s) { child<statement::Block>(0)->add(ctx, s); }
88 
89  void addDependency(declaration::module::UID uid) { _dependencies.insert(std::move(uid)); }
90  void clearDependencies() { _dependencies.clear(); }
91  void setScopePath(const ID& scope) { _scope_path = scope; }
92  void setUID(declaration::module::UID uid) { _uid = std::move(uid); }
93 
94  std::string_view displayName() const final { return "module"; }
95 
96  node::Properties properties() const override {
97  auto p = node::Properties{{"id", _uid.id},
98  {"path", _uid.path.native()},
99  {"ext", _uid.process_extension.native()},
100  {"scope", _scope_path},
101  {"dependencies", util::join(_dependencies, ", ")},
102  {"skip-implementation", _skip_implementation}};
103  return hilti::Declaration::properties() + std::move(p);
104  }
105 
106  std::string_view branchTag() const final { return _uid.process_extension.native(); }
107 
108  static auto create(ASTContext* ctx, const declaration::module::UID& uid, const ID& scope, const Declarations& decls,
109  const Statements& stmts, Meta meta = {}) {
110  Nodes nodes = {statement::Block::create(ctx, stmts, meta)};
111  for ( auto* d : decls )
112  nodes.push_back(d);
113 
114  return ctx->make<Module>(ctx, std::move(nodes), uid, scope, std::move(meta));
115  }
116 
117  static auto create(ASTContext* ctx, const declaration::module::UID& uid, const ID& scope = {}, Meta meta = {}) {
118  return create(ctx, uid, scope, {}, {}, std::move(meta));
119  }
120 
121  static auto create(ASTContext* ctx, const declaration::module::UID& uid, const ID& scope, const Declarations& decls,
122  Meta meta = {}) {
123  return create(ctx, uid, scope, decls, {}, std::move(meta));
124  }
125 
126 protected:
127  Module(ASTContext* ctx, Nodes children, declaration::module::UID uid, ID scope, Meta meta = {})
128  : Declaration(ctx, NodeTags, std::move(children), uid.id, declaration::Linkage::Public, std::move(meta)),
129  _uid(std::move(uid)),
130  _scope_path(std::move(scope)) {}
131 
132  std::string _dump() const override;
133 
134  HILTI_NODE_1(declaration::Module, Declaration, final);
135 
136 private:
137  declaration::module::UID _uid;
138  ID _scope_path;
139  std::set<declaration::module::UID> _dependencies;
140  bool _skip_implementation = true;
141  std::shared_ptr<::hilti::detail::cxx::Unit> _cxx_unit;
142 };
143 
144 } // namespace declaration
145 } // namespace hilti
Definition: ast-context.h:121
T * make(Args &&... args)
Definition: ast-context.h:366
Definition: declaration.h:48
node::Properties properties() const override
Definition: declaration.h:116
Definition: id.h:15
Definition: meta.h:30
void addChild(ASTContext *ctx, Node *n)
Definition: node.h:522
auto scope() const
Definition: node.h:318
const auto & children() const
Definition: node.h:364
const auto & meta() const
Definition: node.h:306
Definition: forward.h:758
Definition: statement.h:15
Definition: module.h:29
hilti::node::Set< declaration::Property > moduleProperties(const ID &id) const
Definition: module.cc:26
bool skipImplementation() const
Definition: module.h:45
void setSkipImplementation(bool skip_implementation)
Definition: module.h:48
std::string_view displayName() const final
Definition: module.h:94
node::Properties properties() const override
Definition: module.h:96
void add(ASTContext *ctx, Declaration *d)
Definition: module.h:80
void add(ASTContext *ctx, Statement *s)
Definition: module.h:87
Property * moduleProperty(const ID &id) const
Definition: module.cc:13
std::string _dump() const override
Definition: module.cc:11
std::string_view branchTag() const final
Definition: module.h:106
Definition: property.h:14
Definition: module-uid.h:20
hilti::rt::filesystem::path path
Definition: module-uid.h:24
hilti::rt::filesystem::path process_extension
Definition: module-uid.h:28
ID unique
Definition: module-uid.h:22
ID id
Definition: module-uid.h:21