10 #include <unordered_set> 14 #include <hilti/rt/filesystem.h> 16 #include <hilti/ast/id.h> 17 #include <hilti/ast/module.h> 18 #include <hilti/base/logger.h> 19 #include <hilti/base/result.h> 20 #include <hilti/base/util.h> 21 #include <hilti/compiler/context.h> 22 #include <hilti/compiler/detail/cxx/unit.h> 23 #include <hilti/compiler/jit.h> 38 using MetaData = detail::cxx::linker::MetaData;
72 const auto&
id()
const {
return _index.id; }
75 const auto&
path()
const {
return _index.path; }
83 const auto&
extension()
const {
return _extension; }
93 void setExtension(
const hilti::rt::filesystem::path& ext) { _extension = ext; }
95 enum ASTState { Modified, NotModified };
123 bool validateASTPre(
const Plugin& plugin);
131 bool validateASTPost(
const Plugin& plugin);
182 std::vector<std::weak_ptr<Unit>> dependencies(
bool recursive =
false)
const;
193 bool addDependency(
const std::shared_ptr<Unit>& unit);
202 return _cxx_unit->linkerMetaData();
219 bool requiresCompilation();
241 std::shared_ptr<Context>
context()
const {
return _context.lock(); }
260 const hilti::rt::filesystem::path& path,
261 std::optional<hilti::rt::filesystem::path> process_extension = {});
276 static std::shared_ptr<Unit> fromModule(
const std::shared_ptr<Context>& context,
hilti::Module module,
277 hilti::rt::filesystem::path extension);
295 const hilti::rt::filesystem::path& parse_extension,
296 const hilti::rt::filesystem::path& process_extension,
297 std::optional<ID> scope,
298 std::vector<hilti::rt::filesystem::path> search_dirs);
310 const hilti::rt::filesystem::path& extension);
321 const hilti::rt::filesystem::path& path);
332 const hilti::rt::filesystem::path& path =
"");
345 const std::vector<linker::MetaData>& mds);
363 static std::pair<bool, std::optional<linker::MetaData>> readLinkerMetaData(
364 std::istream& input,
const hilti::rt::filesystem::path& path =
"<input stream>");
369 Unit(std::shared_ptr<Context> context,
ID id, hilti::rt::filesystem::path path,
370 hilti::rt::filesystem::path extension,
Node&& module)
371 : _index(
id, util::normalizePath(path)),
372 _extension(extension),
373 _module(std::move(module)),
374 _context(std::move(context)) {}
376 Unit(std::shared_ptr<Context> context,
ID id, hilti::rt::filesystem::path path,
377 hilti::rt::filesystem::path extension, std::optional<detail::cxx::Unit> cxx_unit = {})
378 : _index(
id, util::normalizePath(path)),
379 _extension(extension),
380 _context(std::move(context)),
381 _cxx_unit(std::move(cxx_unit)) {}
389 bool _collectErrors();
392 void _destroyModule();
395 void _recursiveDependencies(std::vector<std::weak_ptr<Unit>>* dst, std::unordered_set<const Unit*>* seen)
const;
399 const hilti::rt::filesystem::path& path);
402 hilti::rt::filesystem::path _extension;
403 std::optional<Node> _module;
404 std::vector<std::weak_ptr<Unit>> _dependencies;
405 std::weak_ptr<Context> _context;
406 std::optional<detail::cxx::Unit> _cxx_unit;
407 bool _resolved =
false;
408 bool _requires_compilation =
false;
Definition: context.h:107
void setExtension(const hilti::rt::filesystem::path &ext)
Definition: unit.h:93
const Options & options() const
Definition: unit.h:244
bool isCompiledHILTI() const
Definition: unit.h:212
bool isResolved()
Definition: unit.h:230
const auto & id() const
Definition: unit.h:72
Node & module()
Definition: unit.h:60
void setRequiresCompilation()
Definition: unit.h:225
NodeRef moduleRef() const
Definition: unit.h:54
const auto & path() const
Definition: unit.h:75
Result< linker::MetaData > linkerMetaData() const
Definition: unit.h:200
const auto & cacheIndex()
Definition: unit.h:69
std::shared_ptr< Context > context() const
Definition: unit.h:241
Definition: node-ref.h:44
void clearDependencies()
Definition: unit.h:185
const auto & extension() const
Definition: unit.h:83
void setResolved(bool resolved)
Definition: unit.h:238