From 56538a555241faa4dd5010074285989da61d00ea Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sun, 3 Jan 2021 14:42:26 +0100 Subject: [PATCH] Show neat little tree in REPL. --- CMakeLists.txt | 2 +- repl/main.cpp | 7 ++-- src/Parser/Statements/ParsedStatement.hpp | 49 ++++++++++++++--------- 3 files changed, 34 insertions(+), 24 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index fb5a9f7..8bfe67b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -42,7 +42,7 @@ if (REPL) # Create Test executable file(GLOB_RECURSE REPL_FILES "repl/*.cpp" "repl/*.hpp") add_executable(MalachScriptREPL ${REPL_FILES}) - target_link_libraries(MalachScriptREPL PUBLIC MalachScript curses) + target_link_libraries(MalachScriptREPL PUBLIC MalachScript cursesw) endif () diff --git a/repl/main.cpp b/repl/main.cpp index a48307d..5bc0f6f 100644 --- a/repl/main.cpp +++ b/repl/main.cpp @@ -52,7 +52,7 @@ void ParseAndUpdate(const std::vector lines, WINDOW* diagnosticsW const MalachScript::Diagnostics::Diagnostic* diag = nullptr; wclear(diagnosticsWindow); - if (logger.GetMessages().size() > 0) { + if (!logger.GetMessages().empty()) { diag = &logger.GetMessages()[0]; wattron(diagnosticsWindow, COLOR_PAIR(1)); @@ -74,9 +74,9 @@ void ParseAndUpdate(const std::vector lines, WINDOW* diagnosticsW wrefresh(diagnosticsWindow); wclear(parsedWindow); - if (logger.GetMessages().size() == 0) { + if (logger.GetMessages().empty()) { std::stringstream ss; - parsedResult->Stringify(ss, 0); + parsedResult->Stringify(ss, "", true); waddstr(parsedWindow, ss.str().c_str()); } @@ -86,6 +86,7 @@ void ParseAndUpdate(const std::vector lines, WINDOW* diagnosticsW } int main([[maybe_unused]] int argc, [[maybe_unused]] const char* argv[]) { + setlocale(LC_ALL, ""); initscr(); cbreak(); noecho(); diff --git a/src/Parser/Statements/ParsedStatement.hpp b/src/Parser/Statements/ParsedStatement.hpp index dd66aef..8c80138 100644 --- a/src/Parser/Statements/ParsedStatement.hpp +++ b/src/Parser/Statements/ParsedStatement.hpp @@ -2,6 +2,7 @@ #define MALACHSCRIPT_PARSEDSTATEMENT_HPP #include +#include #include #include #include "../../CoreData/AccessModifier.hpp" @@ -20,10 +21,9 @@ namespace MalachScript::Parser { [[nodiscard]] virtual ParsedStatementKind GetKind() const noexcept = 0; [[nodiscard]] inline const TextSpan& GetSpan() const noexcept { return _span; } - virtual void Stringify(std::stringstream& stream, uint8_t indents) const { - for (uint8_t i = 0; i < indents; i++) { - stream << "\t"; - } + virtual void Stringify(std::stringstream& stream, const std::string& prefix, bool isLast) const { + stream << prefix; + stream << (isLast ? "└──" : "├──"); stream << ParsedStatementKindHelper::ToString(GetKind()); } }; @@ -48,12 +48,11 @@ namespace MalachScript::Parser { return _statements; } - void Stringify(std::stringstream& stream, uint8_t indents) const override { - ParsedStatement::Stringify(stream, indents); - stream << std::to_string(GetStatements().size()); + void Stringify(std::stringstream& stream, const std::string& prefix, bool isLast) const override { + ParsedStatement::Stringify(stream, prefix, isLast); stream << std::endl; - for (const auto& s : GetStatements()) { - s->Stringify(stream, indents + 1); + for (size_t i = 0; i < _statements.size(); i++) { + _statements[i]->Stringify(stream, prefix + (isLast ? " " : "│ "), i == _statements.size() - 1); } } }; @@ -75,12 +74,12 @@ namespace MalachScript::Parser { return _body; } - void Stringify(std::stringstream& stream, uint8_t indents) const override { - ParsedStatement::Stringify(stream, indents); + void Stringify(std::stringstream& stream, const std::string& prefix, bool isLast) const override { + ParsedStatement::Stringify(stream, prefix, isLast); stream << " " << _identifier; stream << std::endl; - for (const auto& s : GetBody()) { - s->Stringify(stream, indents + 1); + for (size_t i = 0; i < _body.size(); i++) { + _body[i]->Stringify(stream, prefix + (isLast ? " " : "│ "), i == _body.size() - 1); } } @@ -135,7 +134,8 @@ namespace MalachScript::Parser { [[nodiscard]] inline bool IsHandle() const noexcept { return _isHandle; } [[nodiscard]] inline const ScopedIdentifier& GetScopedIdentifier() const noexcept { return _scopedIdentifier; } - void Stringify(std::stringstream& stream, uint8_t) const override { + void Stringify(std::stringstream& stream, [[maybe_unused]] const std::string& prefix, + [[maybe_unused]] bool isLast) const override { if (_isConst) { stream << "const "; } @@ -204,10 +204,10 @@ namespace MalachScript::Parser { return _parameters; } - void Stringify(std::stringstream& stream, uint8_t indents) const override { + void Stringify(std::stringstream& stream, const std::string& prefix, bool isLast) const override { stream << "("; for (auto& param : GetParameters()) { - param->GetTypeStatement()->Stringify(stream, indents); + param->GetTypeStatement()->Stringify(stream, prefix, isLast); stream << " " << param->GetIdentifier(); } stream << ")"; @@ -253,12 +253,13 @@ namespace MalachScript::Parser { return _statBlock; } - void Stringify(std::stringstream& stream, uint8_t indents) const override { - ParsedStatement::Stringify(stream, indents); + void Stringify(std::stringstream& stream, const std::string& prefix, bool isLast) const override { + ParsedStatement::Stringify(stream, prefix, isLast); stream << " " << _identifier; - GetParamList()->Stringify(stream, 0); + GetParamList()->Stringify(stream, prefix, isLast); stream << std::endl; - GetStatBlock()->Stringify(stream, indents + 1); + + GetStatBlock()->Stringify(stream, prefix + (isLast ? " " : "│ "), true); } }; @@ -323,6 +324,14 @@ namespace MalachScript::Parser { return _statements; } + void Stringify(std::stringstream& stream, const std::string& prefix, bool isLast) const override { + ParsedStatement::Stringify(stream, prefix, isLast); + stream << std::endl; + for (size_t i = 0; i < _statements.size(); i++) { + _statements[i]->Stringify(stream, prefix + (isLast ? " " : "│ "), i == _statements.size() - 1); + } + } + private: std::vector> _statements; };