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.generic_string()},
99  {"ext", _uid.process_extension.generic_string()},
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  static auto create(ASTContext* ctx,
107  const declaration::module::UID& uid,
108  const ID& scope,
109  const Declarations& decls,
110  const Statements& stmts,
111  Meta meta = {}) {
112  Nodes nodes = {statement::Block::create(ctx, stmts, meta)};
113  for ( auto* d : decls )
114  nodes.push_back(d);
115 
116  return ctx->make<Module>(ctx, std::move(nodes), uid, scope, std::move(meta));
117  }
118 
119  static auto create(ASTContext* ctx, const declaration::module::UID& uid, const ID& scope = {}, Meta meta = {}) {
120  return create(ctx, uid, scope, {}, {}, std::move(meta));
121  }
122 
123  static auto create(ASTContext* ctx,
124  const declaration::module::UID& uid,
125  const ID& scope,
126  const Declarations& decls,
127  Meta meta = {}) {
128  return create(ctx, uid, scope, decls, {}, std::move(meta));
129  }
130 
131 protected:
132  Module(ASTContext* ctx, Nodes children, declaration::module::UID uid, ID scope, Meta meta = {})
133  : Declaration(ctx, NodeTags, std::move(children), uid.id, declaration::Linkage::Public, std::move(meta)),
134  _uid(std::move(uid)),
135  _scope_path(std::move(scope)) {}
136 
137  std::string _dump() const override;
138 
139  HILTI_NODE_1(declaration::Module, Declaration, final);
140 
141 private:
142  declaration::module::UID _uid;
143  ID _scope_path;
144  std::set<declaration::module::UID> _dependencies;
145  bool _skip_implementation = true;
146  std::shared_ptr<::hilti::detail::cxx::Unit> _cxx_unit;
147 };
148 
149 } // namespace declaration
150 } // namespace hilti
Definition: ast-context.h:128
T * make(Args &&... args)
Definition: ast-context.h:382
Definition: declaration.h:53
node::Properties properties() const override
Definition: declaration.h:126
Definition: id.h:15
Definition: meta.h:30
void addChild(ASTContext *ctx, Node *n)
Definition: node.h:551
auto scope() const
Definition: node.h:336
const auto & children() const
Definition: node.h:382
const auto & meta() const
Definition: node.h:324
Definition: forward.h:757
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
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