9 #include <unordered_map>
13 #include <hilti/rt/types/integer.h>
15 #include <hilti/ast/declarations/module-uid.h>
16 #include <hilti/ast/forward.h>
17 #include <hilti/ast/node.h>
18 #include <hilti/base/logger.h>
19 #include <hilti/base/uniquer.h>
32 namespace detail::cfg {
45 Result<declaration::Module*> parseSource(Builder* builder, std::istream& in,
const std::string& filename);
51 class DependencyTracker;
69 auto value()
const {
return _value; }
75 auto str()
const {
return _value > 0 ? std::string(1, Prefix) +
rt::to_string(_value) : std::string(
"-"); }
78 explicit operator bool()
const {
return *
this !=
None; }
80 bool operator==(
const ContextIndex& other)
const {
return _value == other._value; }
81 bool operator!=(
const ContextIndex& other)
const {
return _value != other._value; }
91 rt::integer::safe<uint32_t> _value = 0;
102 template<
char Prefix>
104 return out << index.
str();
128 class ASTContext :
public std::enable_shared_from_this<ASTContext> {
131 using DeclarationSet = std::set<Declaration*, ast::detail::DeclarationPtrCmp>;
147 auto root()
const {
return _root.get(); }
165 const hilti::rt::filesystem::path& path,
166 std::optional<hilti::rt::filesystem::path> process_extension = {});
187 Result<declaration::module::UID>
importModule(Builder* builder,
190 const hilti::rt::filesystem::path& parse_extension,
191 const std::optional<hilti::rt::filesystem::path>& process_extension,
192 std::vector<hilti::rt::filesystem::path> search_dirs);
195 declaration::Module*
newModule(Builder* builder, ID
id,
const hilti::rt::filesystem::path& process_extension);
204 if (
auto m = _modules_by_uid.find(uid); m != _modules_by_uid.end() )
373 void dump(std::ostream& out,
bool include_state)
const;
381 template<
typename T,
typename... Args>
383 auto t =
new T(std::forward<Args>(args)...);
384 _nodes.emplace_back(std::unique_ptr<Node>(t));
399 template<
typename T,
typename... Args>
400 T*
make(
ASTContext* ctx, std::initializer_list<Node*> children, Args&&... args) {
402 auto t =
new T(ctx, children, std::forward<Args>(args)...);
403 _nodes.emplace_back(std::unique_ptr<Node>(t));
419 template<
typename T,
typename... Args>
422 auto t =
new T(ctx, std::forward<type::Wildcard>(wildcard), children, std::forward<Args>(args)...);
423 _nodes.emplace_back(std::unique_ptr<Node>(t));
460 void checkAST(
bool finished =
true)
const;
481 const hilti::rt::filesystem::path& path,
483 std::optional<hilti::rt::filesystem::path> process_extension = {});
499 void _saveIterationAST(
const Plugin& plugin,
const std::string& prefix,
unsigned int round = 0);
502 void _saveIterationAST(
const Plugin& plugin,
const std::string& prefix,
const std::string& tag);
507 const std::string& prefix,
508 std::optional<unsigned int> round);
511 void _dumpAST(std::ostream& stream,
513 const std::string& prefix,
514 std::optional<unsigned int> round);
520 void _dumpState(std::ostream& out)
const;
529 std::vector<std::unique_ptr<Node>> _nodes;
532 bool _resolved =
false;
533 Driver* _driver =
nullptr;
535 std::unique_ptr<ast::detail::DependencyTracker> _dependency_tracker;
537 unsigned int _total_rounds = 0;
539 std::unordered_map<declaration::module::UID, node::RetainedPtr<declaration::Module>>
542 std::unordered_map<std::string, declaration::Module*>
545 _modules_by_id_and_scope;
547 std::vector<node::RetainedPtr<Declaration>>
548 _declarations_by_index;
549 std::vector<node::RetainedPtr<UnqualifiedType>>
564 std::string
_dump()
const final;
572 template<
char Prefix>
573 struct hash<hilti::ast::detail::ContextIndex<Prefix>> {
Definition: ast-context.h:128
ASTContext(Context *context)
Definition: ast-context.cc:225
~ASTContext()
Definition: ast-context.cc:232
auto root() const
Definition: ast-context.h:147
T * make(ASTContext *ctx, std::initializer_list< Node * > children, Args &&... args)
Definition: ast-context.h:400
void updateModuleUID(const declaration::module::UID &old_uid, const declaration::module::UID &new_uid)
Definition: ast-context.cc:417
std::set< declaration::module::UID > dependencies(const declaration::module::UID &uid, bool recursive=false) const
void checkAST(bool finished=true) const
Definition: ast-context.cc:715
Driver * driver() const
Definition: ast-context.h:225
ast::DeclarationIndex register_(Declaration *decl)
Definition: ast-context.cc:433
void dump(const hilti::logging::DebugStream &stream, const std::string &prefix) const
Definition: ast-context.cc:923
void clearScopes(Node *node=nullptr)
Definition: ast-context.cc:756
ID uniqueCanononicalID(const ID &id)
Definition: ast-context.h:357
static constexpr unsigned int MaxASTIterationRounds
Definition: ast-context.h:475
void clear()
Definition: ast-context.cc:245
auto * compilerContext() const
Definition: ast-context.h:144
T * make(Args &&... args)
Definition: ast-context.h:382
declaration::Module * newModule(Builder *builder, ID id, const hilti::rt::filesystem::path &process_extension)
Definition: ast-context.cc:322
Result< declaration::module::UID > importModule(Builder *builder, const ID &id, const ID &scope, const hilti::rt::filesystem::path &parse_extension, const std::optional< hilti::rt::filesystem::path > &process_extension, std::vector< hilti::rt::filesystem::path > search_dirs)
Definition: ast-context.cc:269
void replace(Declaration *old, Declaration *new_)
Definition: ast-context.cc:464
Declaration * lookup(ast::DeclarationIndex index)
Definition: ast-context.cc:497
Result< declaration::module::UID > parseSource(Builder *builder, const hilti::rt::filesystem::path &path, std::optional< hilti::rt::filesystem::path > process_extension={})
Definition: ast-context.cc:263
T * make(ASTContext *ctx, type::Wildcard &&wildcard, std::initializer_list< Node * > children, Args &&... args)
Definition: ast-context.h:420
void clearErrors(Node *node=nullptr)
Definition: ast-context.cc:747
void garbageCollect()
Definition: ast-context.cc:331
const DeclarationSet & dependentDeclarations(Declaration *n)
Definition: ast-context.cc:1073
Result< Nothing > processAST(Builder *builder, Driver *driver)
Definition: ast-context.cc:622
Result< Nothing > collectErrors()
Definition: ast-context.cc:1131
declaration::Module * module(const declaration::module::UID &uid) const
Definition: ast-context.h:203
Definition: ast-context.h:557
std::string _dump() const final
Definition: ast-context.cc:223
Definition: context.h:120
Definition: declaration.h:53
Definition: location.h:17
Node(ASTContext *ctx, node::Tags node_tags, Nodes children, Meta meta)
Definition: node.h:984
Definition: ast-context.h:58
static const ContextIndex None
Definition: ast-context.h:88
auto str() const
Definition: ast-context.h:75
ContextIndex(size_t index=0)
Definition: ast-context.h:66
auto value() const
Definition: ast-context.h:69
std::string to_string(T &&x)
Definition: extension-points.h:26
Definition: ast-context.h:108
Definition: module-uid.h:20