Add case_selectors update
This CL adds the missing case_selectors option from the grammar updates.
Change-Id: Ia6c110e917dd574711d396fb34ad53a2a67cf1fe
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/22306
Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/reader/wgsl/parser_impl.cc b/src/reader/wgsl/parser_impl.cc
index c02a375..e81ef0c 100644
--- a/src/reader/wgsl/parser_impl.cc
+++ b/src/reader/wgsl/parser_impl.cc
@@ -1800,7 +1800,7 @@
}
// switch_body
-// : CASE const_literal COLON BRACKET_LEFT case_body BRACKET_RIGHT
+// : CASE case_selectors COLON BRACKET_LEFT case_body BRACKET_RIGHT
// | DEFAULT COLON BRACKET_LEFT case_body BRACKET_RIGHT
std::unique_ptr<ast::CaseStatement> ParserImpl::switch_body() {
auto t = peek();
@@ -1813,14 +1813,14 @@
auto stmt = std::make_unique<ast::CaseStatement>();
stmt->set_source(source);
if (t.IsCase()) {
- auto cond = const_literal();
+ auto cond = case_selectors();
if (has_error())
return nullptr;
- if (cond == nullptr) {
+ if (cond.empty()) {
set_error(peek(), "unable to parse case conditional");
return nullptr;
}
- stmt->set_condition(std::move(cond));
+ stmt->set_conditions(std::move(cond));
}
t = next();
@@ -1850,6 +1850,24 @@
return stmt;
}
+// case_selectors
+// : const_literal (COMMA const_literal)*
+ast::CaseSelectorList ParserImpl::case_selectors() {
+ ast::CaseSelectorList selectors;
+
+ for (;;) {
+ auto cond = const_literal();
+ if (has_error())
+ return {};
+ if (cond == nullptr)
+ break;
+
+ selectors.push_back(std::move(cond));
+ }
+
+ return selectors;
+}
+
// case_body
// :
// | statement case_body