Convert CaseStatement to use BlockStatement.

This CL converts the CaseStatement class to using a BlockStatement
internally. All usages have been updated execept for the two readers.

Bug: tint:130
Change-Id: Idb9114230f7d9eb0f2208af635316edb0a0e8f99
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/25721
Reviewed-by: Sarah Mashayekhi <sarahmashay@google.com>
This commit is contained in:
dan sinclair 2020-07-27 15:25:00 +00:00 committed by Sarah Mashayekhi
parent 4069f3357d
commit 7c2fa1e7bc
21 changed files with 200 additions and 171 deletions

View File

@ -42,13 +42,20 @@ class BlockStatement : public Statement {
statements_.push_back(std::move(stmt)); statements_.push_back(std::move(stmt));
} }
/// @returns true if the block is empty
bool empty() const { return statements_.empty(); }
/// @returns the number of statements directly in the block /// @returns the number of statements directly in the block
size_t size() const { return statements_.size(); } size_t size() const { return statements_.size(); }
/// @returns the last statement in the block or nullptr if block empty
const ast::Statement* last() const {
return statements_.empty() ? nullptr : statements_.back().get();
}
/// Retrieves the statement at |idx| /// Retrieves the statement at |idx|
/// @param idx the index. The index is not bounds checked. /// @param idx the index. The index is not bounds checked.
/// @returns the statement at |idx| /// @returns the statement at |idx|
ast::Statement* get(size_t idx) { return statements_[idx].get(); } const ast::Statement* get(size_t idx) const { return statements_[idx].get(); }
/// Retrieves the statement at |idx| /// Retrieves the statement at |idx|
/// @param idx the index. The index is not bounds checked. /// @param idx the index. The index is not bounds checked.

View File

