tint/reader/wgsl: Improve errors when parsing texel formats
If the texel format 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: I206aa712d9c9a4f47da099d5f98e12e42f36d42e Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/105325 Reviewed-by: Dan Sinclair <dsinclair@chromium.org> Kokoro: Kokoro <noreply+kokoro@google.com> Commit-Queue: Ben Clayton <bclayton@google.com>
This commit is contained in:
parent
ecd7f7ee7f
commit
9af5b406ba
|
@ -917,12 +917,7 @@ Maybe<const ast::Type*> ParserImpl::depth_texture_type() {
|
||||||
// | 'rgba32sint'
|
// | 'rgba32sint'
|
||||||
// | 'rgba32float'
|
// | 'rgba32float'
|
||||||
Expect<ast::TexelFormat> ParserImpl::expect_texel_format(std::string_view use) {
|
Expect<ast::TexelFormat> ParserImpl::expect_texel_format(std::string_view use) {
|
||||||
auto& t = next();
|
return expect_enum("texel format", ast::ParseTexelFormat, ast::kTexelFormatStrings, use);
|
||||||
auto fmt = ast::ParseTexelFormat(t.to_str());
|
|
||||||
if (fmt == ast::TexelFormat::kInvalid) {
|
|
||||||
return add_error(t.source(), "invalid format", use);
|
|
||||||
}
|
|
||||||
return fmt;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Expect<ParserImpl::TypedIdentifier> ParserImpl::expect_ident_with_optional_type_specifier(
|
Expect<ParserImpl::TypedIdentifier> ParserImpl::expect_ident_with_optional_type_specifier(
|
||||||
|
|
|
@ -805,7 +805,8 @@ var x : texture_storage_2d<r32uint, read;
|
||||||
|
|
||||||
TEST_F(ParserImplErrorTest, GlobalDeclStorageTextureMissingSubtype) {
|
TEST_F(ParserImplErrorTest, GlobalDeclStorageTextureMissingSubtype) {
|
||||||
EXPECT("var x : texture_storage_2d<>;",
|
EXPECT("var x : texture_storage_2d<>;",
|
||||||
R"(test.wgsl:1:28 error: invalid format for storage texture type
|
R"(test.wgsl:1:28 error: expected texel format for storage texture type
|
||||||
|
Possible values: 'r32float', 'r32sint', 'r32uint', 'rg32float', 'rg32sint', 'rg32uint', 'rgba16float', 'rgba16sint', 'rgba16uint', 'rgba32float', 'rgba32sint', 'rgba32uint', 'rgba8sint', 'rgba8snorm', 'rgba8uint', 'rgba8unorm'
|
||||||
var x : texture_storage_2d<>;
|
var x : texture_storage_2d<>;
|
||||||
^
|
^
|
||||||
)");
|
)");
|
||||||
|
@ -813,7 +814,8 @@ var x : texture_storage_2d<>;
|
||||||
|
|
||||||
TEST_F(ParserImplErrorTest, GlobalDeclStorageTextureMissingInvalidSubtype) {
|
TEST_F(ParserImplErrorTest, GlobalDeclStorageTextureMissingInvalidSubtype) {
|
||||||
EXPECT("var x : texture_storage_2d<1>;",
|
EXPECT("var x : texture_storage_2d<1>;",
|
||||||
R"(test.wgsl:1:28 error: invalid format for storage texture type
|
R"(test.wgsl:1:28 error: expected texel format for storage texture type
|
||||||
|
Possible values: 'r32float', 'r32sint', 'r32uint', 'rg32float', 'rg32sint', 'rg32uint', 'rgba16float', 'rgba16sint', 'rgba16uint', 'rgba32float', 'rgba32sint', 'rgba32uint', 'rgba8sint', 'rgba8snorm', 'rgba8uint', 'rgba8unorm'
|
||||||
var x : texture_storage_2d<1>;
|
var x : texture_storage_2d<1>;
|
||||||
^
|
^
|
||||||
)");
|
)");
|
||||||
|
|
|
@ -17,15 +17,16 @@
|
||||||
namespace tint::reader::wgsl {
|
namespace tint::reader::wgsl {
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
TEST_F(ParserImplTest, ImageStorageType_Invalid) {
|
TEST_F(ParserImplTest, TexelFormat_Invalid) {
|
||||||
auto p = parser("1234");
|
auto p = parser("1234");
|
||||||
auto t = p->expect_texel_format("test");
|
auto t = p->expect_texel_format("test");
|
||||||
EXPECT_TRUE(t.errored);
|
EXPECT_TRUE(t.errored);
|
||||||
EXPECT_TRUE(p->has_error());
|
EXPECT_TRUE(p->has_error());
|
||||||
EXPECT_EQ(p->error(), "1:1: invalid format for test");
|
EXPECT_EQ(p->error(), R"(1:1: expected texel format for test
|
||||||
|
Possible values: 'r32float', 'r32sint', 'r32uint', 'rg32float', 'rg32sint', 'rg32uint', 'rgba16float', 'rgba16sint', 'rgba16uint', 'rgba32float', 'rgba32sint', 'rgba32uint', 'rgba8sint', 'rgba8snorm', 'rgba8uint', 'rgba8unorm')");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, ImageStorageType_R32Uint) {
|
TEST_F(ParserImplTest, TexelFormat_R32Uint) {
|
||||||
auto p = parser("r32uint");
|
auto p = parser("r32uint");
|
||||||
auto t = p->expect_texel_format("test");
|
auto t = p->expect_texel_format("test");
|
||||||
EXPECT_FALSE(t.errored);
|
EXPECT_FALSE(t.errored);
|
||||||
|
@ -33,7 +34,7 @@ TEST_F(ParserImplTest, ImageStorageType_R32Uint) {
|
||||||
EXPECT_FALSE(p->has_error());
|
EXPECT_FALSE(p->has_error());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, ImageStorageType_R32Sint) {
|
TEST_F(ParserImplTest, TexelFormat_R32Sint) {
|
||||||
auto p = parser("r32sint");
|
auto p = parser("r32sint");
|
||||||
auto t = p->expect_texel_format("test");
|
auto t = p->expect_texel_format("test");
|
||||||
EXPECT_FALSE(t.errored);
|
EXPECT_FALSE(t.errored);
|
||||||
|
@ -41,7 +42,7 @@ TEST_F(ParserImplTest, ImageStorageType_R32Sint) {
|
||||||
EXPECT_FALSE(p->has_error());
|
EXPECT_FALSE(p->has_error());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, ImageStorageType_R32Float) {
|
TEST_F(ParserImplTest, TexelFormat_R32Float) {
|
||||||
auto p = parser("r32float");
|
auto p = parser("r32float");
|
||||||
auto t = p->expect_texel_format("test");
|
auto t = p->expect_texel_format("test");
|
||||||
EXPECT_FALSE(t.errored);
|
EXPECT_FALSE(t.errored);
|
||||||
|
@ -49,7 +50,7 @@ TEST_F(ParserImplTest, ImageStorageType_R32Float) {
|
||||||
EXPECT_FALSE(p->has_error());
|
EXPECT_FALSE(p->has_error());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, ImageStorageType_Rgba8Unorm) {
|
TEST_F(ParserImplTest, TexelFormat_Rgba8Unorm) {
|
||||||
auto p = parser("rgba8unorm");
|
auto p = parser("rgba8unorm");
|
||||||
auto t = p->expect_texel_format("test");
|
auto t = p->expect_texel_format("test");
|
||||||
EXPECT_FALSE(t.errored);
|
EXPECT_FALSE(t.errored);
|
||||||
|
@ -57,7 +58,7 @@ TEST_F(ParserImplTest, ImageStorageType_Rgba8Unorm) {
|
||||||
EXPECT_FALSE(p->has_error());
|
EXPECT_FALSE(p->has_error());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, ImageStorageType_Rgba8Snorm) {
|
TEST_F(ParserImplTest, TexelFormat_Rgba8Snorm) {
|
||||||
auto p = parser("rgba8snorm");
|
auto p = parser("rgba8snorm");
|
||||||
auto t = p->expect_texel_format("test");
|
auto t = p->expect_texel_format("test");
|
||||||
EXPECT_FALSE(t.errored);
|
EXPECT_FALSE(t.errored);
|
||||||
|
@ -65,7 +66,7 @@ TEST_F(ParserImplTest, ImageStorageType_Rgba8Snorm) {
|
||||||
EXPECT_FALSE(p->has_error());
|
EXPECT_FALSE(p->has_error());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, ImageStorageType_Rgba8Uint) {
|
TEST_F(ParserImplTest, TexelFormat_Rgba8Uint) {
|
||||||
auto p = parser("rgba8uint");
|
auto p = parser("rgba8uint");
|
||||||
auto t = p->expect_texel_format("test");
|
auto t = p->expect_texel_format("test");
|
||||||
EXPECT_FALSE(t.errored);
|
EXPECT_FALSE(t.errored);
|
||||||
|
@ -73,7 +74,7 @@ TEST_F(ParserImplTest, ImageStorageType_Rgba8Uint) {
|
||||||
EXPECT_FALSE(p->has_error());
|
EXPECT_FALSE(p->has_error());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, ImageStorageType_Rgba8Sint) {
|
TEST_F(ParserImplTest, TexelFormat_Rgba8Sint) {
|
||||||
auto p = parser("rgba8sint");
|
auto p = parser("rgba8sint");
|
||||||
auto t = p->expect_texel_format("test");
|
auto t = p->expect_texel_format("test");
|
||||||
EXPECT_FALSE(t.errored);
|
EXPECT_FALSE(t.errored);
|
||||||
|
@ -81,7 +82,7 @@ TEST_F(ParserImplTest, ImageStorageType_Rgba8Sint) {
|
||||||
EXPECT_FALSE(p->has_error());
|
EXPECT_FALSE(p->has_error());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, ImageStorageType_Rg32Uint) {
|
TEST_F(ParserImplTest, TexelFormat_Rg32Uint) {
|
||||||
auto p = parser("rg32uint");
|
auto p = parser("rg32uint");
|
||||||
auto t = p->expect_texel_format("test");
|
auto t = p->expect_texel_format("test");
|
||||||
EXPECT_FALSE(t.errored);
|
EXPECT_FALSE(t.errored);
|
||||||
|
@ -89,7 +90,7 @@ TEST_F(ParserImplTest, ImageStorageType_Rg32Uint) {
|
||||||
EXPECT_FALSE(p->has_error());
|
EXPECT_FALSE(p->has_error());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, ImageStorageType_Rg32Sint) {
|
TEST_F(ParserImplTest, TexelFormat_Rg32Sint) {
|
||||||
auto p = parser("rg32sint");
|
auto p = parser("rg32sint");
|
||||||
auto t = p->expect_texel_format("test");
|
auto t = p->expect_texel_format("test");
|
||||||
EXPECT_FALSE(t.errored);
|
EXPECT_FALSE(t.errored);
|
||||||
|
@ -97,7 +98,7 @@ TEST_F(ParserImplTest, ImageStorageType_Rg32Sint) {
|
||||||
EXPECT_FALSE(p->has_error());
|
EXPECT_FALSE(p->has_error());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, ImageStorageType_Rg32Float) {
|
TEST_F(ParserImplTest, TexelFormat_Rg32Float) {
|
||||||
auto p = parser("rg32float");
|
auto p = parser("rg32float");
|
||||||
auto t = p->expect_texel_format("test");
|
auto t = p->expect_texel_format("test");
|
||||||
EXPECT_FALSE(t.errored);
|
EXPECT_FALSE(t.errored);
|
||||||
|
@ -105,7 +106,7 @@ TEST_F(ParserImplTest, ImageStorageType_Rg32Float) {
|
||||||
EXPECT_FALSE(p->has_error());
|
EXPECT_FALSE(p->has_error());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, ImageStorageType_Rgba16Uint) {
|
TEST_F(ParserImplTest, TexelFormat_Rgba16Uint) {
|
||||||
auto p = parser("rgba16uint");
|
auto p = parser("rgba16uint");
|
||||||
auto t = p->expect_texel_format("test");
|
auto t = p->expect_texel_format("test");
|
||||||
EXPECT_FALSE(t.errored);
|
EXPECT_FALSE(t.errored);
|
||||||
|
@ -113,7 +114,7 @@ TEST_F(ParserImplTest, ImageStorageType_Rgba16Uint) {
|
||||||
EXPECT_FALSE(p->has_error());
|
EXPECT_FALSE(p->has_error());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, ImageStorageType_Rgba16Sint) {
|
TEST_F(ParserImplTest, TexelFormat_Rgba16Sint) {
|
||||||
auto p = parser("rgba16sint");
|
auto p = parser("rgba16sint");
|
||||||
auto t = p->expect_texel_format("test");
|
auto t = p->expect_texel_format("test");
|
||||||
EXPECT_FALSE(t.errored);
|
EXPECT_FALSE(t.errored);
|
||||||
|
@ -121,7 +122,7 @@ TEST_F(ParserImplTest, ImageStorageType_Rgba16Sint) {
|
||||||
EXPECT_FALSE(p->has_error());
|
EXPECT_FALSE(p->has_error());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, ImageStorageType_Rgba16Float) {
|
TEST_F(ParserImplTest, TexelFormat_Rgba16Float) {
|
||||||
auto p = parser("rgba16float");
|
auto p = parser("rgba16float");
|
||||||
auto t = p->expect_texel_format("test");
|
auto t = p->expect_texel_format("test");
|
||||||
EXPECT_FALSE(t.errored);
|
EXPECT_FALSE(t.errored);
|
||||||
|
@ -129,7 +130,7 @@ TEST_F(ParserImplTest, ImageStorageType_Rgba16Float) {
|
||||||
EXPECT_FALSE(p->has_error());
|
EXPECT_FALSE(p->has_error());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, ImageStorageType_Rgba32Uint) {
|
TEST_F(ParserImplTest, TexelFormat_Rgba32Uint) {
|
||||||
auto p = parser("rgba32uint");
|
auto p = parser("rgba32uint");
|
||||||
auto t = p->expect_texel_format("test");
|
auto t = p->expect_texel_format("test");
|
||||||
EXPECT_FALSE(t.errored);
|
EXPECT_FALSE(t.errored);
|
||||||
|
@ -137,7 +138,7 @@ TEST_F(ParserImplTest, ImageStorageType_Rgba32Uint) {
|
||||||
EXPECT_FALSE(p->has_error());
|
EXPECT_FALSE(p->has_error());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, ImageStorageType_Rgba32Sint) {
|
TEST_F(ParserImplTest, TexelFormat_Rgba32Sint) {
|
||||||
auto p = parser("rgba32sint");
|
auto p = parser("rgba32sint");
|
||||||
auto t = p->expect_texel_format("test");
|
auto t = p->expect_texel_format("test");
|
||||||
EXPECT_FALSE(t.errored);
|
EXPECT_FALSE(t.errored);
|
||||||
|
@ -145,7 +146,7 @@ TEST_F(ParserImplTest, ImageStorageType_Rgba32Sint) {
|
||||||
EXPECT_FALSE(p->has_error());
|
EXPECT_FALSE(p->has_error());
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, ImageStorageType_Rgba32Float) {
|
TEST_F(ParserImplTest, TexelFormat_Rgba32Float) {
|
||||||
auto p = parser("rgba32float");
|
auto p = parser("rgba32float");
|
||||||
auto t = p->expect_texel_format("test");
|
auto t = p->expect_texel_format("test");
|
||||||
EXPECT_FALSE(t.errored);
|
EXPECT_FALSE(t.errored);
|
||||||
|
|
|
@ -218,7 +218,18 @@ TEST_F(ParserImplTest, TextureSamplerTypes_StorageTexture_InvalidType) {
|
||||||
EXPECT_EQ(t.value, nullptr);
|
EXPECT_EQ(t.value, nullptr);
|
||||||
EXPECT_FALSE(t.matched);
|
EXPECT_FALSE(t.matched);
|
||||||
EXPECT_TRUE(t.errored);
|
EXPECT_TRUE(t.errored);
|
||||||
EXPECT_EQ(p->error(), "1:20: invalid format for storage texture type");
|
EXPECT_EQ(p->error(), R"(1:20: expected texel format for storage texture type
|
||||||
|
Possible values: 'r32float', 'r32sint', 'r32uint', 'rg32float', 'rg32sint', 'rg32uint', 'rgba16float', 'rgba16sint', 'rgba16uint', 'rgba32float', 'rgba32sint', 'rgba32uint', 'rgba8sint', 'rgba8snorm', 'rgba8uint', 'rgba8unorm')");
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST_F(ParserImplTest, TextureSamplerTypes_StorageTexture_InvalidTypeSuggest) {
|
||||||
|
auto p = parser("texture_storage_1d<rg32_float, read>");
|
||||||
|
auto t = p->texture_and_sampler_types();
|
||||||
|
EXPECT_EQ(t.value, nullptr);
|
||||||
|
EXPECT_FALSE(t.matched);
|
||||||
|
EXPECT_TRUE(t.errored);
|
||||||
|
EXPECT_EQ(p->error(), R"(1:20: expected texel format for storage texture type. Did you mean 'rg32float'?
|
||||||
|
Possible values: 'r32float', 'r32sint', 'r32uint', 'rg32float', 'rg32sint', 'rg32uint', 'rgba16float', 'rgba16sint', 'rgba16uint', 'rgba32float', 'rgba32sint', 'rgba32uint', 'rgba8sint', 'rgba8snorm', 'rgba8uint', 'rgba8unorm')");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, TextureSamplerTypes_StorageTexture_InvalidAccess) {
|
TEST_F(ParserImplTest, TextureSamplerTypes_StorageTexture_InvalidAccess) {
|
||||||
|
@ -236,7 +247,8 @@ TEST_F(ParserImplTest, TextureSamplerTypes_StorageTexture_MissingType) {
|
||||||
EXPECT_EQ(t.value, nullptr);
|
EXPECT_EQ(t.value, nullptr);
|
||||||
EXPECT_FALSE(t.matched);
|
EXPECT_FALSE(t.matched);
|
||||||
EXPECT_TRUE(t.errored);
|
EXPECT_TRUE(t.errored);
|
||||||
EXPECT_EQ(p->error(), "1:20: invalid format for storage texture type");
|
EXPECT_EQ(p->error(), R"(1:20: expected texel format for storage texture type
|
||||||
|
Possible values: 'r32float', 'r32sint', 'r32uint', 'rg32float', 'rg32sint', 'rg32uint', 'rgba16float', 'rgba16sint', 'rgba16uint', 'rgba32float', 'rgba32sint', 'rgba32uint', 'rgba8sint', 'rgba8snorm', 'rgba8uint', 'rgba8unorm')");
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(ParserImplTest, TextureSamplerTypes_StorageTexture_MissingLessThan) {
|
TEST_F(ParserImplTest, TextureSamplerTypes_StorageTexture_MissingLessThan) {
|
||||||
|
|
Loading…
Reference in New Issue