15 #include <hilti/rt/filesystem.h> 16 #include <hilti/rt/json-fwd.h> 17 #include <hilti/rt/types/reference.h> 19 #include <hilti/ast/ctor.h> 20 #include <hilti/ast/expression.h> 21 #include <hilti/ast/module.h> 22 #include <hilti/ast/operator.h> 23 #include <hilti/ast/statement.h> 24 #include <hilti/ast/type.h> 25 #include <hilti/ast/types/function.h> 26 #include <hilti/base/result.h> 27 #include <hilti/compiler/context.h> 28 #include <hilti/compiler/detail/cxx/elements.h> 29 #include <hilti/compiler/detail/cxx/formatter.h> 51 std::list<cxx::declaration::Type>
57 bool operator<(
const Join& other)
const {
58 return std::make_tuple(
id, priority, callee.id) < std::make_tuple(other.
id, other.
priority, other.
callee.id);
62 extern void to_json(nlohmann::json& j,
const Join& x);
63 extern void from_json(
const nlohmann::json& j,
Join& x);
70 Unit(std::shared_ptr<Context> context);
73 cxx::ID moduleID()
const {
return _module_id; }
75 void setUsesGlobals() { _uses_globals =
true; }
83 void add(
const std::string& stmt,
const Meta& m =
Meta());
88 void prioritizeType(
const cxx::ID&
id) {
89 if ( std::find(_types_in_order.begin(), _types_in_order.end(),
id) == _types_in_order.end() )
90 _types_in_order.push_back(
id);
93 bool hasDeclarationFor(
const cxx::ID&
id);
94 std::optional<cxx::declaration::Type> lookupType(
const cxx::ID&
id)
const;
96 void addComment(
const std::string& comment);
97 void addInitialization(
cxx::Block block) { _init_module.appendFromBlock(std::move(block)); }
98 void addPreInitialization(
cxx::Block block) { _preinit_module.appendFromBlock(std::move(block)); }
104 void importDeclarations(
const Unit& other);
108 std::shared_ptr<Context> context()
const {
return _context; }
110 static std::pair<bool, std::optional<linker::MetaData>> readLinkerMetaData(std::istream& input);
114 Unit(std::shared_ptr<Context> context,
cxx::ID module_id);
115 Unit(std::shared_ptr<Context> context,
cxx::ID module_id,
const std::string& cxx_code);
118 void _generateCode(
Formatter& f,
bool prototypes_only);
120 void _addModuleInitFunction();
122 std::shared_ptr<Context> _context;
125 hilti::rt::filesystem::path _module_path;
126 bool _no_linker_meta_data =
false;
127 bool _uses_globals =
false;
129 std::optional<std::string> _cxx_code;
131 std::vector<std::string> _comments;
132 std::set<declaration::IncludeFile> _includes;
133 std::map<ID, declaration::Type> _types;
134 std::vector<ID> _types_in_order;
135 std::map<ID, declaration::Type> _types_forward;
136 std::map<ID, declaration::Global> _globals;
137 std::map<ID, declaration::Constant> _constants;
138 std::map<ID, declaration::Constant> _constants_forward;
139 std::multimap<ID, declaration::Function> _function_declarations;
140 std::multimap<ID, Function> _function_implementations;
141 std::vector<std::string> _statements;
142 std::set<linker::Join> _linker_joins;
143 std::set<std::string> _namespaces;
Definition: elements.h:229
Definition: elements.h:177
std::list< cxx::declaration::Type > aux_types
Definition: unit.h:52
Definition: elements.h:109
Definition: elements.h:87
cxx::ID id
Definition: unit.h:49
cxx::declaration::Function callee
Definition: unit.h:50
Definition: reference.h:47
Definition: elements.h:125
Definition: elements.h:66
bool declare_only
Definition: unit.h:55
Definition: elements.h:253
Definition: elements.h:142
int64_t priority
Definition: unit.h:53