10 #include <unordered_map> 11 #include <unordered_set> 15 #include <hilti/rt/filesystem.h> 17 #include <hilti/ast/id.h> 18 #include <hilti/ast/module.h> 19 #include <hilti/base/logger.h> 20 #include <hilti/base/result.h> 21 #include <hilti/base/util.h> 22 #include <hilti/compiler/context.h> 23 #include <hilti/compiler/detail/cxx/unit.h> 24 #include <hilti/compiler/jit.h> 39 using MetaData = detail::cxx::linker::MetaData;
73 const auto&
id()
const {
return _index.id; }
88 const auto&
path()
const {
return _index.path; }
96 const auto&
extension()
const {
return _extension; }
106 void setExtension(
const hilti::rt::filesystem::path& ext) { _extension = ext; }
108 enum ASTState { Modified, NotModified };
136 bool validateASTPre(
const Plugin& plugin);
144 bool validateASTPost(
const Plugin& plugin);
195 std::vector<std::weak_ptr<Unit>> dependencies(
bool recursive =
false)
const;
206 bool addDependency(
const std::shared_ptr<Unit>& unit);
215 return _cxx_unit->linkerMetaData();
232 bool requiresCompilation();
254 std::shared_ptr<Context>
context()
const {
return _context.lock(); }
274 const hilti::rt::filesystem::path& path,
275 const std::optional<ID>& scope,
276 std::optional<hilti::rt::filesystem::path> process_extension = {});
291 static std::shared_ptr<Unit> fromModule(
const std::shared_ptr<Context>& context,
const hilti::Module& module,
292 hilti::rt::filesystem::path extension);
310 const hilti::rt::filesystem::path& parse_extension,
311 const hilti::rt::filesystem::path& process_extension,
312 std::optional<ID> scope,
313 std::vector<hilti::rt::filesystem::path> search_dirs);
325 const hilti::rt::filesystem::path& path,
326 const std::optional<ID>& scope);
337 const hilti::rt::filesystem::path& path =
"");
350 const std::vector<linker::MetaData>& mds);
368 static std::pair<bool, std::optional<linker::MetaData>> readLinkerMetaData(
369 std::istream& input,
const hilti::rt::filesystem::path& path =
"<input stream>");
374 Unit(
const std::shared_ptr<Context>& context,
const ID&
id,
const std::optional<ID>& scope,
375 const hilti::rt::filesystem::path& path, hilti::rt::filesystem::path extension,
Node&& module)
376 : _index(
id, scope, util::normalizePath(path)),
377 _unique_id(_makeUniqueID(
id)),
378 _extension(std::move(std::move(extension))),
379 _module(std::move(module)),
382 Unit(
const std::shared_ptr<Context>& context,
const ID&
id,
const std::optional<ID>& scope,
383 const hilti::rt::filesystem::path& path, hilti::rt::filesystem::path extension,
384 std::optional<detail::cxx::Unit> cxx_unit = {})
385 : _index(
id, scope, util::normalizePath(path)),
386 _unique_id(_makeUniqueID(
id)),
387 _extension(std::move(std::move(extension))),
389 _cxx_unit(std::move(cxx_unit)) {}
392 ID _makeUniqueID(
const ID&
id);
400 bool _collectErrors();
403 void _destroyModule();
406 void _recursiveDependencies(std::vector<std::weak_ptr<Unit>>* dst, std::unordered_set<const Unit*>* seen)
const;
410 const hilti::rt::filesystem::path& path);
414 hilti::rt::filesystem::path _extension;
415 std::optional<Node> _module;
416 std::vector<std::weak_ptr<Unit>> _dependencies;
417 std::weak_ptr<Context> _context;
418 std::optional<detail::cxx::Unit> _cxx_unit;
419 bool _resolved =
false;
420 bool _requires_compilation =
false;
422 static std::unordered_map<ID, unsigned int> _uid_cache;
Definition: context.h:107
void setExtension(const hilti::rt::filesystem::path &ext)
Definition: unit.h:106
ID uniqueID() const
Definition: unit.h:85
const Options & options() const
Definition: unit.h:257
bool isCompiledHILTI() const
Definition: unit.h:225
bool isResolved()
Definition: unit.h:243
const auto & id() const
Definition: unit.h:73
Node & module()
Definition: unit.h:61
void setRequiresCompilation()
Definition: unit.h:238
NodeRef moduleRef() const
Definition: unit.h:55
const auto & path() const
Definition: unit.h:88
Result< linker::MetaData > linkerMetaData() const
Definition: unit.h:213
const auto & cacheIndex() const
Definition: unit.h:70
std::shared_ptr< Context > context() const
Definition: unit.h:254
Definition: node-ref.h:45
void clearDependencies()
Definition: unit.h:198
const auto & extension() const
Definition: unit.h:96
void setResolved(bool resolved)
Definition: unit.h:251