#pragma once #include #include #include #include #include #include "DiagnosticLogger.hpp" #include "detail/InternalConcepts.hpp" namespace ovdl { struct BasicParseState { explicit BasicParseState(detail::Encoding encoding = detail::Encoding::Unknown) : _encoding(encoding) {} detail::Encoding encoding() const { return _encoding; } protected: detail::Encoding _encoding; }; template struct ParseState : BasicParseState { using ast_type = AstT; using file_type = typename ast_type::file_type; using diagnostic_logger_type = BasicDiagnosticLogger; ParseState(typename ast_type::file_type&& file, detail::Encoding encoding) : _ast { std::move(file) }, _logger { this->ast().file() }, BasicParseState(encoding) {} template ParseState(lexy::buffer&& buffer, detail::Encoding encoding) : ParseState(typename ast_type::file_type { std::move(buffer) }, encoding) {} template ParseState(const char* path, lexy::buffer&& buffer, detail::Encoding encoding) : ParseState(typename ast_type::file_type { path, std::move(buffer) }, encoding) {} ast_type& ast() { return _ast; } const ast_type& ast() const { return _ast; } diagnostic_logger_type& logger() { return _logger; } const diagnostic_logger_type& logger() const { return _logger; } private: ast_type _ast; diagnostic_logger_type _logger; }; template struct FileParseState : BasicParseState { using file_type = FileT; using diagnostic_logger_type = BasicDiagnosticLogger; FileParseState(file_type&& file, detail::Encoding encoding) : _file { std::move(file) }, _logger { this->file() }, BasicParseState(encoding) {} template FileParseState(lexy::buffer&& buffer, detail::Encoding encoding) : FileParseState(file_type { std::move(buffer) }, encoding) {} template FileParseState(const char* path, lexy::buffer&& buffer, detail::Encoding encoding) : FileParseState(file_type { path, std::move(buffer) }, encoding) {} file_type& file() { return _file; } const file_type& file() const { return _file; } diagnostic_logger_type& logger() { return _logger; } const diagnostic_logger_type& logger() const { return _logger; } private: file_type _file; diagnostic_logger_type _logger; }; }