11 #include <hilti/rt/util.h>
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>
22 namespace detail::cxx {
26 namespace declaration {
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; }
39 bool isEmpty()
const {
41 return children().size() <= 1 && statements()->statements().empty();
50 auto cxxUnit()
const {
return _cxx_unit; }
51 void setCxxUnit(std::shared_ptr<::hilti::detail::cxx::Unit> unit) { _cxx_unit = std::move(unit); }
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); }
94 std::string_view
displayName() const final {
return "module"; }
97 auto p = node::Properties{{
"id", _uid.
id},
98 {
"path", _uid.
path.native()},
100 {
"scope", _scope_path},
101 {
"dependencies", util::join(_dependencies,
", ")},
102 {
"skip-implementation", _skip_implementation}};
109 const Statements& stmts,
Meta meta = {}) {
110 Nodes nodes = {statement::Block::create(ctx, stmts,
meta)};
111 for (
auto* d : decls )
114 return ctx->
make<Module>(ctx, std::move(nodes), uid,
scope, std::move(
meta));
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));
121 static auto create(ASTContext* ctx,
const declaration::module::UID& uid,
const ID&
scope,
const Declarations& decls,
123 return create(ctx, uid,
scope, decls, {}, std::move(
meta));
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)) {}
132 std::string
_dump()
const override;
134 HILTI_NODE_1(declaration::Module, Declaration,
final);
137 declaration::module::UID _uid;
139 std::set<declaration::module::UID> _dependencies;
140 bool _skip_implementation =
true;
141 std::shared_ptr<::hilti::detail::cxx::Unit> _cxx_unit;
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
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
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