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>
41 Result<declaration::Module*> parseSource(Builder* builder, std::istream& in,
const std::string& filename);
47 class DependencyTracker;
65 auto value()
const {
return _value; }
71 auto str()
const {
return _value > 0 ? std::string(1, Prefix) +
rt::to_string(_value) : std::string(
"-"); }
74 explicit operator bool()
const {
return *
this !=
None; }
76 bool operator==(
const ContextIndex& other)
const {
return _value == other._value; }
77 bool operator!=(
const ContextIndex& other)
const {
return _value != other._value; }
87 rt::integer::safe<uint32_t> _value = 0;
97 return out << index.
str();
121 class ASTContext :
public std::enable_shared_from_this<ASTContext> {
124 using DeclarationSet = std::set<Declaration*, ast::detail::DeclarationPtrCmp>;
140 auto root()
const {
return _root.get(); }
158 std::optional<hilti::rt::filesystem::path> process_extension = {});
179 Result<declaration::module::UID>
importModule(Builder* builder,
const ID&
id,
const ID& scope,
180 const hilti::rt::filesystem::path& parse_extension,
181 const std::optional<hilti::rt::filesystem::path>& process_extension,
182 std::vector<hilti::rt::filesystem::path> search_dirs);
185 declaration::Module*
newModule(Builder* builder, ID
id,
const hilti::rt::filesystem::path& process_extension);
194 if (
auto m = _modules_by_uid.find(uid); m != _modules_by_uid.end() )
365 template<
typename T,
typename... Args>
367 auto t =
new T(std::forward<Args>(args)...);
368 _nodes.emplace_back(std::unique_ptr<Node>(t));
383 template<
typename T,
typename... Args>
384 T*
make(
ASTContext* ctx, std::initializer_list<Node*> children, Args&&... args) {
386 auto t =
new T(ctx, children, std::forward<Args>(args)...);
387 _nodes.emplace_back(std::unique_ptr<Node>(t));
403 template<
typename T,
typename... Args>
406 auto t =
new T(ctx, std::forward<type::Wildcard>(wildcard), children, std::forward<Args>(args)...);
407 _nodes.emplace_back(std::unique_ptr<Node>(t));
422 std::optional<hilti::rt::filesystem::path> process_extension = {});
423 Result<Nothing> _init(Builder* builder,
const Plugin& plugin);
424 Result<Nothing> _buildScopes(Builder* builder,
const Plugin& plugin);
425 Result<Nothing> _clearState(Builder* builder,
const Plugin& plugin);
426 Result<Nothing> _resolve(Builder* builder,
const Plugin& plugin);
427 Result<Nothing> _resolveUnresolvedNodes(
bool* modified, Builder* builder,
const Plugin& plugin);
428 Result<Nothing> _resolveRoot(
bool* modified, Builder* builder,
const Plugin& plugin);
429 Result<Nothing> _validate(Builder* builder,
const Plugin& plugin,
bool pre_resolver);
430 Result<Nothing> _transform(Builder* builder,
const Plugin& plugin);
431 Result<Nothing> _collectErrors();
432 Result<Nothing> _optimize(Builder* builder);
433 Result<Nothing> _computeDependencies();
437 declaration::module::UID _addModuleToAST(declaration::Module*
module);
441 void _checkAST(
bool finished)
const;
444 void _saveIterationAST(
const Plugin& plugin,
const std::string& prefix,
int round = 0);
447 void _saveIterationAST(
const Plugin& plugin,
const std::string& prefix,
const std::string& tag);
454 void _dumpAST(std::ostream& stream,
const Plugin& plugin,
const std::string& prefix,
int round);
457 void _dumpState(
const logging::DebugStream& stream);
460 void _dumpStats(
const logging::DebugStream& stream, std::string_view tag);
463 void _dumpDeclarations(
const logging::DebugStream& stream,
const Plugin& plugin);
465 Context* _context =
nullptr;
466 std::vector<std::unique_ptr<Node>> _nodes;
469 bool _resolved =
false;
470 Driver* _driver =
nullptr;
471 util::Uniquer<ID> _canon_id_uniquer;
472 std::unique_ptr<ast::detail::DependencyTracker> _dependency_tracker;
474 uint64_t _total_rounds = 0;
476 std::unordered_map<declaration::module::UID, node::RetainedPtr<declaration::Module>>
479 std::unordered_map<std::string, declaration::Module*>
481 std::map<std::pair<ID, ID>, declaration::Module*>
482 _modules_by_id_and_scope;
484 std::vector<node::RetainedPtr<Declaration>>
485 _declarations_by_index;
486 std::vector<node::RetainedPtr<UnqualifiedType>>
501 std::string
_dump()
const final;
509 template<
char Prefix>
510 struct hash<hilti::ast::detail::ContextIndex<Prefix>> {
Definition: ast-context.h:121
ASTContext(Context *context)
Definition: ast-context.cc:212
~ASTContext()
Definition: ast-context.cc:219
auto root() const
Definition: ast-context.h:140
T * make(ASTContext *ctx, std::initializer_list< Node * > children, Args &&... args)
Definition: ast-context.h:384
void updateModuleUID(const declaration::module::UID &old_uid, const declaration::module::UID &new_uid)
Definition: ast-context.cc:392
std::set< declaration::module::UID > dependencies(const declaration::module::UID &uid, bool recursive=false) const
Driver * driver() const
Definition: ast-context.h:215
ast::DeclarationIndex register_(Declaration *decl)
Definition: ast-context.cc:408
ID uniqueCanononicalID(const ID &id)
Definition: ast-context.h:349
void clear()
Definition: ast-context.cc:232
auto * compilerContext() const
Definition: ast-context.h:137
T * make(Args &&... args)
Definition: ast-context.h:366
declaration::Module * newModule(Builder *builder, ID id, const hilti::rt::filesystem::path &process_extension)
Definition: ast-context.cc:304
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:255
void replace(Declaration *old, Declaration *new_)
Definition: ast-context.cc:434
Declaration * lookup(ast::DeclarationIndex index)
Definition: ast-context.cc:462
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:250
T * make(ASTContext *ctx, type::Wildcard &&wildcard, std::initializer_list< Node * > children, Args &&... args)
Definition: ast-context.h:404
void garbageCollect()
Definition: ast-context.cc:312
const DeclarationSet & dependentDeclarations(Declaration *n)
Definition: ast-context.cc:967
Result< Nothing > processAST(Builder *builder, Driver *driver)
Definition: ast-context.cc:572
void dump(const hilti::logging::DebugStream &stream, const std::string &prefix)
Definition: ast-context.cc:846
declaration::Module * module(const declaration::module::UID &uid) const
Definition: ast-context.h:193
Definition: ast-context.h:494
std::string _dump() const final
Definition: ast-context.cc:210
Definition: context.h:108
Definition: declaration.h:48
Definition: location.h:17
Node(ASTContext *ctx, node::Tags node_tags, Nodes children, Meta meta)
Definition: node.h:922
Definition: ast-context.h:54
auto str() const
Definition: ast-context.h:71
static const ContextIndex None
Definition: ast-context.h:84
ContextIndex(size_t index=0)
Definition: ast-context.h:62
auto value() const
Definition: ast-context.h:65
std::string to_string(T &&x)
Definition: extension-points.h:26
Definition: ast-context.h:101
Definition: module-uid.h:20