diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 6dc58c29a4..acb6f564ef 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -227,6 +227,7 @@ set(TINT_TEST_SRCS ast/nop_statement_test.cc ast/regardless_statement_test.cc ast/relational_expression_test.cc + ast/return_statement_test.cc ast/set_decoration_test.cc ast/struct_member_test.cc ast/struct_member_offset_decoration_test.cc diff --git a/src/ast/return_statement.cc b/src/ast/return_statement.cc index 5a6dcc2f4c..dec5f8ca2b 100644 --- a/src/ast/return_statement.cc +++ b/src/ast/return_statement.cc @@ -19,6 +19,8 @@ namespace ast { ReturnStatement::ReturnStatement() : Statement() {} +ReturnStatement::ReturnStatement(const Source& source) : Statement(source) {} + ReturnStatement::ReturnStatement(std::unique_ptr value) : Statement(), value_(std::move(value)) {} @@ -29,6 +31,9 @@ ReturnStatement::ReturnStatement(const Source& source, ReturnStatement::~ReturnStatement() = default; bool ReturnStatement::IsValid() const { + if (value_ != nullptr) { + return value_->IsValid(); + } return true; } @@ -38,7 +43,15 @@ void ReturnStatement::to_str(std::ostream& out, size_t indent) const { if (value_) { out << std::endl; - value_->to_str(out, indent); + + make_indent(out, indent + 2); + out << "{" << std::endl; + + value_->to_str(out, indent + 4); + + make_indent(out, indent + 2); + out << "}" << std::endl; + make_indent(out, indent); } out << "}" << std::endl; diff --git a/src/ast/return_statement.h b/src/ast/return_statement.h index 30ada9cb67..3c60d098dd 100644 --- a/src/ast/return_statement.h +++ b/src/ast/return_statement.h @@ -30,6 +30,9 @@ class ReturnStatement : public Statement { /// Constructor ReturnStatement(); /// Constructor + /// @param source the source information + explicit ReturnStatement(const Source& source); + /// Constructor /// @param value the return value explicit ReturnStatement(std::unique_ptr value); /// Constructor diff --git a/src/ast/return_statement_test.cc b/src/ast/return_statement_test.cc new file mode 100644 index 0000000000..9d631f494c --- /dev/null +++ b/src/ast/return_statement_test.cc @@ -0,0 +1,86 @@ +// Copyright 2020 The Tint Authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#include "src/ast/return_statement.h" + +#include + +#include "gtest/gtest.h" +#include "src/ast/identifier_expression.h" + +namespace tint { +namespace ast { + +using ReturnStatementTest = testing::Test; + +TEST_F(ReturnStatementTest, Creation) { + auto expr = std::make_unique("expr"); + auto expr_ptr = expr.get(); + + ReturnStatement r(std::move(expr)); + EXPECT_EQ(r.value(), expr_ptr); +} + +TEST_F(ReturnStatementTest, Creation_WithSource) { + ReturnStatement r(Source{20, 2}); + auto src = r.source(); + EXPECT_EQ(src.line, 20); + EXPECT_EQ(src.column, 2); +} + +TEST_F(ReturnStatementTest, IsReturn) { + ReturnStatement r; + EXPECT_TRUE(r.IsReturn()); +} + +TEST_F(ReturnStatementTest, IsValid_WithoutValue) { + ReturnStatement r; + EXPECT_TRUE(r.IsValid()); +} + +TEST_F(ReturnStatementTest, IsValid_WithValue) { + auto expr = std::make_unique("expr"); + ReturnStatement r(std::move(expr)); + EXPECT_TRUE(r.IsValid()); +} + +TEST_F(ReturnStatementTest, IsValid_InvalidValue) { + auto expr = std::make_unique(""); + ReturnStatement r(std::move(expr)); + EXPECT_FALSE(r.IsValid()); +} + +TEST_F(ReturnStatementTest, ToStr_WithValue) { + auto expr = std::make_unique("expr"); + ReturnStatement r(std::move(expr)); + std::ostringstream out; + r.to_str(out, 2); + EXPECT_EQ(out.str(), R"( Return{ + { + Identifier{expr} + } + } +)"); +} + +TEST_F(ReturnStatementTest, ToStr_WithoutValue) { + ReturnStatement r; + std::ostringstream out; + r.to_str(out, 2); + EXPECT_EQ(out.str(), R"( Return{} +)"); +} + +} // namespace ast +} // namespace tint