wsgl parser: Add expect_builtin()

Mirrors expect_pipeline_stage()

Bug: tint:282
Change-Id: I413c87b3684c1f5cfec0c4acd7d3a5160d4b24a9
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/31735
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: dan sinclair <dsinclair@chromium.org>
This commit is contained in:
Ben Clayton 2020-11-04 20:06:21 +00:00 committed by Commit Bot service account
parent 32ba9b6722
commit b8791a5129
2 changed files with 22 additions and 8 deletions

View File

@ -452,16 +452,11 @@ std::unique_ptr<ast::VariableDecoration> ParserImpl::variable_decoration() {
if (!expect("builtin decoration", Token::Type::kParenLeft))
return nullptr;
std::string ident;
if (!expect_ident("builtin", &ident, &source))
ast::Builtin builtin;
std::tie(builtin, source) = expect_builtin();
if (builtin == ast::Builtin::kNone)
return nullptr;
ast::Builtin builtin = ident_to_builtin(ident);
if (builtin == ast::Builtin::kNone) {
add_error(source, "invalid value for builtin decoration");
return nullptr;
}
if (!expect("builtin decoration", Token::Type::kParenRight))
return nullptr;
@ -1796,6 +1791,20 @@ std::pair<ast::PipelineStage, Source> ParserImpl::expect_pipeline_stage() {
return {ast::PipelineStage::kNone, t.source()};
}
std::pair<ast::Builtin, Source> ParserImpl::expect_builtin() {
Source source;
std::string ident;
if (!expect_ident("builtin", &ident, &source))
return {ast::Builtin::kNone, source};
ast::Builtin builtin = ident_to_builtin(ident);
if (builtin == ast::Builtin::kNone)
add_error(source, "invalid value for builtin decoration");
return {builtin, source};
}
// body_stmt
// : BRACKET_LEFT statements BRACKET_RIGHT
std::unique_ptr<ast::BlockStatement> ParserImpl::body_stmt() {

View File

@ -262,6 +262,11 @@ class ParserImpl {
/// @returns the pipeline stage or PipelineStage::kNone if none matched, along
/// with the source location for the stage.
std::pair<ast::PipelineStage, Source> expect_pipeline_stage();
/// Parses a builtin identifier, erroring if the next token does not match a
/// valid builtin name.
/// @returns the builtin or Builtin::kNone if none matched, along with the
/// source location for the stage.
std::pair<ast::Builtin, Source> expect_builtin();
/// Parses a `body_stmt` grammar element
/// @returns the parsed statements
std::unique_ptr<ast::BlockStatement> body_stmt();