Some fixes for statements to string, added more tests
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2019-09-05 12:22:10 +02:00
parent fb142c7f25
commit 256969e912
3 changed files with 166 additions and 48 deletions

View File

@@ -27,6 +27,11 @@ namespace Porygon::Binder {
};
class BoundStatement {
protected:
inline void DrawIndents(std::stringstream& stream, size_t indents) const{
for (size_t i = 0; i < indents; i++)
stream << "\t";
}
public:
[[nodiscard]]
virtual BoundStatementKind GetKind() const = 0;
@@ -58,8 +63,7 @@ namespace Porygon::Binder {
}
void GetTreeString(std::stringstream& stream, size_t indents) const final{
for (size_t i = 0; i < indents; i++)
stream << "\t";
DrawIndents(stream, indents);
stream << "BreakStatement";
}
};
@@ -88,8 +92,7 @@ namespace Porygon::Binder {
}
void GetTreeString(std::stringstream& stream, size_t indents) const override{
for (size_t i = 0; i < indents; i++)
stream << "\t";
DrawIndents(stream, indents);
stream << "BlockStatement";
for (auto s : _statements){
stream << endl;
@@ -140,8 +143,7 @@ namespace Porygon::Binder {
}
void GetTreeString(std::stringstream& stream, size_t indents) const override{
for (size_t i = 0; i < indents; i++)
stream << "\t";
DrawIndents(stream, indents);
stream << "ExpressionStatement" << endl;
_expression->GetTreeString(stream, indents + 1);
}
@@ -176,9 +178,8 @@ namespace Porygon::Binder {
}
void GetTreeString(std::stringstream& stream, size_t indents) const override{
for (size_t i = 0; i < indents; i++)
stream << "\t";
stream << "Assignment -> " << _key->GetIdentifier()->GetString() << endl;
DrawIndents(stream, indents);
stream << "Assignment -> " << _key->GetIdentifier()->GetDebugString() << endl;
_expression->GetTreeString(stream, indents + 1);
}
};
@@ -212,8 +213,7 @@ namespace Porygon::Binder {
}
void GetTreeString(std::stringstream& stream, size_t indents) const override{
for (size_t i = 0; i < indents; i++)
stream << "\t";
DrawIndents(stream, indents);
stream << "IndexAssignment" << endl;
_indexExpression->GetTreeString(stream, indents + 1);
stream << endl;
@@ -243,10 +243,10 @@ namespace Porygon::Binder {
}
void GetTreeString(std::stringstream& stream, size_t indents) const override{
for (size_t i = 0; i < indents; i++)
stream << "\t";
stream << "ReturnStatement" << endl;
DrawIndents(stream, indents);
stream << "ReturnStatement";
if (_expression != nullptr){
stream << endl;
_expression->GetTreeString(stream, indents + 1);
}
}
@@ -289,20 +289,18 @@ namespace Porygon::Binder {
}
void GetTreeString(std::stringstream& stream, size_t indents) const override{
for (size_t i = 0; i < indents; i++)
stream << "\t";
DrawIndents(stream, indents);
stream << "ConditionalStatement" << endl;
for (size_t i = 0; i < indents; i++)
stream << "\t";
DrawIndents(stream, indents);
stream << "Condition:" << endl;
_condition->GetTreeString(stream, indents + 1);
for (size_t i = 0; i < indents; i++)
stream << "\t";
stream << endl;
DrawIndents(stream, indents);
stream << "If True:" << endl;
_block->GetTreeString(stream, indents + 1);
if (_elseStatement != nullptr){
for (size_t i = 0; i < indents; i++)
stream << "\t";
stream << endl;
DrawIndents(stream, indents);
stream << "Else:" << endl;
_elseStatement->GetTreeString(stream, indents + 1);
}
@@ -362,25 +360,23 @@ namespace Porygon::Binder {
}
void GetTreeString(std::stringstream& stream, size_t indents) const override{
for (size_t i = 0; i < indents; i++)
stream << "\t";
DrawIndents(stream, indents);
stream << "NumericForLoopStatement" << endl;
for (size_t i = 0; i < indents; i++)
stream << "\t";
DrawIndents(stream, indents);
stream << "Start:" << endl;
_start->GetTreeString(stream, indents + 1);
for (size_t i = 0; i < indents; i++)
stream << "\t";
stream << endl;
DrawIndents(stream, indents);
stream << "End:" << endl;
_end->GetTreeString(stream, indents + 1);
if (_step != nullptr){
for (size_t i = 0; i < indents; i++)
stream << "\t";
stream << endl;
DrawIndents(stream, indents);
stream << "Step:" << endl;
_step->GetTreeString(stream, indents + 1);
}
for (size_t i = 0; i < indents; i++)
stream << "\t";
stream << endl;
DrawIndents(stream, indents);
stream << "Do:" << endl;
_block->GetTreeString(stream, indents + 1);
}
@@ -432,18 +428,18 @@ namespace Porygon::Binder {
}
void GetTreeString(std::stringstream& stream, size_t indents) const override{
for (size_t i = 0; i < indents; i++)
stream << "\t";
DrawIndents(stream, indents);
stream << "GenericForLoopStatement" << endl;
for (size_t i = 0; i < indents; i++)
stream << "\t";
stream << "Key: " << _keyIdentifier->GetIdentifier()->GetString().get() << endl;
for (size_t i = 0; i < indents; i++)
stream << "\t";
stream << "Value: " << _valueIdentifier->GetIdentifier()->GetString().get() << endl;
stream << "Iterator: " << endl;
DrawIndents(stream, indents);
stream << "Key: " << _keyIdentifier->GetIdentifier()->GetDebugString() << endl;
DrawIndents(stream, indents);
stream << "Value: " << _valueIdentifier->GetIdentifier()->GetDebugString() << endl;
DrawIndents(stream, indents);
stream << "Iterator:" << endl;
_iterator->GetTreeString(stream, indents + 1);
stream << endl;
DrawIndents(stream, indents);
stream << "Do:" << endl;
_block->GetTreeString(stream, indents + 1);
}
};
@@ -477,15 +473,13 @@ namespace Porygon::Binder {
}
void GetTreeString(std::stringstream& stream, size_t indents) const override{
for (size_t i = 0; i < indents; i++)
stream << "\t";
stream << "ConditionalStatement" << endl;
for (size_t i = 0; i < indents; i++)
stream << "\t";
DrawIndents(stream, indents);
stream << "WhileStatement" << endl;
DrawIndents(stream, indents);
stream << "Condition:" << endl;
_condition->GetTreeString(stream, indents + 1);
for (size_t i = 0; i < indents; i++)
stream << "\t";
stream << endl;
DrawIndents(stream, indents);
stream << "While True:" << endl;
_block->GetTreeString(stream, indents + 1);
}

View File

@@ -4,6 +4,7 @@
#include <string>
#include <memory>
#include "StringUtils.hpp"
namespace Porygon::Utilities{
class HashedString{
@@ -51,6 +52,13 @@ namespace Porygon::Utilities{
return _string;
}
inline const std::string GetDebugString() const{
if (_string){
return Utilities::StringUtils::FromUTF8(*_string.get());
}
return std::to_string(_hash);
}
inline bool operator==(const HashedString& b) const{
return _hash == b._hash;
}