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> 48 std::list<cxx::declaration::Type>
54 bool operator<(
const Join& other)
const {
55 return std::make_tuple(
id, priority, callee.id) < std::make_tuple(other.
id, other.
priority, other.
callee.id);
59 extern void to_json(nlohmann::json& j,
const Join& x);
60 extern void from_json(
const nlohmann::json& j,
Join& x);
67 Unit(
const std::shared_ptr<Context>& context);
70 cxx::ID moduleID()
const {
return _module_id; }
72 void setUsesGlobals() { _uses_globals =
true; }
80 void add(
const std::string& stmt,
const Meta& m =
Meta());
85 void prioritizeType(
const cxx::ID&
id) {
86 if ( std::find(_types_in_order.begin(), _types_in_order.end(),
id) == _types_in_order.end() )
87 _types_in_order.push_back(
id);
90 bool hasDeclarationFor(
const cxx::ID&
id);
91 std::optional<cxx::declaration::Type> lookupType(
const cxx::ID&
id)
const;
93 void addComment(
const std::string& comment);
94 void addInitialization(
cxx::Block block) { _init_module.appendFromBlock(std::move(block)); }
95 void addPreInitialization(
cxx::Block block) { _preinit_module.appendFromBlock(std::move(block)); }
101 void importDeclarations(
const Unit& other);
105 std::shared_ptr<Context> context()
const {
return _context.lock(); }
107 static std::pair<bool, std::optional<linker::MetaData>> readLinkerMetaData(std::istream& input);
111 Unit(
const std::shared_ptr<Context>& context,
cxx::ID module_id);
112 Unit(
const std::shared_ptr<Context>& context,
cxx::ID module_id,
const std::string& cxx_code);
115 void _generateCode(
Formatter& f,
bool prototypes_only);
117 void _addModuleInitFunction();
119 std::weak_ptr<Context> _context;
122 hilti::rt::filesystem::path _module_path;
123 bool _no_linker_meta_data =
false;
124 bool _uses_globals =
false;
126 std::optional<std::string> _cxx_code;
128 std::vector<std::string> _comments;
129 std::set<declaration::IncludeFile> _includes;
130 std::map<ID, declaration::Type> _types;
131 std::vector<ID> _types_in_order;
132 std::map<ID, declaration::Type> _types_forward;
133 std::map<ID, declaration::Global> _globals;
134 std::map<ID, declaration::Constant> _constants;
135 std::map<ID, declaration::Constant> _constants_forward;
136 std::multimap<ID, declaration::Function> _function_declarations;
137 std::multimap<ID, Function> _function_implementations;
138 std::vector<std::string> _statements;
139 std::set<linker::Join> _linker_joins;
140 std::set<std::string> _namespaces;
Definition: elements.h:275
Definition: elements.h:223
std::list< cxx::declaration::Type > aux_types
Definition: unit.h:49
Definition: elements.h:146
Definition: elements.h:112
Definition: elements.h:18
cxx::ID id
Definition: unit.h:46
cxx::declaration::Function callee
Definition: unit.h:47
Definition: reference.h:47
Definition: elements.h:162
Definition: elements.h:91
bool declare_only
Definition: unit.h:52
Definition: elements.h:299
Definition: elements.h:179
int64_t priority
Definition: unit.h:50