[wgsl-reader] Update to create BlockStatements

This CL updates the WGSL Reader to create BlockStatements instead of
StatementLists.

Bug: tint:135
Change-Id: Ifda394023553a625dad67be7d4e0dc815292282a
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/25724
Reviewed-by: Sarah Mashayekhi <sarahmashay@google.com>
diff --git a/src/reader/wgsl/parser_impl.cc b/src/reader/wgsl/parser_impl.cc
index b61d721..2a9b4c9 100644
--- a/src/reader/wgsl/parser_impl.cc
+++ b/src/reader/wgsl/parser_impl.cc
@@ -1351,7 +1351,7 @@
 
 // body_stmt
 //   : BRACKET_LEFT statements BRACKET_RIGHT
-ast::StatementList ParserImpl::body_stmt() {
+std::unique_ptr<ast::BlockStatement> ParserImpl::body_stmt() {
   auto t = peek();
   if (!t.IsBraceLeft())
     return {};
@@ -1400,8 +1400,8 @@
 
 // statements
 //   : statement*
-ast::StatementList ParserImpl::statements() {
-  ast::StatementList ret;
+std::unique_ptr<ast::BlockStatement> ParserImpl::statements() {
+  auto ret = std::make_unique<ast::BlockStatement>();
 
   for (;;) {
     auto stmt = statement();
@@ -1410,7 +1410,7 @@
     if (stmt == nullptr)
       break;
 
-    ret.push_back(std::move(stmt));
+    ret->append(std::move(stmt));
   }
 
   return ret;
@@ -1857,8 +1857,8 @@
 //   :
 //   | statement case_body
 //   | FALLTHROUGH SEMICOLON
-ast::StatementList ParserImpl::case_body() {
-  ast::StatementList ret;
+std::unique_ptr<ast::BlockStatement> ParserImpl::case_body() {
+  auto ret = std::make_unique<ast::BlockStatement>();
   for (;;) {
     auto t = peek();
     if (t.IsFallthrough()) {
@@ -1871,7 +1871,7 @@
         return {};
       }
 
-      ret.push_back(std::make_unique<ast::FallthroughStatement>(source));
+      ret->append(std::make_unique<ast::FallthroughStatement>(source));
       break;
     }
 
@@ -1881,7 +1881,7 @@
     if (stmt == nullptr)
       break;
 
-    ret.push_back(std::move(stmt));
+    ret->append(std::move(stmt));
   }
 
   return ret;
@@ -1980,10 +1980,11 @@
 
 // continuing_stmt
 //   : CONTINUING body_stmt
-ast::StatementList ParserImpl::continuing_stmt() {
+std::unique_ptr<ast::BlockStatement> ParserImpl::continuing_stmt() {
   auto t = peek();
-  if (!t.IsContinuing())
-    return {};
+  if (!t.IsContinuing()) {
+    return std::make_unique<ast::BlockStatement>();
+  }
 
   next();  // Consume the peek
   return body_stmt();
diff --git a/src/reader/wgsl/parser_impl.h b/src/reader/wgsl/parser_impl.h
index af76bbb..f31f0b9 100644
--- a/src/reader/wgsl/parser_impl.h
+++ b/src/reader/wgsl/parser_impl.h
@@ -177,13 +177,13 @@
   ast::PipelineStage pipeline_stage();
   /// Parses a `body_stmt` grammar element
   /// @returns the parsed statements
-  ast::StatementList body_stmt();
+  std::unique_ptr<ast::BlockStatement> body_stmt();
   /// Parses a `paren_rhs_stmt` grammar element
   /// @returns the parsed element or nullptr
   std::unique_ptr<ast::Expression> paren_rhs_stmt();
   /// Parses a `statements` grammar element
   /// @returns the statements parsed
-  ast::StatementList statements();
+  std::unique_ptr<ast::BlockStatement> statements();
   /// Parses a `statement` grammar element
   /// @returns the parsed statement or nullptr
   std::unique_ptr<ast::Statement> statement();
@@ -219,7 +219,7 @@
   ast::CaseSelectorList case_selectors();
   /// Parses a `case_body` grammar element
   /// @returns the parsed statements
-  ast::StatementList case_body();
+  std::unique_ptr<ast::BlockStatement> case_body();
   /// Parses a `func_call_stmt` grammar element
   /// @returns the parsed function call or nullptr
   std::unique_ptr<ast::CallStatement> func_call_stmt();
@@ -228,7 +228,7 @@
   std::unique_ptr<ast::LoopStatement> loop_stmt();
   /// Parses a `continuing_stmt` grammar element
   /// @returns the parsed statements
-  ast::StatementList continuing_stmt();
+  std::unique_ptr<ast::BlockStatement> continuing_stmt();
   /// Parses a `const_literal` grammar element
   /// @returns the const literal parsed or nullptr if none found
   std::unique_ptr<ast::Literal> const_literal();
diff --git a/src/reader/wgsl/parser_impl_body_stmt_test.cc b/src/reader/wgsl/parser_impl_body_stmt_test.cc
index ae0952b..1bd1fbe 100644
--- a/src/reader/wgsl/parser_impl_body_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_body_stmt_test.cc
@@ -28,16 +28,16 @@
 })");
   auto e = p->body_stmt();
   ASSERT_FALSE(p->has_error()) << p->error();
-  ASSERT_EQ(e.size(), 2u);
-  EXPECT_TRUE(e[0]->IsDiscard());
-  EXPECT_TRUE(e[1]->IsReturn());
+  ASSERT_EQ(e->size(), 2u);
+  EXPECT_TRUE(e->get(0)->IsDiscard());
+  EXPECT_TRUE(e->get(1)->IsReturn());
 }
 
 TEST_F(ParserImplTest, BodyStmt_Empty) {
   auto* p = parser("{}");
   auto e = p->body_stmt();
   ASSERT_FALSE(p->has_error()) << p->error();
-  EXPECT_EQ(e.size(), 0u);
+  EXPECT_EQ(e->size(), 0u);
 }
 
 TEST_F(ParserImplTest, BodyStmt_InvalidStmt) {
diff --git a/src/reader/wgsl/parser_impl_case_body_test.cc b/src/reader/wgsl/parser_impl_case_body_test.cc
index 8196c5b..61c6ec0 100644
--- a/src/reader/wgsl/parser_impl_case_body_test.cc
+++ b/src/reader/wgsl/parser_impl_case_body_test.cc
@@ -25,7 +25,7 @@
   auto* p = parser("");
   auto e = p->case_body();
   ASSERT_FALSE(p->has_error()) << p->error();
-  EXPECT_EQ(e.size(), 0u);
+  EXPECT_EQ(e->size(), 0u);
 }
 
 TEST_F(ParserImplTest, CaseBody_Statements) {
@@ -35,32 +35,31 @@
 
   auto e = p->case_body();
   ASSERT_FALSE(p->has_error()) << p->error();
-  ASSERT_EQ(e.size(), 2u);
-  EXPECT_TRUE(e[0]->IsVariableDecl());
-  EXPECT_TRUE(e[1]->IsAssign());
+  ASSERT_EQ(e->size(), 2u);
+  EXPECT_TRUE(e->get(0)->IsVariableDecl());
+  EXPECT_TRUE(e->get(1)->IsAssign());
 }
 
 TEST_F(ParserImplTest, CaseBody_InvalidStatement) {
   auto* p = parser("a =");
   auto e = p->case_body();
   ASSERT_TRUE(p->has_error());
-  EXPECT_EQ(e.size(), 0u);
-  EXPECT_EQ(p->error(), "1:4: unable to parse right side of assignment");
+  EXPECT_EQ(e, nullptr);
 }
 
 TEST_F(ParserImplTest, CaseBody_Fallthrough) {
   auto* p = parser("fallthrough;");
   auto e = p->case_body();
   ASSERT_FALSE(p->has_error()) << p->error();
-  ASSERT_EQ(e.size(), 1u);
-  EXPECT_TRUE(e[0]->IsFallthrough());
+  ASSERT_EQ(e->size(), 1u);
+  EXPECT_TRUE(e->get(0)->IsFallthrough());
 }
 
 TEST_F(ParserImplTest, CaseBody_Fallthrough_MissingSemicolon) {
   auto* p = parser("fallthrough");
   auto e = p->case_body();
   ASSERT_TRUE(p->has_error());
-  EXPECT_EQ(e.size(), 0u);
+  EXPECT_EQ(e, nullptr);
   EXPECT_EQ(p->error(), "1:12: missing ;");
 }
 
diff --git a/src/reader/wgsl/parser_impl_continuing_stmt_test.cc b/src/reader/wgsl/parser_impl_continuing_stmt_test.cc
index d67b326..c570d84 100644
--- a/src/reader/wgsl/parser_impl_continuing_stmt_test.cc
+++ b/src/reader/wgsl/parser_impl_continuing_stmt_test.cc
@@ -25,15 +25,15 @@
   auto* p = parser("continuing { discard; }");
   auto e = p->continuing_stmt();
   ASSERT_FALSE(p->has_error()) << p->error();
-  ASSERT_EQ(e.size(), 1u);
-  ASSERT_TRUE(e[0]->IsDiscard());
+  ASSERT_EQ(e->size(), 1u);
+  ASSERT_TRUE(e->get(0)->IsDiscard());
 }
 
 TEST_F(ParserImplTest, ContinuingStmt_InvalidBody) {
   auto* p = parser("continuing { discard }");
   auto e = p->continuing_stmt();
   ASSERT_TRUE(p->has_error());
-  ASSERT_EQ(e.size(), 0u);
+  ASSERT_EQ(e, nullptr);
   EXPECT_EQ(p->error(), "1:22: missing ;");
 }
 
diff --git a/src/reader/wgsl/parser_impl_statements_test.cc b/src/reader/wgsl/parser_impl_statements_test.cc
index 23082d8..a22e656 100644
--- a/src/reader/wgsl/parser_impl_statements_test.cc
+++ b/src/reader/wgsl/parser_impl_statements_test.cc
@@ -26,16 +26,16 @@
   auto* p = parser("discard; return;");
   auto e = p->statements();
   ASSERT_FALSE(p->has_error()) << p->error();
-  ASSERT_EQ(e.size(), 2u);
-  EXPECT_TRUE(e[0]->IsDiscard());
-  EXPECT_TRUE(e[1]->IsReturn());
+  ASSERT_EQ(e->size(), 2u);
+  EXPECT_TRUE(e->get(0)->IsDiscard());
+  EXPECT_TRUE(e->get(1)->IsReturn());
 }
 
 TEST_F(ParserImplTest, Statements_Empty) {
   auto* p = parser("");
   auto e = p->statements();
   ASSERT_FALSE(p->has_error()) << p->error();
-  ASSERT_EQ(e.size(), 0u);
+  ASSERT_EQ(e->size(), 0u);
 }
 
 }  // namespace