@ -17,17 +17,19 @@
namespace tint { namespace tint {
namespace ast { namespace ast {
CaseStatement::CaseStatement() : Statement() {} CaseStatement::CaseStatement()
: Statement(), body_(std::make_unique<BlockStatement>()) {}
CaseStatement::CaseStatement(StatementList body) CaseStatement::CaseStatement(std::unique_ptr<BlockStatement> body)
: Statement(), body_(std::move(body)) {} : Statement(), body_(std::move(body)) {}
CaseStatement::CaseStatement(CaseSelectorList selectors, StatementList body) CaseStatement::CaseStatement(CaseSelectorList selectors,
std::unique_ptr<BlockStatement> body)
: Statement(), selectors_(std::move(selectors)), body_(std::move(body)) {} : Statement(), selectors_(std::move(selectors)), body_(std::move(body)) {}
CaseStatement::CaseStatement(const Source& source, CaseStatement::CaseStatement(const Source& source,
CaseSelectorList selectors, CaseSelectorList selectors,
StatementList body) std::unique_ptr<BlockStatement> body)
: Statement(source), : Statement(source),
selectors_(std::move(selectors)), selectors_(std::move(selectors)),
body_(std::move(body)) {} body_(std::move(body)) {}
@ -36,16 +38,18 @@ CaseStatement::CaseStatement(CaseStatement&&) = default;
CaseStatement::~CaseStatement() = default; CaseStatement::~CaseStatement() = default;
void CaseStatement::set_body(StatementList body) {
for (auto& stmt : body) {
body_->append(std::move(stmt));
}
}
bool CaseStatement::IsCase() const { bool CaseStatement::IsCase() const {
return true; return true;
} }
bool CaseStatement::IsValid() const { bool CaseStatement::IsValid() const {
for (const auto& stmt : body_) { return body_ != nullptr && body_->IsValid();
if (stmt == nullptr || !stmt->IsValid())
return false;
}
return true;
} }
void CaseStatement::to_str(std::ostream& out, size_t indent) const { void CaseStatement::to_str(std::ostream& out, size_t indent) const {
@ -66,8 +70,11 @@ void CaseStatement::to_str(std::ostream& out, size_t indent) const {
out << "{" << std::endl; out << "{" << std::endl;
} }
for (const auto& stmt : body_) if (body_ != nullptr) {
for (const auto& stmt : *body_) {
stmt->to_str(out, indent + 2); stmt->to_str(out, indent + 2);
}
}
make_indent(out, indent); make_indent(out, indent);
out << "}" << std::endl; out << "}" << std::endl;

View File

@ -19,6 +19,7 @@
#include <utility> #include <utility>
#include <vector> #include <vector>
#include "src/ast/block_statement.h"
#include "src/ast/expression.h" #include "src/ast/expression.h"
#include "src/ast/int_literal.h" #include "src/ast/int_literal.h"
#include "src/ast/statement.h" #include "src/ast/statement.h"
@ -37,18 +38,19 @@ class CaseStatement : public Statement {
/// Constructor /// Constructor
/// Creates a default case statement /// Creates a default case statement
/// @param body the case body /// @param body the case body
explicit CaseStatement(StatementList body); explicit CaseStatement(std::unique_ptr<BlockStatement> body);
/// Constructor /// Constructor
/// @param selectors the case selectors /// @param selectors the case selectors
/// @param body the case body /// @param body the case body
CaseStatement(CaseSelectorList selectors, StatementList body); CaseStatement(CaseSelectorList selectors,
std::unique_ptr<BlockStatement> body);
/// Constructor /// Constructor
/// @param source the source information /// @param source the source information
/// @param selectors the case selectors /// @param selectors the case selectors
/// @param body the case body /// @param body the case body
CaseStatement(const Source& source, CaseStatement(const Source& source,
CaseSelectorList selectors, CaseSelectorList selectors,
StatementList body); std::unique_ptr<BlockStatement> body);
/// Move constructor /// Move constructor
CaseStatement(CaseStatement&&); CaseStatement(CaseStatement&&);
~CaseStatement() override; ~CaseStatement() override;
@ -65,9 +67,14 @@ class CaseStatement : public Statement {
/// Sets the case body /// Sets the case body
/// @param body the case body /// @param body the case body
void set_body(StatementList body) { body_ = std::move(body); } void set_body(StatementList body);
/// Sets the case body
/// @param body the case body
void set_body(std::unique_ptr<BlockStatement> body) {
body_ = std::move(body);
}
/// @returns the case body /// @returns the case body
const StatementList& body() const { return body_; } const BlockStatement* body() const { return body_.get(); }
/// @returns true if this is a case statement /// @returns true if this is a case statement
bool IsCase() const override; bool IsCase() const override;
@ -84,7 +91,7 @@ class CaseStatement : public Statement {
CaseStatement(const CaseStatement&) = delete; CaseStatement(const CaseStatement&) = delete;
CaseSelectorList selectors_; CaseSelectorList selectors_;
StatementList body_; std::unique_ptr<BlockStatement> body_;
}; };
/// A list of unique case statements /// A list of unique case statements

View File

@ -34,17 +34,17 @@ TEST_F(CaseStatementTest, Creation_i32) {
CaseSelectorList b; CaseSelectorList b;
b.push_back(std::make_unique<SintLiteral>(&i32, 2)); b.push_back(std::make_unique<SintLiteral>(&i32, 2));
StatementList stmts; auto body = std::make_unique<BlockStatement>();
stmts.push_back(std::make_unique<DiscardStatement>()); body->append(std::make_unique<DiscardStatement>());
auto* int_ptr = b.back().get(); auto* int_ptr = b.back().get();
auto* discard_ptr = stmts[0].get(); auto* discard_ptr = body->get(0);
CaseStatement c(std::move(b), std::move(stmts)); CaseStatement c(std::move(b), std::move(body));
ASSERT_EQ(c.selectors().size(), 1u); ASSERT_EQ(c.selectors().size(), 1u);
EXPECT_EQ(c.selectors()[0].get(), int_ptr); EXPECT_EQ(c.selectors()[0].get(), int_ptr);
ASSERT_EQ(c.body().size(), 1u); ASSERT_EQ(c.body()->size(), 1u);
EXPECT_EQ(c.body()[0].get(), discard_ptr); EXPECT_EQ(c.body()->get(0), discard_ptr);
} }
TEST_F(CaseStatementTest, Creation_u32) { TEST_F(CaseStatementTest, Creation_u32) {
@ -53,17 +53,17 @@ TEST_F(CaseStatementTest, Creation_u32) {
CaseSelectorList b; CaseSelectorList b;
b.push_back(std::make_unique<UintLiteral>(&u32, 2)); b.push_back(std::make_unique<UintLiteral>(&u32, 2));
StatementList stmts; auto body = std::make_unique<BlockStatement>();
stmts.push_back(std::make_unique<DiscardStatement>()); body->append(std::make_unique<DiscardStatement>());
auto* int_ptr = b.back().get(); auto* int_ptr = b.back().get();
auto* discard_ptr = stmts[0].get(); auto* discard_ptr = body->get(0);
CaseStatement c(std::move(b), std::move(stmts)); CaseStatement c(std::move(b), std::move(body));
ASSERT_EQ(c.selectors().size(), 1u); ASSERT_EQ(c.selectors().size(), 1u);
EXPECT_EQ(c.selectors()[0].get(), int_ptr); EXPECT_EQ(c.selectors()[0].get(), int_ptr);
ASSERT_EQ(c.body().size(), 1u); ASSERT_EQ(c.body()->size(), 1u);
EXPECT_EQ(c.body()[0].get(), discard_ptr); EXPECT_EQ(c.body()->get(0), discard_ptr);
} }
TEST_F(CaseStatementTest, Creation_WithSource) { TEST_F(CaseStatementTest, Creation_WithSource) {
@ -71,21 +71,21 @@ TEST_F(CaseStatementTest, Creation_WithSource) {
CaseSelectorList b; CaseSelectorList b;
b.push_back(std::make_unique<SintLiteral>(&i32, 2)); b.push_back(std::make_unique<SintLiteral>(&i32, 2));
StatementList stmts; auto body = std::make_unique<BlockStatement>();
stmts.push_back(std::make_unique<DiscardStatement>()); body->append(std::make_unique<DiscardStatement>());
CaseStatement c(Source{20, 2}, std::move(b), std::move(stmts)); CaseStatement c(Source{20, 2}, std::move(b), std::move(body));
auto src = c.source(); auto src = c.source();
EXPECT_EQ(src.line, 20u); EXPECT_EQ(src.line, 20u);
EXPECT_EQ(src.column, 2u); EXPECT_EQ(src.column, 2u);
} }
TEST_F(CaseStatementTest, IsDefault_WithoutSelectors) { TEST_F(CaseStatementTest, IsDefault_WithoutSelectors) {
StatementList stmts; auto body = std::make_unique<BlockStatement>();
stmts.push_back(std::make_unique<DiscardStatement>()); body->append(std::make_unique<DiscardStatement>());
CaseStatement c; CaseStatement c;
c.set_body(std::move(stmts)); c.set_body(std::move(body));
EXPECT_TRUE(c.IsDefault()); EXPECT_TRUE(c.IsDefault());
} }
@ -114,11 +114,11 @@ TEST_F(CaseStatementTest, IsValid_NullBodyStatement) {
CaseSelectorList b; CaseSelectorList b;
b.push_back(std::make_unique<SintLiteral>(&i32, 2)); b.push_back(std::make_unique<SintLiteral>(&i32, 2));
StatementList stmts; auto body = std::make_unique<BlockStatement>();
stmts.push_back(std::make_unique<DiscardStatement>()); body->append(std::make_unique<DiscardStatement>());
stmts.push_back(nullptr); body->append(nullptr);
CaseStatement c(std::move(b), std::move(stmts)); CaseStatement c(std::move(b), std::move(body));
EXPECT_FALSE(c.IsValid()); EXPECT_FALSE(c.IsValid());
} }
@ -127,10 +127,10 @@ TEST_F(CaseStatementTest, IsValid_InvalidBodyStatement) {
CaseSelectorList b; CaseSelectorList b;
b.push_back(std::make_unique<SintLiteral>(&i32, 2)); b.push_back(std::make_unique<SintLiteral>(&i32, 2));
StatementList stmts; auto body = std::make_unique<BlockStatement>();
stmts.push_back(std::make_unique<IfStatement>()); body->append(std::make_unique<IfStatement>());
CaseStatement c({std::move(b)}, std::move(stmts)); CaseStatement c({std::move(b)}, std::move(body));
EXPECT_FALSE(c.IsValid()); EXPECT_FALSE(c.IsValid());
} }
@ -139,9 +139,9 @@ TEST_F(CaseStatementTest, ToStr_WithSelectors_i32) {
CaseSelectorList b; CaseSelectorList b;
b.push_back(std::make_unique<SintLiteral>(&i32, -2)); b.push_back(std::make_unique<SintLiteral>(&i32, -2));
StatementList stmts; auto body = std::make_unique<BlockStatement>();
stmts.push_back(std::make_unique<DiscardStatement>()); body->append(std::make_unique<DiscardStatement>());
CaseStatement c({std::move(b)}, std::move(stmts)); CaseStatement c({std::move(b)}, std::move(body));
std::ostringstream out; std::ostringstream out;
c.to_str(out, 2); c.to_str(out, 2);
@ -156,9 +156,9 @@ TEST_F(CaseStatementTest, ToStr_WithSelectors_u32) {
CaseSelectorList b; CaseSelectorList b;
b.push_back(std::make_unique<UintLiteral>(&u32, 2)); b.push_back(std::make_unique<UintLiteral>(&u32, 2));
StatementList stmts; auto body = std::make_unique<BlockStatement>();
stmts.push_back(std::make_unique<DiscardStatement>()); body->append(std::make_unique<DiscardStatement>());
CaseStatement c({std::move(b)}, std::move(stmts)); CaseStatement c({std::move(b)}, std::move(body));
std::ostringstream out; std::ostringstream out;
c.to_str(out, 2); c.to_str(out, 2);
@ -174,9 +174,10 @@ TEST_F(CaseStatementTest, ToStr_WithMultipleSelectors) {
CaseSelectorList b; CaseSelectorList b;
b.push_back(std::make_unique<SintLiteral>(&i32, 1)); b.push_back(std::make_unique<SintLiteral>(&i32, 1));
b.push_back(std::make_unique<SintLiteral>(&i32, 2)); b.push_back(std::make_unique<SintLiteral>(&i32, 2));
StatementList stmts;
stmts.push_back(std::make_unique<DiscardStatement>()); auto body = std::make_unique<BlockStatement>();
CaseStatement c(std::move(b), std::move(stmts)); body->append(std::make_unique<DiscardStatement>());
CaseStatement c(std::move(b), std::move(body));
std::ostringstream out; std::ostringstream out;
c.to_str(out, 2); c.to_str(out, 2);
@ -187,9 +188,9 @@ TEST_F(CaseStatementTest, ToStr_WithMultipleSelectors) {
} }
TEST_F(CaseStatementTest, ToStr_WithoutSelectors) { TEST_F(CaseStatementTest, ToStr_WithoutSelectors) {
StatementList stmts; auto body = std::make_unique<BlockStatement>();
stmts.push_back(std::make_unique<DiscardStatement>()); body->append(std::make_unique<DiscardStatement>());
CaseStatement c(CaseSelectorList{}, std::move(stmts)); CaseStatement c(CaseSelectorList{}, std::move(body));
std::ostringstream out; std::ostringstream out;
c.to_str(out, 2); c.to_str(out, 2);

View File

@ -200,8 +200,11 @@ void Function::to_str(std::ostream& out, size_t indent) const {
make_indent(out, indent); make_indent(out, indent);
out << "{" << std::endl; out << "{" << std::endl;
for (const auto& stmt : *body_) if (body_ != nullptr) {
for (const auto& stmt : *body_) {
stmt->to_str(out, indent + 2); stmt->to_str(out, indent + 2);
}
}
make_indent(out, indent); make_indent(out, indent);
out << "}" << std::endl; out << "}" << std::endl;

View File

@ -36,8 +36,8 @@ TEST_F(SwitchStatementTest, Creation) {
auto ident = std::make_unique<IdentifierExpression>("ident"); auto ident = std::make_unique<IdentifierExpression>("ident");
CaseStatementList body; CaseStatementList body;
body.push_back( body.push_back(std::make_unique<CaseStatement>(
std::make_unique<CaseStatement>(std::move(lit), StatementList())); std::move(lit), std::make_unique<ast::BlockStatement>()));
auto* ident_ptr = ident.get(); auto* ident_ptr = ident.get();
auto* case_ptr = body[0].get(); auto* case_ptr = body[0].get();
@ -70,8 +70,8 @@ TEST_F(SwitchStatementTest, IsValid) {
auto ident = std::make_unique<IdentifierExpression>("ident"); auto ident = std::make_unique<IdentifierExpression>("ident");
CaseStatementList body; CaseStatementList body;
body.push_back( body.push_back(std::make_unique<CaseStatement>(
std::make_unique<CaseStatement>(std::move(lit), StatementList())); std::move(lit), std::make_unique<ast::BlockStatement>()));
SwitchStatement stmt(std::move(ident), std::move(body)); SwitchStatement stmt(std::move(ident), std::move(body));
EXPECT_TRUE(stmt.IsValid()); EXPECT_TRUE(stmt.IsValid());
@ -84,8 +84,8 @@ TEST_F(SwitchStatementTest, IsValid_Null_Condition) {
lit.push_back(std::make_unique<SintLiteral>(&i32, 2)); lit.push_back(std::make_unique<SintLiteral>(&i32, 2));
CaseStatementList body; CaseStatementList body;
body.push_back( body.push_back(std::make_unique<CaseStatement>(
std::make_unique<CaseStatement>(std::move(lit), StatementList())); std::move(lit), std::make_unique<ast::BlockStatement>()));
SwitchStatement stmt; SwitchStatement stmt;
stmt.set_body(std::move(body)); stmt.set_body(std::move(body));
@ -100,8 +100,8 @@ TEST_F(SwitchStatementTest, IsValid_Invalid_Condition) {
auto ident = std::make_unique<IdentifierExpression>(""); auto ident = std::make_unique<IdentifierExpression>("");
CaseStatementList body; CaseStatementList body;
body.push_back( body.push_back(std::make_unique<CaseStatement>(
std::make_unique<CaseStatement>(std::move(lit), StatementList())); std::move(lit), std::make_unique<ast::BlockStatement>()));
SwitchStatement stmt(std::move(ident), std::move(body)); SwitchStatement stmt(std::move(ident), std::move(body));
EXPECT_FALSE(stmt.IsValid()); EXPECT_FALSE(stmt.IsValid());
@ -115,8 +115,8 @@ TEST_F(SwitchStatementTest, IsValid_Null_BodyStatement) {
auto ident = std::make_unique<IdentifierExpression>("ident"); auto ident = std::make_unique<IdentifierExpression>("ident");
CaseStatementList body; CaseStatementList body;
body.push_back( body.push_back(std::make_unique<CaseStatement>(
std::make_unique<CaseStatement>(std::move(lit), StatementList())); std::move(lit), std::make_unique<ast::BlockStatement>()));
body.push_back(nullptr); body.push_back(nullptr);
SwitchStatement stmt(std::move(ident), std::move(body)); SwitchStatement stmt(std::move(ident), std::move(body));
@ -126,8 +126,8 @@ TEST_F(SwitchStatementTest, IsValid_Null_BodyStatement) {
TEST_F(SwitchStatementTest, IsValid_Invalid_BodyStatement) { TEST_F(SwitchStatementTest, IsValid_Invalid_BodyStatement) {
auto ident = std::make_unique<IdentifierExpression>("ident"); auto ident = std::make_unique<IdentifierExpression>("ident");
StatementList case_body; auto case_body = std::make_unique<ast::BlockStatement>();
case_body.push_back(nullptr); case_body->append(nullptr);
CaseStatementList body; CaseStatementList body;
body.push_back(std::make_unique<CaseStatement>(CaseSelectorList{}, body.push_back(std::make_unique<CaseStatement>(CaseSelectorList{},
@ -159,8 +159,8 @@ TEST_F(SwitchStatementTest, ToStr) {
auto ident = std::make_unique<IdentifierExpression>("ident"); auto ident = std::make_unique<IdentifierExpression>("ident");
CaseStatementList body; CaseStatementList body;
body.push_back( body.push_back(std::make_unique<CaseStatement>(
std::make_unique<CaseStatement>(std::move(lit), StatementList())); std::move(lit), std::make_unique<ast::BlockStatement>()));
SwitchStatement stmt(std::move(ident), std::move(body)); SwitchStatement stmt(std::move(ident), std::move(body));
std::ostringstream out; std::ostringstream out;

View File

@ -29,8 +29,8 @@ TEST_F(ParserImplTest, SwitchBody_Case) {
ASSERT_NE(e, nullptr); ASSERT_NE(e, nullptr);
ASSERT_TRUE(e->IsCase()); ASSERT_TRUE(e->IsCase());
EXPECT_FALSE(e->IsDefault()); EXPECT_FALSE(e->IsDefault());
ASSERT_EQ(e->body().size(), 1u); ASSERT_EQ(e->body()->size(), 1u);
EXPECT_TRUE(e->body()[0]->IsAssign()); EXPECT_TRUE(e->body()->get(0)->IsAssign());
} }
TEST_F(ParserImplTest, SwitchBody_Case_InvalidConstLiteral) { TEST_F(ParserImplTest, SwitchBody_Case_InvalidConstLiteral) {
@ -96,8 +96,8 @@ TEST_F(ParserImplTest, SwitchBody_Default) {
ASSERT_NE(e, nullptr); ASSERT_NE(e, nullptr);
ASSERT_TRUE(e->IsCase()); ASSERT_TRUE(e->IsCase());
EXPECT_TRUE(e->IsDefault()); EXPECT_TRUE(e->IsDefault());
ASSERT_EQ(e->body().size(), 1u); ASSERT_EQ(e->body()->size(), 1u);
EXPECT_TRUE(e->body()[0]->IsAssign()); EXPECT_TRUE(e->body()->get(0)->IsAssign());
} }
TEST_F(ParserImplTest, SwitchBody_Default_MissingColon) { TEST_F(ParserImplTest, SwitchBody_Default_MissingColon) {

View File

@ -145,8 +145,8 @@ TEST_F(TypeDeterminerTest, Stmt_Case) {
std::make_unique<ast::FloatLiteral>(&f32, 2.3f)); std::make_unique<ast::FloatLiteral>(&f32, 2.3f));
auto* rhs_ptr = rhs.get(); auto* rhs_ptr = rhs.get();
ast::StatementList body; auto body = std::make_unique<ast::BlockStatement>();
body.push_back(std::make_unique<ast::AssignmentStatement>(std::move(lhs), body->append(std::make_unique<ast::AssignmentStatement>(std::move(lhs),
std::move(rhs))); std::move(rhs)));
ast::CaseSelectorList lit; ast::CaseSelectorList lit;
@ -339,8 +339,8 @@ TEST_F(TypeDeterminerTest, Stmt_Switch) {
std::make_unique<ast::FloatLiteral>(&f32, 2.3f)); std::make_unique<ast::FloatLiteral>(&f32, 2.3f));
auto* rhs_ptr = rhs.get(); auto* rhs_ptr = rhs.get();
ast::StatementList body; auto body = std::make_unique<ast::BlockStatement>();
body.push_back(std::make_unique<ast::AssignmentStatement>(std::move(lhs), body->append(std::make_unique<ast::AssignmentStatement>(std::move(lhs),
std::move(rhs))); std::move(rhs)));
ast::CaseSelectorList lit; ast::CaseSelectorList lit;

View File

@ -31,12 +31,12 @@ namespace writer {
namespace hlsl { namespace hlsl {
namespace { namespace {
bool last_is_break_or_fallthrough(const ast::StatementList& stmts) { bool last_is_break_or_fallthrough(const ast::BlockStatement* stmts) {
if (stmts.empty()) { if (stmts->empty()) {
return false; return false;
} }
return stmts.back()->IsBreak() || stmts.back()->IsFallthrough(); return stmts->last()->IsBreak() || stmts->last()->IsFallthrough();
} }
} // namespace } // namespace
@ -207,7 +207,7 @@ bool GeneratorImpl::EmitCase(ast::CaseStatement* stmt) {
increment_indent(); increment_indent();
for (const auto& s : stmt->body()) { for (const auto& s : *(stmt->body())) {
if (!EmitStatement(s.get())) { if (!EmitStatement(s.get())) {
return false; return false;
} }

View File

@ -34,8 +34,8 @@ using HlslGeneratorImplTest = testing::Test;
TEST_F(HlslGeneratorImplTest, Emit_Case) { TEST_F(HlslGeneratorImplTest, Emit_Case) {
ast::type::I32Type i32; ast::type::I32Type i32;
ast::StatementList body; auto body = std::make_unique<ast::BlockStatement>();
body.push_back(std::make_unique<ast::BreakStatement>()); body->append(std::make_unique<ast::BreakStatement>());
ast::CaseSelectorList lit; ast::CaseSelectorList lit;
lit.push_back(std::make_unique<ast::SintLiteral>(&i32, 5)); lit.push_back(std::make_unique<ast::SintLiteral>(&i32, 5));
@ -55,11 +55,9 @@ TEST_F(HlslGeneratorImplTest, Emit_Case) {
TEST_F(HlslGeneratorImplTest, Emit_Case_BreaksByDefault) { TEST_F(HlslGeneratorImplTest, Emit_Case_BreaksByDefault) {
ast::type::I32Type i32; ast::type::I32Type i32;
ast::StatementList body;
ast::CaseSelectorList lit; ast::CaseSelectorList lit;
lit.push_back(std::make_unique<ast::SintLiteral>(&i32, 5)); lit.push_back(std::make_unique<ast::SintLiteral>(&i32, 5));
ast::CaseStatement c(std::move(lit), std::move(body)); ast::CaseStatement c(std::move(lit), std::make_unique<ast::BlockStatement>());
ast::Module m; ast::Module m;
GeneratorImpl g(&m); GeneratorImpl g(&m);
@ -75,8 +73,8 @@ TEST_F(HlslGeneratorImplTest, Emit_Case_BreaksByDefault) {
TEST_F(HlslGeneratorImplTest, Emit_Case_WithFallthrough) { TEST_F(HlslGeneratorImplTest, Emit_Case_WithFallthrough) {
ast::type::I32Type i32; ast::type::I32Type i32;
ast::StatementList body; auto body = std::make_unique<ast::BlockStatement>();
body.push_back(std::make_unique<ast::FallthroughStatement>()); body->append(std::make_unique<ast::FallthroughStatement>());
ast::CaseSelectorList lit; ast::CaseSelectorList lit;
lit.push_back(std::make_unique<ast::SintLiteral>(&i32, 5)); lit.push_back(std::make_unique<ast::SintLiteral>(&i32, 5));
@ -96,8 +94,8 @@ TEST_F(HlslGeneratorImplTest, Emit_Case_WithFallthrough) {
TEST_F(HlslGeneratorImplTest, Emit_Case_MultipleSelectors) { TEST_F(HlslGeneratorImplTest, Emit_Case_MultipleSelectors) {
ast::type::I32Type i32; ast::type::I32Type i32;
ast::StatementList body; auto body = std::make_unique<ast::BlockStatement>();
body.push_back(std::make_unique<ast::BreakStatement>()); body->append(std::make_unique<ast::BreakStatement>());
ast::CaseSelectorList lit; ast::CaseSelectorList lit;
lit.push_back(std::make_unique<ast::SintLiteral>(&i32, 5)); lit.push_back(std::make_unique<ast::SintLiteral>(&i32, 5));
@ -119,9 +117,8 @@ TEST_F(HlslGeneratorImplTest, Emit_Case_MultipleSelectors) {
TEST_F(HlslGeneratorImplTest, Emit_Case_Default) { TEST_F(HlslGeneratorImplTest, Emit_Case_Default) {
ast::CaseStatement c; ast::CaseStatement c;
ast::StatementList body; auto body = std::make_unique<ast::BlockStatement>();
body.push_back(std::make_unique<ast::BreakStatement>()); body->append(std::make_unique<ast::BreakStatement>());
c.set_body(std::move(body)); c.set_body(std::move(body));
ast::Module m; ast::Module m;

View File

@ -33,16 +33,16 @@ using HlslGeneratorImplTest = testing::Test;
TEST_F(HlslGeneratorImplTest, Emit_Switch) { TEST_F(HlslGeneratorImplTest, Emit_Switch) {
auto def = std::make_unique<ast::CaseStatement>(); auto def = std::make_unique<ast::CaseStatement>();
ast::StatementList def_body; auto def_body = std::make_unique<ast::BlockStatement>();
def_body.push_back(std::make_unique<ast::BreakStatement>()); def_body->append(std::make_unique<ast::BreakStatement>());
def->set_body(std::move(def_body)); def->set_body(std::move(def_body));
ast::type::I32Type i32; ast::type::I32Type i32;
ast::CaseSelectorList case_val; ast::CaseSelectorList case_val;
case_val.push_back(std::make_unique<ast::SintLiteral>(&i32, 5)); case_val.push_back(std::make_unique<ast::SintLiteral>(&i32, 5));
ast::StatementList case_body; auto case_body = std::make_unique<ast::BlockStatement>();
case_body.push_back(std::make_unique<ast::BreakStatement>()); case_body->append(std::make_unique<ast::BreakStatement>());
auto case_stmt = std::make_unique<ast::CaseStatement>(std::move(case_val), auto case_stmt = std::make_unique<ast::CaseStatement>(std::move(case_val),
std::move(case_body)); std::move(case_body));

View File

@ -66,12 +66,12 @@ const char kOutStructNameSuffix[] = "out";
const char kTintStructInVarPrefix[] = "tint_in"; const char kTintStructInVarPrefix[] = "tint_in";
const char kTintStructOutVarPrefix[] = "tint_out"; const char kTintStructOutVarPrefix[] = "tint_out";
bool last_is_break_or_fallthrough(const ast::StatementList& stmts) { bool last_is_break_or_fallthrough(const ast::BlockStatement* stmts) {
if (stmts.empty()) { if (stmts->empty()) {
return false; return false;
} }
return stmts.back()->IsBreak() || stmts.back()->IsFallthrough(); return stmts->last()->IsBreak() || stmts->last()->IsFallthrough();
} }
uint32_t adjust_for_alignment(uint32_t count, uint32_t alignment) { uint32_t adjust_for_alignment(uint32_t count, uint32_t alignment) {
@ -755,7 +755,7 @@ bool GeneratorImpl::EmitCase(ast::CaseStatement* stmt) {
increment_indent(); increment_indent();
for (const auto& s : stmt->body()) { for (const auto& s : *(stmt->body())) {
if (!EmitStatement(s.get())) { if (!EmitStatement(s.get())) {
return false; return false;
} }

View File

@ -34,8 +34,8 @@ using MslGeneratorImplTest = testing::Test;
TEST_F(MslGeneratorImplTest, Emit_Case) { TEST_F(MslGeneratorImplTest, Emit_Case) {
ast::type::I32Type i32; ast::type::I32Type i32;
ast::StatementList body; auto body = std::make_unique<ast::BlockStatement>();
body.push_back(std::make_unique<ast::BreakStatement>()); body->append(std::make_unique<ast::BreakStatement>());
ast::CaseSelectorList lit; ast::CaseSelectorList lit;
lit.push_back(std::make_unique<ast::SintLiteral>(&i32, 5)); lit.push_back(std::make_unique<ast::SintLiteral>(&i32, 5));
@ -55,11 +55,9 @@ TEST_F(MslGeneratorImplTest, Emit_Case) {
TEST_F(MslGeneratorImplTest, Emit_Case_BreaksByDefault) { TEST_F(MslGeneratorImplTest, Emit_Case_BreaksByDefault) {
ast::type::I32Type i32; ast::type::I32Type i32;
ast::StatementList body;
ast::CaseSelectorList lit; ast::CaseSelectorList lit;
lit.push_back(std::make_unique<ast::SintLiteral>(&i32, 5)); lit.push_back(std::make_unique<ast::SintLiteral>(&i32, 5));
ast::CaseStatement c(std::move(lit), std::move(body)); ast::CaseStatement c(std::move(lit), std::make_unique<ast::BlockStatement>());
ast::Module m; ast::Module m;
GeneratorImpl g(&m); GeneratorImpl g(&m);
@ -75,8 +73,8 @@ TEST_F(MslGeneratorImplTest, Emit_Case_BreaksByDefault) {
TEST_F(MslGeneratorImplTest, Emit_Case_WithFallthrough) { TEST_F(MslGeneratorImplTest, Emit_Case_WithFallthrough) {
ast::type::I32Type i32; ast::type::I32Type i32;
ast::StatementList body; auto body = std::make_unique<ast::BlockStatement>();
body.push_back(std::make_unique<ast::FallthroughStatement>()); body->append(std::make_unique<ast::FallthroughStatement>());
ast::CaseSelectorList lit; ast::CaseSelectorList lit;
lit.push_back(std::make_unique<ast::SintLiteral>(&i32, 5)); lit.push_back(std::make_unique<ast::SintLiteral>(&i32, 5));
@ -96,8 +94,8 @@ TEST_F(MslGeneratorImplTest, Emit_Case_WithFallthrough) {
TEST_F(MslGeneratorImplTest, Emit_Case_MultipleSelectors) { TEST_F(MslGeneratorImplTest, Emit_Case_MultipleSelectors) {
ast::type::I32Type i32; ast::type::I32Type i32;
ast::StatementList body; auto body = std::make_unique<ast::BlockStatement>();
body.push_back(std::make_unique<ast::BreakStatement>()); body->append(std::make_unique<ast::BreakStatement>());
ast::CaseSelectorList lit; ast::CaseSelectorList lit;
lit.push_back(std::make_unique<ast::SintLiteral>(&i32, 5)); lit.push_back(std::make_unique<ast::SintLiteral>(&i32, 5));
@ -119,9 +117,8 @@ TEST_F(MslGeneratorImplTest, Emit_Case_MultipleSelectors) {
TEST_F(MslGeneratorImplTest, Emit_Case_Default) { TEST_F(MslGeneratorImplTest, Emit_Case_Default) {
ast::CaseStatement c; ast::CaseStatement c;
ast::StatementList body; auto body = std::make_unique<ast::BlockStatement>();
body.push_back(std::make_unique<ast::BreakStatement>()); body->append(std::make_unique<ast::BreakStatement>());
c.set_body(std::move(body)); c.set_body(std::move(body));
ast::Module m; ast::Module m;

View File

@ -33,16 +33,16 @@ using MslGeneratorImplTest = testing::Test;
TEST_F(MslGeneratorImplTest, Emit_Switch) { TEST_F(MslGeneratorImplTest, Emit_Switch) {
auto def = std::make_unique<ast::CaseStatement>(); auto def = std::make_unique<ast::CaseStatement>();
ast::StatementList def_body; auto def_body = std::make_unique<ast::BlockStatement>();
def_body.push_back(std::make_unique<ast::BreakStatement>()); def_body->append(std::make_unique<ast::BreakStatement>());
def->set_body(std::move(def_body)); def->set_body(std::move(def_body));
ast::type::I32Type i32; ast::type::I32Type i32;
ast::CaseSelectorList case_val; ast::CaseSelectorList case_val;
case_val.push_back(std::make_unique<ast::SintLiteral>(&i32, 5)); case_val.push_back(std::make_unique<ast::SintLiteral>(&i32, 5));
ast::StatementList case_body; auto case_body = std::make_unique<ast::BlockStatement>();
case_body.push_back(std::make_unique<ast::BreakStatement>()); case_body->append(std::make_unique<ast::BreakStatement>());
auto case_stmt = std::make_unique<ast::CaseStatement>(std::move(case_val), auto case_stmt = std::make_unique<ast::CaseStatement>(std::move(case_val),
std::move(case_body)); std::move(case_body));

View File

@ -93,13 +93,23 @@ uint32_t pipeline_stage_to_execution_model(ast::PipelineStage stage) {
return model; return model;
} }
bool LastIsFallthrough(const ast::StatementList& stmts) { bool LastIsFallthrough(const ast::BlockStatement* stmts) {
return !stmts.empty() && stmts.back()->IsFallthrough(); return !stmts->empty() && stmts->last()->IsFallthrough();
} }
// A terminator is anything which will case a SPIR-V terminator to be emitted. // A terminator is anything which will case a SPIR-V terminator to be emitted.
// This means things like breaks, fallthroughs and continues which all emit an // This means things like breaks, fallthroughs and continues which all emit an
// OpBranch or return for the OpReturn emission. // OpBranch or return for the OpReturn emission.
bool LastIsTerminator(const ast::BlockStatement* stmts) {
if (stmts->empty()) {
return false;
}
auto* last = stmts->last();
return last->IsBreak() || last->IsContinue() || last->IsDiscard() ||
last->IsReturn() || last->IsFallthrough();
}
bool LastIsTerminator(const ast::StatementList& stmts) { bool LastIsTerminator(const ast::StatementList& stmts) {
if (stmts.empty()) { if (stmts.empty()) {
return false; return false;
@ -1339,7 +1349,7 @@ uint32_t Builder::GenerateBinaryExpression(ast::BinaryExpression* expr) {
return result_id; return result_id;
} }
bool Builder::GenerateBlockStatement(ast::BlockStatement* stmt) { bool Builder::GenerateBlockStatement(const ast::BlockStatement* stmt) {
scope_stack_.push_scope(); scope_stack_.push_scope();
for (const auto& block_stmt : *stmt) { for (const auto& block_stmt : *stmt) {
if (!GenerateStatement(block_stmt.get())) { if (!GenerateStatement(block_stmt.get())) {
@ -1720,7 +1730,7 @@ bool Builder::GenerateSwitchStatement(ast::SwitchStatement* stmt) {
} }
GenerateLabel(case_ids[i]); GenerateLabel(case_ids[i]);
if (!GenerateStatementList(item->body())) { if (!GenerateBlockStatement(item->body())) {
return false; return false;
} }

View File

@ -170,7 +170,7 @@ class Builder {
/// Generates a block statement /// Generates a block statement
/// @param stmt the statement to generate /// @param stmt the statement to generate
/// @returns true if the statement was successfully generated /// @returns true if the statement was successfully generated
bool GenerateBlockStatement(ast::BlockStatement* stmt); bool GenerateBlockStatement(const ast::BlockStatement* stmt);
/// Generates a break statement /// Generates a break statement
/// @param stmt the statement to generate /// @param stmt the statement to generate
/// @returns true if the statement was successfully generated /// @returns true if the statement was successfully generated

View File

@ -85,14 +85,14 @@ TEST_F(BuilderTest, Switch_WithCase) {
auto a = auto a =
std::make_unique<ast::Variable>("a", ast::StorageClass::kPrivate, &i32); std::make_unique<ast::Variable>("a", ast::StorageClass::kPrivate, &i32);
ast::StatementList case_1_body; auto case_1_body = std::make_unique<ast::BlockStatement>();
case_1_body.push_back(std::make_unique<ast::AssignmentStatement>( case_1_body->append(std::make_unique<ast::AssignmentStatement>(
std::make_unique<ast::IdentifierExpression>("v"), std::make_unique<ast::IdentifierExpression>("v"),
std::make_unique<ast::ScalarConstructorExpression>( std::make_unique<ast::ScalarConstructorExpression>(
std::make_unique<ast::SintLiteral>(&i32, 1)))); std::make_unique<ast::SintLiteral>(&i32, 1))));
ast::StatementList case_2_body; auto case_2_body = std::make_unique<ast::BlockStatement>();
case_2_body.push_back(std::make_unique<ast::AssignmentStatement>( case_2_body->append(std::make_unique<ast::AssignmentStatement>(
std::make_unique<ast::IdentifierExpression>("v"), std::make_unique<ast::IdentifierExpression>("v"),
std::make_unique<ast::ScalarConstructorExpression>( std::make_unique<ast::ScalarConstructorExpression>(
std::make_unique<ast::SintLiteral>(&i32, 2)))); std::make_unique<ast::SintLiteral>(&i32, 2))));
@ -170,8 +170,8 @@ TEST_F(BuilderTest, Switch_WithDefault) {
auto a = auto a =
std::make_unique<ast::Variable>("a", ast::StorageClass::kPrivate, &i32); std::make_unique<ast::Variable>("a", ast::StorageClass::kPrivate, &i32);
ast::StatementList default_body; auto default_body = std::make_unique<ast::BlockStatement>();
default_body.push_back(std::make_unique<ast::AssignmentStatement>( default_body->append(std::make_unique<ast::AssignmentStatement>(
std::make_unique<ast::IdentifierExpression>("v"), std::make_unique<ast::IdentifierExpression>("v"),
std::make_unique<ast::ScalarConstructorExpression>( std::make_unique<ast::ScalarConstructorExpression>(
std::make_unique<ast::SintLiteral>(&i32, 1)))); std::make_unique<ast::SintLiteral>(&i32, 1))));
@ -239,20 +239,20 @@ TEST_F(BuilderTest, Switch_WithCaseAndDefault) {
auto a = auto a =
std::make_unique<ast::Variable>("a", ast::StorageClass::kPrivate, &i32); std::make_unique<ast::Variable>("a", ast::StorageClass::kPrivate, &i32);
ast::StatementList case_1_body; auto case_1_body = std::make_unique<ast::BlockStatement>();
case_1_body.push_back(std::make_unique<ast::AssignmentStatement>( case_1_body->append(std::make_unique<ast::AssignmentStatement>(
std::make_unique<ast::IdentifierExpression>("v"), std::make_unique<ast::IdentifierExpression>("v"),
std::make_unique<ast::ScalarConstructorExpression>( std::make_unique<ast::ScalarConstructorExpression>(
std::make_unique<ast::SintLiteral>(&i32, 1)))); std::make_unique<ast::SintLiteral>(&i32, 1))));
ast::StatementList case_2_body; auto case_2_body = std::make_unique<ast::BlockStatement>();
case_2_body.push_back(std::make_unique<ast::AssignmentStatement>( case_2_body->append(std::make_unique<ast::AssignmentStatement>(
std::make_unique<ast::IdentifierExpression>("v"), std::make_unique<ast::IdentifierExpression>("v"),
std::make_unique<ast::ScalarConstructorExpression>( std::make_unique<ast::ScalarConstructorExpression>(
std::make_unique<ast::SintLiteral>(&i32, 2)))); std::make_unique<ast::SintLiteral>(&i32, 2))));
ast::StatementList default_body; auto default_body = std::make_unique<ast::BlockStatement>();
default_body.push_back(std::make_unique<ast::AssignmentStatement>( default_body->append(std::make_unique<ast::AssignmentStatement>(
std::make_unique<ast::IdentifierExpression>("v"), std::make_unique<ast::IdentifierExpression>("v"),
std::make_unique<ast::ScalarConstructorExpression>( std::make_unique<ast::ScalarConstructorExpression>(
std::make_unique<ast::SintLiteral>(&i32, 3)))); std::make_unique<ast::SintLiteral>(&i32, 3))));
@ -340,21 +340,21 @@ TEST_F(BuilderTest, Switch_CaseWithFallthrough) {
auto a = auto a =
std::make_unique<ast::Variable>("a", ast::StorageClass::kPrivate, &i32); std::make_unique<ast::Variable>("a", ast::StorageClass::kPrivate, &i32);
ast::StatementList case_1_body; auto case_1_body = std::make_unique<ast::BlockStatement>();
case_1_body.push_back(std::make_unique<ast::AssignmentStatement>( case_1_body->append(std::make_unique<ast::AssignmentStatement>(
std::make_unique<ast::IdentifierExpression>("v"), std::make_unique<ast::IdentifierExpression>("v"),
std::make_unique<ast::ScalarConstructorExpression>( std::make_unique<ast::ScalarConstructorExpression>(
std::make_unique<ast::SintLiteral>(&i32, 1)))); std::make_unique<ast::SintLiteral>(&i32, 1))));
case_1_body.push_back(std::make_unique<ast::FallthroughStatement>()); case_1_body->append(std::make_unique<ast::FallthroughStatement>());
ast::StatementList case_2_body; auto case_2_body = std::make_unique<ast::BlockStatement>();
case_2_body.push_back(std::make_unique<ast::AssignmentStatement>( case_2_body->append(std::make_unique<ast::AssignmentStatement>(
std::make_unique<ast::IdentifierExpression>("v"), std::make_unique<ast::IdentifierExpression>("v"),
std::make_unique<ast::ScalarConstructorExpression>( std::make_unique<ast::ScalarConstructorExpression>(
std::make_unique<ast::SintLiteral>(&i32, 2)))); std::make_unique<ast::SintLiteral>(&i32, 2))));
ast::StatementList default_body; auto default_body = std::make_unique<ast::BlockStatement>();
default_body.push_back(std::make_unique<ast::AssignmentStatement>( default_body->append(std::make_unique<ast::AssignmentStatement>(
std::make_unique<ast::IdentifierExpression>("v"), std::make_unique<ast::IdentifierExpression>("v"),
std::make_unique<ast::ScalarConstructorExpression>( std::make_unique<ast::ScalarConstructorExpression>(
std::make_unique<ast::SintLiteral>(&i32, 3)))); std::make_unique<ast::SintLiteral>(&i32, 3))));
@ -437,12 +437,12 @@ TEST_F(BuilderTest, Switch_CaseFallthroughLastStatement) {
auto a = auto a =
std::make_unique<ast::Variable>("a", ast::StorageClass::kPrivate, &i32); std::make_unique<ast::Variable>("a", ast::StorageClass::kPrivate, &i32);
ast::StatementList case_1_body; auto case_1_body = std::make_unique<ast::BlockStatement>();
case_1_body.push_back(std::make_unique<ast::AssignmentStatement>( case_1_body->append(std::make_unique<ast::AssignmentStatement>(
std::make_unique<ast::IdentifierExpression>("v"), std::make_unique<ast::IdentifierExpression>("v"),
std::make_unique<ast::ScalarConstructorExpression>( std::make_unique<ast::ScalarConstructorExpression>(
std::make_unique<ast::SintLiteral>(&i32, 1)))); std::make_unique<ast::SintLiteral>(&i32, 1))));
case_1_body.push_back(std::make_unique<ast::FallthroughStatement>()); case_1_body->append(std::make_unique<ast::FallthroughStatement>());
ast::CaseSelectorList selector_1; ast::CaseSelectorList selector_1;
selector_1.push_back(std::make_unique<ast::SintLiteral>(&i32, 1)); selector_1.push_back(std::make_unique<ast::SintLiteral>(&i32, 1));
@ -492,13 +492,13 @@ TEST_F(BuilderTest, Switch_WithNestedBreak) {
ast::StatementList if_body; ast::StatementList if_body;
if_body.push_back(std::make_unique<ast::BreakStatement>()); if_body.push_back(std::make_unique<ast::BreakStatement>());
ast::StatementList case_1_body; auto case_1_body = std::make_unique<ast::BlockStatement>();
case_1_body.push_back(std::make_unique<ast::IfStatement>( case_1_body->append(std::make_unique<ast::IfStatement>(
std::make_unique<ast::ScalarConstructorExpression>( std::make_unique<ast::ScalarConstructorExpression>(
std::make_unique<ast::BoolLiteral>(&bool_type, true)), std::make_unique<ast::BoolLiteral>(&bool_type, true)),
std::move(if_body))); std::move(if_body)));
case_1_body.push_back(std::make_unique<ast::AssignmentStatement>( case_1_body->append(std::make_unique<ast::AssignmentStatement>(
std::make_unique<ast::IdentifierExpression>("v"), std::make_unique<ast::IdentifierExpression>("v"),
std::make_unique<ast::ScalarConstructorExpression>( std::make_unique<ast::ScalarConstructorExpression>(
std::make_unique<ast::SintLiteral>(&i32, 1)))); std::make_unique<ast::SintLiteral>(&i32, 1))));

View File

@ -600,7 +600,7 @@ bool GeneratorImpl::EmitUnaryOp(ast::UnaryOpExpression* expr) {
return true; return true;
} }
bool GeneratorImpl::EmitBlock(ast::BlockStatement* stmt) { bool GeneratorImpl::EmitBlock(const ast::BlockStatement* stmt) {
out_ << "{" << std::endl; out_ << "{" << std::endl;
increment_indent(); increment_indent();
@ -617,7 +617,8 @@ bool GeneratorImpl::EmitBlock(ast::BlockStatement* stmt) {
return true; return true;
} }
bool GeneratorImpl::EmitIndentedBlockAndNewline(ast::BlockStatement* stmt) { bool GeneratorImpl::EmitIndentedBlockAndNewline(
const ast::BlockStatement* stmt) {
make_indent(); make_indent();
const bool result = EmitBlock(stmt); const bool result = EmitBlock(stmt);
if (result) { if (result) {
@ -626,7 +627,7 @@ bool GeneratorImpl::EmitIndentedBlockAndNewline(ast::BlockStatement* stmt) {
return result; return result;
} }
bool GeneratorImpl::EmitBlockAndNewline(ast::BlockStatement* stmt) { bool GeneratorImpl::EmitBlockAndNewline(const ast::BlockStatement* stmt) {
const bool result = EmitBlock(stmt); const bool result = EmitBlock(stmt);
if (result) { if (result) {
out_ << std::endl; out_ << std::endl;
@ -736,7 +737,7 @@ bool GeneratorImpl::EmitCase(ast::CaseStatement* stmt) {
make_indent(); make_indent();
if (stmt->IsDefault()) { if (stmt->IsDefault()) {
out_ << "default:"; out_ << "default";
} else { } else {
out_ << "case "; out_ << "case ";
@ -752,10 +753,10 @@ bool GeneratorImpl::EmitCase(ast::CaseStatement* stmt) {
} }
} }
out_ << ":";
} }
out_ << ": ";
return EmitStatementBlockAndNewline(stmt->body()); return EmitBlockAndNewline(stmt->body());
} }
bool GeneratorImpl::EmitContinue(ast::ContinueStatement*) { bool GeneratorImpl::EmitContinue(ast::ContinueStatement*) {

View File

@ -70,15 +70,15 @@ class GeneratorImpl : public TextGenerator {
/// Handles a block statement /// Handles a block statement
/// @param stmt the statement to emit /// @param stmt the statement to emit
/// @returns true if the statement was emitted successfully /// @returns true if the statement was emitted successfully
bool EmitBlock(ast::BlockStatement* stmt); bool EmitBlock(const ast::BlockStatement* stmt);
/// Handles a block statement with a newline at the end /// Handles a block statement with a newline at the end
/// @param stmt the statement to emit /// @param stmt the statement to emit
/// @returns true if the statement was emitted successfully /// @returns true if the statement was emitted successfully
bool EmitIndentedBlockAndNewline(ast::BlockStatement* stmt); bool EmitIndentedBlockAndNewline(const ast::BlockStatement* stmt);
/// Handles a block statement with a newline at the end /// Handles a block statement with a newline at the end
/// @param stmt the statement to emit /// @param stmt the statement to emit
/// @returns true if the statement was emitted successfully /// @returns true if the statement was emitted successfully
bool EmitBlockAndNewline(ast::BlockStatement* stmt); bool EmitBlockAndNewline(const ast::BlockStatement* stmt);
/// Handles a break statement /// Handles a break statement
/// @param stmt the statement to emit /// @param stmt the statement to emit
/// @returns true if the statement was emitted successfully /// @returns true if the statement was emitted successfully

View File

@ -32,8 +32,8 @@ using WgslGeneratorImplTest = testing::Test;
TEST_F(WgslGeneratorImplTest, Emit_Case) { TEST_F(WgslGeneratorImplTest, Emit_Case) {
ast::type::I32Type i32; ast::type::I32Type i32;
ast::StatementList body; auto body = std::make_unique<ast::BlockStatement>();
body.push_back(std::make_unique<ast::BreakStatement>()); body->append(std::make_unique<ast::BreakStatement>());
ast::CaseSelectorList lit; ast::CaseSelectorList lit;
lit.push_back(std::make_unique<ast::SintLiteral>(&i32, 5)); lit.push_back(std::make_unique<ast::SintLiteral>(&i32, 5));
@ -52,8 +52,8 @@ TEST_F(WgslGeneratorImplTest, Emit_Case) {
TEST_F(WgslGeneratorImplTest, Emit_Case_MultipleSelectors) { TEST_F(WgslGeneratorImplTest, Emit_Case_MultipleSelectors) {
ast::type::I32Type i32; ast::type::I32Type i32;
ast::StatementList body; auto body = std::make_unique<ast::BlockStatement>();
body.push_back(std::make_unique<ast::BreakStatement>()); body->append(std::make_unique<ast::BreakStatement>());
ast::CaseSelectorList lit; ast::CaseSelectorList lit;
lit.push_back(std::make_unique<ast::SintLiteral>(&i32, 5)); lit.push_back(std::make_unique<ast::SintLiteral>(&i32, 5));
@ -73,9 +73,8 @@ TEST_F(WgslGeneratorImplTest, Emit_Case_MultipleSelectors) {
TEST_F(WgslGeneratorImplTest, Emit_Case_Default) { TEST_F(WgslGeneratorImplTest, Emit_Case_Default) {
ast::CaseStatement c; ast::CaseStatement c;
ast::StatementList body; auto body = std::make_unique<ast::BlockStatement>();
body.push_back(std::make_unique<ast::BreakStatement>()); body->append(std::make_unique<ast::BreakStatement>());
c.set_body(std::move(body)); c.set_body(std::move(body));
GeneratorImpl g; GeneratorImpl g;

View File

@ -32,16 +32,16 @@ using WgslGeneratorImplTest = testing::Test;
TEST_F(WgslGeneratorImplTest, Emit_Switch) { TEST_F(WgslGeneratorImplTest, Emit_Switch) {
auto def = std::make_unique<ast::CaseStatement>(); auto def = std::make_unique<ast::CaseStatement>();
ast::StatementList def_body; auto def_body = std::make_unique<ast::BlockStatement>();
def_body.push_back(std::make_unique<ast::BreakStatement>()); def_body->append(std::make_unique<ast::BreakStatement>());
def->set_body(std::move(def_body)); def->set_body(std::move(def_body));
ast::type::I32Type i32; ast::type::I32Type i32;
ast::CaseSelectorList case_val; ast::CaseSelectorList case_val;
case_val.push_back(std::make_unique<ast::SintLiteral>(&i32, 5)); case_val.push_back(std::make_unique<ast::SintLiteral>(&i32, 5));
ast::StatementList case_body; auto case_body = std::make_unique<ast::BlockStatement>();
case_body.push_back(std::make_unique<ast::BreakStatement>()); case_body->append(std::make_unique<ast::BreakStatement>());
auto case_stmt = std::make_unique<ast::CaseStatement>(std::move(case_val), auto case_stmt = std::make_unique<ast::CaseStatement>(std::move(case_val),
std::move(case_body)); std::move(case_body));