tint/reader/wgsl: Improve errors when parsing interpolation modes

If the interpolation mode doesn't parse, then generate an error message that includes the list of possible values, and a suggestion if there was a close match.

Change-Id: I4ee52389e94c834b9d5d9b8d1e76f453a1acd4d1
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/105328
Commit-Queue: Ben Clayton <bclayton@google.com>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Ben Clayton <bclayton@chromium.org>
Reviewed-by: Dan Sinclair <dsinclair@chromium.org>
This commit is contained in:
Ben Clayton 2022-10-11 22:04:29 +00:00 committed by Dawn LUCI CQ
parent 542d27d874
commit c889500f6e
2 changed files with 13 additions and 36 deletions

View File

@ -1646,25 +1646,12 @@ Expect<ast::PipelineStage> ParserImpl::expect_pipeline_stage() {
}
// interpolation_sample_name
// : 'center'
// : 'center'
// | 'centroid'
// | 'sample'
Expect<ast::InterpolationSampling> ParserImpl::expect_interpolation_sample_name() {
auto ident = expect_ident("interpolation sample name");
if (ident.errored) {
return Failure::kErrored;
}
if (ident.value == "center") {
return {ast::InterpolationSampling::kCenter, ident.source};
}
if (ident.value == "centroid") {
return {ast::InterpolationSampling::kCentroid, ident.source};
}
if (ident.value == "sample") {
return {ast::InterpolationSampling::kSample, ident.source};
}
return add_error(ident.source, "invalid interpolation sampling");
return expect_enum("interpolation sampling", ast::ParseInterpolationSampling,
ast::kInterpolationSamplingStrings);
}
// interpolation_type_name
@ -1672,22 +1659,8 @@ Expect<ast::InterpolationSampling> ParserImpl::expect_interpolation_sample_name(
// | 'linear'
// | 'flat'
Expect<ast::InterpolationType> ParserImpl::expect_interpolation_type_name() {
auto ident = expect_ident("interpolation type name");
if (ident.errored) {
return Failure::kErrored;
}
if (ident.value == "perspective") {
return {ast::InterpolationType::kPerspective, ident.source};
}
if (ident.value == "linear") {
return {ast::InterpolationType::kLinear, ident.source};
}
if (ident.value == "flat") {
return {ast::InterpolationType::kFlat, ident.source};
}
return add_error(ident.source, "invalid interpolation type");
return expect_enum("interpolation type", ast::ParseInterpolationType,
ast::kInterpolationTypeStrings);
}
// builtin_value_name

View File

@ -253,7 +253,8 @@ TEST_F(ParserImplTest, Attribute_Interpolate_Single_DoubleTrailingComma) {
EXPECT_TRUE(attr.errored);
EXPECT_EQ(attr.value, nullptr);
EXPECT_TRUE(p->has_error());
EXPECT_EQ(p->error(), "1:18: expected identifier for interpolation sample name");
EXPECT_EQ(p->error(), R"(1:18: expected interpolation sampling
Possible values: 'center', 'centroid', 'sample')");
}
TEST_F(ParserImplTest, Attribute_Interpolate_Perspective_Center) {
@ -347,7 +348,8 @@ TEST_F(ParserImplTest, Attribute_Interpolate_MissingFirstValue) {
EXPECT_TRUE(attr.errored);
EXPECT_EQ(attr.value, nullptr);
EXPECT_TRUE(p->has_error());
EXPECT_EQ(p->error(), "1:13: expected identifier for interpolation type name");
EXPECT_EQ(p->error(), R"(1:13: expected interpolation type
Possible values: 'flat', 'linear', 'perspective')");
}
TEST_F(ParserImplTest, Attribute_Interpolate_InvalidFirstValue) {
@ -357,7 +359,8 @@ TEST_F(ParserImplTest, Attribute_Interpolate_InvalidFirstValue) {
EXPECT_TRUE(attr.errored);
EXPECT_EQ(attr.value, nullptr);
EXPECT_TRUE(p->has_error());
EXPECT_EQ(p->error(), "1:13: invalid interpolation type");
EXPECT_EQ(p->error(), R"(1:13: expected interpolation type
Possible values: 'flat', 'linear', 'perspective')");
}
TEST_F(ParserImplTest, Attribute_Interpolate_InvalidSecondValue) {
@ -367,7 +370,8 @@ TEST_F(ParserImplTest, Attribute_Interpolate_InvalidSecondValue) {
EXPECT_TRUE(attr.errored);
EXPECT_EQ(attr.value, nullptr);
EXPECT_TRUE(p->has_error());
EXPECT_EQ(p->error(), "1:26: invalid interpolation sampling");
EXPECT_EQ(p->error(), R"(1:26: expected interpolation sampling. Did you mean 'sample'?
Possible values: 'center', 'centroid', 'sample')");
}
TEST_F(ParserImplTest, Attribute_Binding) {