From ba4fe888fa54eed3d1009a55c5ee4e085353b073 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Tue, 11 Jun 2019 14:58:43 +0200 Subject: [PATCH] Pass parsed block statements as reference instead of value --- src/Binder/Binder.cpp | 12 ++--- .../ParsedStatements/ParsedStatement.hpp | 4 +- src/Parser/Parser.cpp | 2 +- tests/parser/ParserTests.cpp | 50 +++++++++---------- 4 files changed, 34 insertions(+), 34 deletions(-) diff --git a/src/Binder/Binder.cpp b/src/Binder/Binder.cpp index d21b70b..d79667a 100644 --- a/src/Binder/Binder.cpp +++ b/src/Binder/Binder.cpp @@ -9,9 +9,9 @@ BoundScriptStatement *Binder::Bind(Script* script, ParsedScriptStatement *s, Bou binder._scope = scriptScope; auto statements = s->GetStatements(); - vector boundStatements (statements.size()); - for (int i = 0; i < statements.size(); i++){ - boundStatements[i] = binder.BindStatement(statements[i]); + vector boundStatements (statements->size()); + for (int i = 0; i < statements->size(); i++){ + boundStatements[i] = binder.BindStatement(statements->at(i)); } return new BoundScriptStatement(boundStatements, scriptScope->GetDeepestScope()); } @@ -36,10 +36,10 @@ BoundStatement* Binder::BindStatement(ParsedStatement* statement){ BoundStatement *Binder::BindBlockStatement(ParsedStatement *statement) { auto statements = ((ParsedBlockStatement*)statement)->GetStatements(); - vector boundStatements (statements.size()); + vector boundStatements (statements->size()); this->_scope->GoInnerScope(); - for (int i = 0; i < statements.size(); i++){ - boundStatements[i] = this -> BindStatement(statements[i]); + for (int i = 0; i < statements->size(); i++){ + boundStatements[i] = this -> BindStatement(statements->at(i)); } this->_scope->GoOuterScope(); return new BoundBlockStatement(boundStatements); diff --git a/src/Parser/ParsedStatements/ParsedStatement.hpp b/src/Parser/ParsedStatements/ParsedStatement.hpp index 6bd13fc..784d8a7 100644 --- a/src/Parser/ParsedStatements/ParsedStatement.hpp +++ b/src/Parser/ParsedStatements/ParsedStatement.hpp @@ -77,8 +77,8 @@ public: return ParsedStatementKind ::Block; } - std::vector GetStatements(){ - return _statements; + std::vector* GetStatements(){ + return &_statements; } }; diff --git a/src/Parser/Parser.cpp b/src/Parser/Parser.cpp index 0928d2a..95561f3 100644 --- a/src/Parser/Parser.cpp +++ b/src/Parser/Parser.cpp @@ -399,7 +399,7 @@ ParsedExpression* Parser::ParseTableExpression(IToken* current){ else { auto block = (ParsedBlockStatement*)this -> ParseBlock({TokenKind ::CloseCurlyBracket}); auto statements = block->GetStatements(); - statements.insert(statements.begin(), firstItem); + statements->insert(statements->begin(), firstItem); throw "not implemented TODO"; } } diff --git a/tests/parser/ParserTests.cpp b/tests/parser/ParserTests.cpp index 72550f3..ee9d785 100644 --- a/tests/parser/ParserTests.cpp +++ b/tests/parser/ParserTests.cpp @@ -8,26 +8,26 @@ TEST_CASE( "Parse single true keyword", "[parser]" ) { vector v {new SimpleToken(TokenKind::TrueKeyword,0,0), new SimpleToken(TokenKind::EndOfFile,0,0)}; Parser parser = Parser(v, nullptr); auto parsedStatements = parser.Parse() -> GetStatements(); - REQUIRE(parsedStatements.size() == 1); - auto firstStatement = parsedStatements[0]; + REQUIRE(parsedStatements->size() == 1); + auto firstStatement = parsedStatements -> at(0); REQUIRE(firstStatement -> GetKind() == ParsedStatementKind::Expression); auto expression = ((ParsedExpressionStatement*)firstStatement)->GetExpression(); REQUIRE(expression -> GetKind() == ParsedExpressionKind::LiteralBool); auto boolean = ((LiteralBoolExpression*)expression); - REQUIRE(boolean->GetValue() == true); + REQUIRE(boolean->GetValue()); } TEST_CASE( "Parse single false keyword", "[parser]" ) { vector v {new SimpleToken(TokenKind::FalseKeyword,0,0), new SimpleToken(TokenKind::EndOfFile,0,0)}; Parser parser = Parser(v, nullptr); auto parsedStatements = parser.Parse() -> GetStatements(); - REQUIRE(parsedStatements.size() == 1); - auto firstStatement = parsedStatements[0]; + REQUIRE(parsedStatements->size() == 1); + auto firstStatement = parsedStatements -> at(0); REQUIRE(firstStatement -> GetKind() == ParsedStatementKind::Expression); auto expression = ((ParsedExpressionStatement*)firstStatement)->GetExpression(); REQUIRE(expression -> GetKind() == ParsedExpressionKind::LiteralBool); auto boolean = ((LiteralBoolExpression*)expression); - REQUIRE(boolean->GetValue() == false); + REQUIRE_FALSE(boolean->GetValue()); } TEST_CASE( "Parse simple addition", "[parser]" ) { @@ -39,8 +39,8 @@ TEST_CASE( "Parse simple addition", "[parser]" ) { }; Parser parser = Parser(v, nullptr); auto parsedStatements = parser.Parse() -> GetStatements(); - REQUIRE(parsedStatements.size() == 1); - auto firstStatement = parsedStatements[0]; + REQUIRE(parsedStatements->size() == 1); + auto firstStatement = parsedStatements -> at(0); REQUIRE(firstStatement -> GetKind() == ParsedStatementKind::Expression); auto expression = ((ParsedExpressionStatement*)firstStatement)->GetExpression(); REQUIRE(expression -> GetKind() == ParsedExpressionKind::Binary); @@ -62,8 +62,8 @@ TEST_CASE( "Parse simple negation", "[parser]" ) { }; Parser parser = Parser(v, nullptr); auto parsedStatements = parser.Parse() -> GetStatements(); - REQUIRE(parsedStatements.size() == 1); - auto firstStatement = parsedStatements[0]; + REQUIRE(parsedStatements->size() == 1); + auto firstStatement = parsedStatements -> at(0); REQUIRE(firstStatement -> GetKind() == ParsedStatementKind::Expression); auto expression = ((ParsedExpressionStatement*)firstStatement)->GetExpression(); REQUIRE(expression -> GetKind() == ParsedExpressionKind::Unary); @@ -82,8 +82,8 @@ TEST_CASE( "Parse logical negation", "[parser]" ) { }; Parser parser = Parser(v, nullptr); auto parsedStatements = parser.Parse() -> GetStatements(); - REQUIRE(parsedStatements.size() == 1); - auto firstStatement = parsedStatements[0]; + REQUIRE(parsedStatements->size() == 1); + auto firstStatement = parsedStatements -> at(0); REQUIRE(firstStatement -> GetKind() == ParsedStatementKind::Expression); auto expression = ((ParsedExpressionStatement*)firstStatement)->GetExpression(); REQUIRE(expression -> GetKind() == ParsedExpressionKind::Unary); @@ -91,7 +91,7 @@ TEST_CASE( "Parse logical negation", "[parser]" ) { CHECK(unary -> GetOperatorKind() == UnaryOperatorKind::LogicalNegation); auto operand = unary->GetOperand(); REQUIRE(operand->GetKind() == ParsedExpressionKind::LiteralBool); - CHECK(((LiteralBoolExpression*)operand)->GetValue() == false); + CHECK_FALSE(((LiteralBoolExpression*)operand)->GetValue()); } TEST_CASE( "Are parenthesized expressions valid", "[parser]" ) { @@ -105,8 +105,8 @@ TEST_CASE( "Are parenthesized expressions valid", "[parser]" ) { }; Parser parser = Parser(v, nullptr); auto parsedStatements = parser.Parse() -> GetStatements(); - REQUIRE(parsedStatements.size() == 1); - auto firstStatement = parsedStatements[0]; + REQUIRE(parsedStatements->size() == 1); + auto firstStatement = parsedStatements -> at(0); REQUIRE(firstStatement -> GetKind() == ParsedStatementKind::Expression); auto expression = ((ParsedExpressionStatement*)firstStatement)->GetExpression(); REQUIRE(expression -> GetKind() == ParsedExpressionKind::Binary); @@ -132,8 +132,8 @@ TEST_CASE( "Assert binary precedence", "[parser]" ) { }; Parser parser = Parser(v, nullptr); auto parsedStatements = parser.Parse() -> GetStatements(); - REQUIRE(parsedStatements.size() == 1); - auto firstStatement = parsedStatements[0]; + REQUIRE(parsedStatements->size() == 1); + auto firstStatement = parsedStatements -> at(0); REQUIRE(firstStatement -> GetKind() == ParsedStatementKind::Expression); auto expression = ((ParsedExpressionStatement*)firstStatement)->GetExpression(); REQUIRE(expression -> GetKind() == ParsedExpressionKind::Parenthesized); @@ -145,8 +145,8 @@ TEST_CASE( "Parse String Tokens", "[parser]" ) { vector v {new StringToken("foo bar", 0,0), new SimpleToken(TokenKind::EndOfFile,0,0)}; Parser parser = Parser(v, nullptr); auto parsedStatements = parser.Parse() -> GetStatements(); - REQUIRE(parsedStatements.size() == 1); - auto firstStatement = parsedStatements[0]; + REQUIRE(parsedStatements->size() == 1); + auto firstStatement = parsedStatements -> at(0); REQUIRE(firstStatement -> GetKind() == ParsedStatementKind::Expression); auto expression = ((ParsedExpressionStatement*)firstStatement)->GetExpression(); REQUIRE(expression -> GetKind() == ParsedExpressionKind::LiteralString); @@ -163,8 +163,8 @@ TEST_CASE( "Parse Global Assignment", "[parser]" ) { }; Parser parser = Parser(v, nullptr); auto parsedStatements = parser.Parse() -> GetStatements(); - REQUIRE(parsedStatements.size() == 1); - auto firstStatement = parsedStatements[0]; + REQUIRE(parsedStatements->size() == 1); + auto firstStatement = parsedStatements -> at(0); REQUIRE(firstStatement -> GetKind() == ParsedStatementKind::Assignment); auto assignment = (ParsedAssignmentStatement*)firstStatement; REQUIRE(!assignment -> IsLocal()); @@ -182,8 +182,8 @@ TEST_CASE( "Parse local Assignment", "[parser]" ) { }; Parser parser = Parser(v, nullptr); auto parsedStatements = parser.Parse() -> GetStatements(); - REQUIRE(parsedStatements.size() == 1); - auto firstStatement = parsedStatements[0]; + REQUIRE(parsedStatements->size() == 1); + auto firstStatement = parsedStatements -> at(0); REQUIRE(firstStatement -> GetKind() == ParsedStatementKind::Assignment); auto assignment = (ParsedAssignmentStatement*)firstStatement; REQUIRE(assignment -> IsLocal()); @@ -210,8 +210,8 @@ TEST_CASE( "Parse function declaration", "[parser]" ){ }; Parser parser = Parser(v, nullptr); auto parsedStatements = parser.Parse() -> GetStatements(); - REQUIRE(parsedStatements.size() == 1); - auto firstStatement = parsedStatements[0]; + REQUIRE(parsedStatements->size() == 1); + auto firstStatement = parsedStatements -> at(0); REQUIRE(firstStatement -> GetKind() == ParsedStatementKind::FunctionDeclaration); auto functionDeclaration = (ParsedFunctionDeclarationStatement*)firstStatement; REQUIRE(functionDeclaration->GetIdentifier() == HashedString("foo"));