reader/wgsl: Migrate to AST types
Bug: tint:724
Change-Id: I484813dd139122244cd09829ab5b035cec9981e6
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/49960
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: James Price <jrprice@google.com>
diff --git a/src/reader/wgsl/parser_impl.cc b/src/reader/wgsl/parser_impl.cc
index 9cfe32e..90e4c8b 100644
--- a/src/reader/wgsl/parser_impl.cc
+++ b/src/reader/wgsl/parser_impl.cc
@@ -213,7 +213,7 @@
ParserImpl::TypedIdentifier::TypedIdentifier(const TypedIdentifier&) = default;
-ParserImpl::TypedIdentifier::TypedIdentifier(typ::Type type_in,
+ParserImpl::TypedIdentifier::TypedIdentifier(ast::Type* type_in,
std::string name_in,
Source source_in)
: type(type_in), name(std::move(name_in)), source(std::move(source_in)) {}
@@ -227,7 +227,7 @@
ParserImpl::FunctionHeader::FunctionHeader(Source src,
std::string n,
ast::VariableList p,
- typ::Type ret_ty,
+ ast::Type* ret_ty,
ast::DecorationList ret_decos)
: source(src),
name(n),
@@ -247,7 +247,7 @@
ParserImpl::VarDeclInfo::VarDeclInfo(Source source_in,
std::string name_in,
ast::StorageClass storage_class_in,
- typ::Type type_in)
+ ast::Type* type_in)
: source(std::move(source_in)),
name(std::move(name_in)),
storage_class(storage_class_in),
@@ -317,11 +317,11 @@
}
void ParserImpl::register_constructed(const std::string& name,
- sem::Type* type) {
+ const ast::Type* type) {
registered_constructs_[name] = type;
}
-sem::Type* ParserImpl::get_constructed(const std::string& name) {
+const ast::Type* ParserImpl::get_constructed(const std::string& name) {
if (registered_constructs_.find(name) == registered_constructs_.end()) {
return nullptr;
}
@@ -401,7 +401,7 @@
if (!expect("type alias", Token::Type::kSemicolon))
return Failure::kErrored;
- builder_.AST().AddConstructedType(const_cast<ast::Alias*>(ta.value.ast));
+ builder_.AST().AddConstructedType(const_cast<ast::Alias*>(ta.value));
return true;
}
@@ -413,10 +413,9 @@
if (!expect("struct declaration", Token::Type::kSemicolon))
return Failure::kErrored;
- register_constructed(
- builder_.Symbols().NameFor(str.value->impl()->name()), str.value);
- builder_.AST().AddConstructedType(
- const_cast<ast::Struct*>(str.value.ast));
+ register_constructed(builder_.Symbols().NameFor(str.value->name()),
+ str.value);
+ builder_.AST().AddConstructedType(str.value);
return true;
}
@@ -565,8 +564,7 @@
if (decl.errored)
return Failure::kErrored;
- if ((decl->type.sem && decl->type.sem->UnwrapAll()->is_handle()) ||
- (decl->type.ast && decl->type.ast->UnwrapAll()->is_handle())) {
+ if (decl->type && decl->type->UnwrapAll()->is_handle()) {
// handle types implicitly have the `UniformConstant` storage class.
if (explicit_sc.matched) {
return add_error(
@@ -586,7 +584,7 @@
// | sampled_texture_type LESS_THAN type_decl GREATER_THAN
// | multisampled_texture_type LESS_THAN type_decl GREATER_THAN
// | storage_texture_type LESS_THAN image_storage_type GREATER_THAN
-Maybe<typ::Type> ParserImpl::texture_sampler_types() {
+Maybe<ast::Type*> ParserImpl::texture_sampler_types() {
auto type = sampler_type();
if (type.matched)
return type;
@@ -644,7 +642,7 @@
// sampler_type
// : SAMPLER
// | SAMPLER_COMPARISON
-Maybe<typ::Type> ParserImpl::sampler_type() {
+Maybe<ast::Type*> ParserImpl::sampler_type() {
Source source;
if (match(Token::Type::kSampler, &source))
return builder_.ty.sampler(source, ast::SamplerKind::kSampler);
@@ -686,7 +684,7 @@
// external_texture_type
// : TEXTURE_EXTERNAL
-Maybe<typ::Type> ParserImpl::external_texture_type() {
+Maybe<ast::Type*> ParserImpl::external_texture_type() {
Source source;
if (match(Token::Type::kTextureExternal, &source)) {
return builder_.ty.external_texture(source);
@@ -727,7 +725,7 @@
// | TEXTURE_DEPTH_2D_ARRAY
// | TEXTURE_DEPTH_CUBE
// | TEXTURE_DEPTH_CUBE_ARRAY
-Maybe<typ::Type> ParserImpl::depth_texture_type() {
+Maybe<ast::Type*> ParserImpl::depth_texture_type() {
Source source;
if (match(Token::Type::kTextureDepth2d, &source))
@@ -921,7 +919,7 @@
if (access_decos.size() > 1)
return add_error(ident.source, "multiple access decorations not allowed");
- typ::Type ty = type.value;
+ ast::Type* ty = type.value;
for (auto* deco : access_decos) {
// If we have an access control decoration then we take it and wrap our
@@ -965,7 +963,7 @@
// type_alias
// : TYPE IDENT EQUAL type_decl
-Maybe<typ::Alias> ParserImpl::type_alias() {
+Maybe<ast::Alias*> ParserImpl::type_alias() {
auto t = peek();
if (!t.IsType())
return Failure::kNoMatch;
@@ -1017,7 +1015,7 @@
// | MAT4x3 LESS_THAN type_decl GREATER_THAN
// | MAT4x4 LESS_THAN type_decl GREATER_THAN
// | texture_sampler_types
-Maybe<typ::Type> ParserImpl::type_decl() {
+Maybe<ast::Type*> ParserImpl::type_decl() {
auto decos = decoration_list();
if (decos.errored)
return Failure::kErrored;
@@ -1034,7 +1032,7 @@
return type;
}
-Maybe<typ::Type> ParserImpl::type_decl(ast::DecorationList& decos) {
+Maybe<ast::Type*> ParserImpl::type_decl(ast::DecorationList& decos) {
auto t = peek();
Source source;
if (match(Token::Type::kIdentifier, &source)) {
@@ -1043,9 +1041,8 @@
if (ty == nullptr)
return add_error(t, "unknown constructed type '" + t.to_str() + "'");
- return typ::Type{builder_.create<ast::TypeName>(
- source, builder_.Symbols().Register(t.to_str())),
- ty};
+ return builder_.create<ast::TypeName>(
+ source, builder_.Symbols().Register(t.to_str()));
}
if (match(Token::Type::kBool, &source))
@@ -1088,7 +1085,7 @@
return Failure::kNoMatch;
}
-Expect<typ::Type> ParserImpl::expect_type(const std::string& use) {
+Expect<ast::Type*> ParserImpl::expect_type(const std::string& use) {
auto type = type_decl();
if (type.errored)
return Failure::kErrored;
@@ -1097,12 +1094,12 @@
return type.value;
}
-Expect<typ::Type> ParserImpl::expect_type_decl_pointer(Token t) {
+Expect<ast::Type*> ParserImpl::expect_type_decl_pointer(Token t) {
const char* use = "ptr declaration";
ast::StorageClass storage_class = ast::StorageClass::kNone;
- auto subtype = expect_lt_gt_block(use, [&]() -> Expect<typ::Type> {
+ auto subtype = expect_lt_gt_block(use, [&]() -> Expect<ast::Type*> {
auto sc = expect_storage_class(use);
if (sc.errored)
return Failure::kErrored;
@@ -1126,7 +1123,7 @@
storage_class);
}
-Expect<typ::Type> ParserImpl::expect_type_decl_vector(Token t) {
+Expect<ast::Type*> ParserImpl::expect_type_decl_vector(Token t) {
uint32_t count = 2;
if (t.IsVec3())
count = 3;
@@ -1143,14 +1140,14 @@
count);
}
-Expect<typ::Type> ParserImpl::expect_type_decl_array(
+Expect<ast::Type*> ParserImpl::expect_type_decl_array(
Token t,
ast::DecorationList decos) {
const char* use = "array declaration";
uint32_t size = 0;
- auto subtype = expect_lt_gt_block(use, [&]() -> Expect<typ::Type> {
+ auto subtype = expect_lt_gt_block(use, [&]() -> Expect<ast::Type*> {
auto type = expect_type(use);
if (type.errored)
return Failure::kErrored;
@@ -1173,7 +1170,7 @@
size, std::move(decos));
}
-Expect<typ::Type> ParserImpl::expect_type_decl_matrix(Token t) {
+Expect<ast::Type*> ParserImpl::expect_type_decl_matrix(Token t) {
uint32_t rows = 2;
uint32_t columns = 2;
if (t.IsMat3x2() || t.IsMat3x3() || t.IsMat3x4()) {
@@ -1239,7 +1236,7 @@
// struct_decl
// : struct_decoration_decl* STRUCT IDENT struct_body_decl
-Maybe<typ::Struct> ParserImpl::struct_decl(ast::DecorationList& decos) {
+Maybe<ast::Struct*> ParserImpl::struct_decl(ast::DecorationList& decos) {
auto t = peek();
auto source = t.source();
@@ -1255,9 +1252,8 @@
return Failure::kErrored;
auto sym = builder_.Symbols().Register(name.value);
- auto* str =
- create<ast::Struct>(source, sym, std::move(body.value), std::move(decos));
- return typ::Struct{str, create<sem::StructType>(str)};
+ return create<ast::Struct>(source, sym, std::move(body.value),
+ std::move(decos));
}
// struct_body_decl
@@ -1346,7 +1342,7 @@
// function_type_decl
// : type_decl
// | VOID
-Maybe<typ::Type> ParserImpl::function_type_decl() {
+Maybe<ast::Type*> ParserImpl::function_type_decl() {
Source source;
if (match(Token::Type::kVoid, &source))
return builder_.ty.void_(source);
@@ -1381,7 +1377,7 @@
}
}
- typ::Type return_type;
+ ast::Type* return_type = nullptr;
ast::DecorationList return_decorations;
if (match(Token::Type::kArrow)) {
@@ -1402,7 +1398,7 @@
return_type = type.value;
}
- if (Is<ast::Void>(return_type.ast)) {
+ if (Is<ast::Void>(return_type)) {
// crbug.com/tint/677: void has been removed from the language
deprecated(tok.source(),
"omit '-> void' for functions that do not return a value");
diff --git a/src/reader/wgsl/parser_impl.h b/src/reader/wgsl/parser_impl.h
index 9304350..513da69 100644
--- a/src/reader/wgsl/parser_impl.h
+++ b/src/reader/wgsl/parser_impl.h
@@ -211,12 +211,12 @@
/// @param type_in parsed type
/// @param name_in parsed identifier
/// @param source_in source to the identifier
- TypedIdentifier(typ::Type type_in, std::string name_in, Source source_in);
+ TypedIdentifier(ast::Type* type_in, std::string name_in, Source source_in);
/// Destructor
~TypedIdentifier();
/// Parsed type.
- typ::Type type;
+ ast::Type* type;
/// Parsed identifier.
std::string name;
/// Source to the identifier.
@@ -239,7 +239,7 @@
FunctionHeader(Source src,
std::string n,
ast::VariableList p,
- typ::Type ret_ty,
+ ast::Type* ret_ty,
ast::DecorationList ret_decos);
/// Destructor
~FunctionHeader();
@@ -255,7 +255,7 @@
/// Function parameters
ast::VariableList params;
/// Function return type
- typ::Type return_type;
+ ast::Type* return_type;
/// Function return type decorations
ast::DecorationList return_type_decorations;
};
@@ -275,7 +275,7 @@
VarDeclInfo(Source source_in,
std::string name_in,
ast::StorageClass storage_class_in,
- typ::Type type_in);
+ ast::Type* type_in);
/// Destructor
~VarDeclInfo();
@@ -286,7 +286,7 @@
/// Variable storage class
ast::StorageClass storage_class;
/// Variable type
- typ::Type type;
+ ast::Type* type = nullptr;
};
/// Creates a new parser using the given file
@@ -365,12 +365,12 @@
/// TODO(crbug.com/tint/724): Remove
/// @param name the constructed name
/// @param type the constructed type
- void register_constructed(const std::string& name, sem::Type* type);
+ void register_constructed(const std::string& name, const ast::Type* type);
/// Retrieves a constructed type
/// TODO(crbug.com/tint/724): Remove
/// @param name The name to lookup
/// @returns the constructed type for `name` or `nullptr` if not found
- sem::Type* get_constructed(const std::string& name);
+ const ast::Type* get_constructed(const std::string& name);
/// Parses the `translation_unit` grammar element
void translation_unit();
@@ -400,15 +400,15 @@
Maybe<ast::StorageClass> variable_storage_decoration();
/// Parses a `type_alias` grammar element
/// @returns the type alias or nullptr on error
- Maybe<typ::Alias> type_alias();
+ Maybe<ast::Alias*> type_alias();
/// Parses a `type_decl` grammar element
/// @returns the parsed Type or nullptr if none matched.
- Maybe<typ::Type> type_decl();
+ Maybe<ast::Type*> type_decl();
/// Parses a `type_decl` grammar element with the given pre-parsed
/// decorations.
/// @param decos the list of decorations for the type.
/// @returns the parsed Type or nullptr if none matched.
- Maybe<typ::Type> type_decl(ast::DecorationList& decos);
+ Maybe<ast::Type*> type_decl(ast::DecorationList& decos);
/// Parses a `storage_class` grammar element, erroring on parse failure.
/// @param use a description of what was being parsed if an error was raised.
/// @returns the storage class or StorageClass::kNone if none matched
@@ -417,7 +417,7 @@
/// `struct_decoration_decl*` provided as `decos`.
/// @returns the struct type or nullptr on error
/// @param decos the list of decorations for the struct declaration.
- Maybe<typ::Struct> struct_decl(ast::DecorationList& decos);
+ Maybe<ast::Struct*> struct_decl(ast::DecorationList& decos);
/// Parses a `struct_body_decl` grammar element, erroring on parse failure.
/// @returns the struct members
Expect<ast::StructMemberList> expect_struct_body_decl();
@@ -434,10 +434,10 @@
Maybe<ast::Function*> function_decl(ast::DecorationList& decos);
/// Parses a `texture_sampler_types` grammar element
/// @returns the parsed Type or nullptr if none matched.
- Maybe<typ::Type> texture_sampler_types();
+ Maybe<ast::Type*> texture_sampler_types();
/// Parses a `sampler_type` grammar element
/// @returns the parsed Type or nullptr if none matched.
- Maybe<typ::Type> sampler_type();
+ Maybe<ast::Type*> sampler_type();
/// Parses a `multisampled_texture_type` grammar element
/// @returns returns the multisample texture dimension or kNone if none
/// matched.
@@ -451,17 +451,17 @@
Maybe<ast::TextureDimension> storage_texture_type();
/// Parses a `depth_texture_type` grammar element
/// @returns the parsed Type or nullptr if none matched.
- Maybe<typ::Type> depth_texture_type();
+ Maybe<ast::Type*> depth_texture_type();
/// Parses a 'texture_external_type' grammar element
/// @returns the parsed Type or nullptr if none matched
- Maybe<typ::Type> external_texture_type();
+ Maybe<ast::Type*> external_texture_type();
/// Parses a `image_storage_type` grammar element
/// @param use a description of what was being parsed if an error was raised
/// @returns returns the image format or kNone if none matched.
Expect<ast::ImageFormat> expect_image_storage_type(const std::string& use);
/// Parses a `function_type_decl` grammar element
/// @returns the parsed type or nullptr otherwise
- Maybe<typ::Type> function_type_decl();
+ Maybe<ast::Type*> function_type_decl();
/// Parses a `function_header` grammar element
/// @returns the parsed function header
Maybe<FunctionHeader> function_header();
@@ -827,12 +827,12 @@
/// Used to ensure that all decorations are consumed.
bool expect_decorations_consumed(const ast::DecorationList& list);
- Expect<typ::Type> expect_type_decl_pointer(Token t);
- Expect<typ::Type> expect_type_decl_vector(Token t);
- Expect<typ::Type> expect_type_decl_array(Token t, ast::DecorationList decos);
- Expect<typ::Type> expect_type_decl_matrix(Token t);
+ Expect<ast::Type*> expect_type_decl_pointer(Token t);
+ Expect<ast::Type*> expect_type_decl_vector(Token t);
+ Expect<ast::Type*> expect_type_decl_array(Token t, ast::DecorationList decos);
+ Expect<ast::Type*> expect_type_decl_matrix(Token t);
- Expect<typ::Type> expect_type(const std::string& use);
+ Expect<ast::Type*> expect_type(const std::string& use);
Maybe<ast::Statement*> non_block_statement();
Maybe<ast::Statement*> for_header_initializer();
@@ -858,7 +858,7 @@
uint32_t sync_depth_ = 0;
std::vector<Token::Type> sync_tokens_;
int silence_errors_ = 0;
- std::unordered_map<std::string, sem::Type*> registered_constructs_;
+ std::unordered_map<std::string, const ast::Type*> registered_constructs_;
ProgramBuilder builder_;
size_t max_errors_ = 25;
};
diff --git a/src/reader/wgsl/parser_impl_depth_texture_type_test.cc b/src/reader/wgsl/parser_impl_depth_texture_type_test.cc
index 82b73c1..e41b2e9 100644
--- a/src/reader/wgsl/parser_impl_depth_texture_type_test.cc
+++ b/src/reader/wgsl/parser_impl_depth_texture_type_test.cc
@@ -34,11 +34,11 @@
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
ASSERT_NE(t.value, nullptr);
- ASSERT_TRUE(t->Is<sem::Texture>());
- ASSERT_TRUE(t->Is<sem::DepthTexture>());
- EXPECT_EQ(t->As<sem::Texture>()->dim(), ast::TextureDimension::k2d);
+ ASSERT_TRUE(t->Is<ast::Texture>());
+ ASSERT_TRUE(t->Is<ast::DepthTexture>());
+ EXPECT_EQ(t->As<ast::Texture>()->dim(), ast::TextureDimension::k2d);
EXPECT_FALSE(p->has_error());
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 17u}}));
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 17u}}));
}
TEST_F(ParserImplTest, DepthTextureType_2dArray) {
@@ -47,11 +47,11 @@
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
ASSERT_NE(t.value, nullptr);
- ASSERT_TRUE(t->Is<sem::Texture>());
- ASSERT_TRUE(t->Is<sem::DepthTexture>());
- EXPECT_EQ(t->As<sem::Texture>()->dim(), ast::TextureDimension::k2dArray);
+ ASSERT_TRUE(t->Is<ast::Texture>());
+ ASSERT_TRUE(t->Is<ast::DepthTexture>());
+ EXPECT_EQ(t->As<ast::Texture>()->dim(), ast::TextureDimension::k2dArray);
EXPECT_FALSE(p->has_error());
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 23u}}));
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 23u}}));
}
TEST_F(ParserImplTest, DepthTextureType_Cube) {
@@ -60,11 +60,11 @@
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
ASSERT_NE(t.value, nullptr);
- ASSERT_TRUE(t->Is<sem::Texture>());
- ASSERT_TRUE(t->Is<sem::DepthTexture>());
- EXPECT_EQ(t->As<sem::Texture>()->dim(), ast::TextureDimension::kCube);
+ ASSERT_TRUE(t->Is<ast::Texture>());
+ ASSERT_TRUE(t->Is<ast::DepthTexture>());
+ EXPECT_EQ(t->As<ast::Texture>()->dim(), ast::TextureDimension::kCube);
EXPECT_FALSE(p->has_error());
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 19u}}));
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 19u}}));
}
TEST_F(ParserImplTest, DepthTextureType_CubeArray) {
@@ -73,11 +73,11 @@
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
ASSERT_NE(t.value, nullptr);
- ASSERT_TRUE(t->Is<sem::Texture>());
- ASSERT_TRUE(t->Is<sem::DepthTexture>());
- EXPECT_EQ(t->As<sem::Texture>()->dim(), ast::TextureDimension::kCubeArray);
+ ASSERT_TRUE(t->Is<ast::Texture>());
+ ASSERT_TRUE(t->Is<ast::DepthTexture>());
+ EXPECT_EQ(t->As<ast::Texture>()->dim(), ast::TextureDimension::kCubeArray);
EXPECT_FALSE(p->has_error());
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 25u}}));
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 25u}}));
}
} // namespace
diff --git a/src/reader/wgsl/parser_impl_external_texture_type_test.cc b/src/reader/wgsl/parser_impl_external_texture_type_test.cc
index 9f46112..35f4c40 100644
--- a/src/reader/wgsl/parser_impl_external_texture_type_test.cc
+++ b/src/reader/wgsl/parser_impl_external_texture_type_test.cc
@@ -32,7 +32,7 @@
auto t = p->external_texture_type();
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 17u}}));
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 17u}}));
}
} // namespace
diff --git a/src/reader/wgsl/parser_impl_function_header_test.cc b/src/reader/wgsl/parser_impl_function_header_test.cc
index f509264..52071a3 100644
--- a/src/reader/wgsl/parser_impl_function_header_test.cc
+++ b/src/reader/wgsl/parser_impl_function_header_test.cc
@@ -30,7 +30,7 @@
ASSERT_EQ(f->params.size(), 2u);
EXPECT_EQ(f->params[0]->symbol(), p->builder().Symbols().Get("a"));
EXPECT_EQ(f->params[1]->symbol(), p->builder().Symbols().Get("b"));
- EXPECT_TRUE(f->return_type->Is<sem::Void>());
+ EXPECT_TRUE(f->return_type->Is<ast::Void>());
}
TEST_F(ParserImplTest, FunctionHeader_TrailingComma) {
@@ -42,7 +42,7 @@
EXPECT_EQ(f->name, "main");
ASSERT_EQ(f->params.size(), 1u);
EXPECT_EQ(f->params[0]->symbol(), p->builder().Symbols().Get("a"));
- EXPECT_TRUE(f->return_type->Is<sem::Void>());
+ EXPECT_TRUE(f->return_type->Is<ast::Void>());
}
TEST_F(ParserImplTest, FunctionHeader_DecoratedReturnType) {
@@ -54,7 +54,7 @@
EXPECT_EQ(f->name, "main");
EXPECT_EQ(f->params.size(), 0u);
- EXPECT_TRUE(f->return_type->Is<sem::F32>());
+ EXPECT_TRUE(f->return_type->Is<ast::F32>());
ASSERT_EQ(f->return_type_decorations.size(), 1u);
auto* loc = f->return_type_decorations[0]->As<ast::LocationDecoration>();
ASSERT_TRUE(loc != nullptr);
diff --git a/src/reader/wgsl/parser_impl_function_type_decl_test.cc b/src/reader/wgsl/parser_impl_function_type_decl_test.cc
index ed4eb5a..c9865ab 100644
--- a/src/reader/wgsl/parser_impl_function_type_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_function_type_decl_test.cc
@@ -22,28 +22,25 @@
TEST_F(ParserImplTest, FunctionTypeDecl_Void) {
auto p = parser("void");
- auto* v = p->builder().create<sem::Void>();
-
auto e = p->function_type_decl();
EXPECT_TRUE(e.matched);
EXPECT_FALSE(e.errored);
EXPECT_FALSE(p->has_error()) << p->error();
- ASSERT_EQ(e.value, v);
- EXPECT_EQ(e.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 5u}}));
+ EXPECT_TRUE(e.value->Is<ast::Void>());
+ EXPECT_EQ(e.value->source().range, (Source::Range{{1u, 1u}, {1u, 5u}}));
}
TEST_F(ParserImplTest, FunctionTypeDecl_Type) {
auto p = parser("vec2<f32>");
- auto* f32 = p->builder().create<sem::F32>();
- auto* vec2 = p->builder().create<sem::Vector>(f32, 2);
-
auto e = p->function_type_decl();
EXPECT_TRUE(e.matched);
EXPECT_FALSE(e.errored);
EXPECT_FALSE(p->has_error()) << p->error();
- ASSERT_EQ(e.value, vec2);
- EXPECT_EQ(e.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 10u}}));
+ ASSERT_TRUE(e.value->Is<ast::Vector>());
+ EXPECT_EQ(e.value->As<ast::Vector>()->size(), 2u);
+ EXPECT_TRUE(e.value->As<ast::Vector>()->type()->Is<ast::F32>());
+ EXPECT_EQ(e.value->source().range, (Source::Range{{1u, 1u}, {1u, 10u}}));
}
TEST_F(ParserImplTest, FunctionTypeDecl_InvalidType) {
diff --git a/src/reader/wgsl/parser_impl_sampler_type_test.cc b/src/reader/wgsl/parser_impl_sampler_type_test.cc
index 9ac9f6e..a7891e2 100644
--- a/src/reader/wgsl/parser_impl_sampler_type_test.cc
+++ b/src/reader/wgsl/parser_impl_sampler_type_test.cc
@@ -34,10 +34,10 @@
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
ASSERT_NE(t.value, nullptr);
- ASSERT_TRUE(t->Is<sem::Sampler>());
- EXPECT_FALSE(t->As<sem::Sampler>()->IsComparison());
+ ASSERT_TRUE(t->Is<ast::Sampler>());
+ EXPECT_FALSE(t->As<ast::Sampler>()->IsComparison());
EXPECT_FALSE(p->has_error());
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 8u}}));
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 8u}}));
}
TEST_F(ParserImplTest, SamplerType_ComparisonSampler) {
@@ -46,10 +46,10 @@
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
ASSERT_NE(t.value, nullptr);
- ASSERT_TRUE(t->Is<sem::Sampler>());
- EXPECT_TRUE(t->As<sem::Sampler>()->IsComparison());
+ ASSERT_TRUE(t->Is<ast::Sampler>());
+ EXPECT_TRUE(t->As<ast::Sampler>()->IsComparison());
EXPECT_FALSE(p->has_error());
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 19u}}));
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 19u}}));
}
} // namespace
diff --git a/src/reader/wgsl/parser_impl_struct_decl_test.cc b/src/reader/wgsl/parser_impl_struct_decl_test.cc
index fad7874..d98fb5c 100644
--- a/src/reader/wgsl/parser_impl_struct_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_struct_decl_test.cc
@@ -36,12 +36,10 @@
EXPECT_FALSE(s.errored);
EXPECT_TRUE(s.matched);
ASSERT_NE(s.value, nullptr);
- ASSERT_EQ(s->impl()->name(), p->builder().Symbols().Register("S"));
- ASSERT_EQ(s->impl()->members().size(), 2u);
- EXPECT_EQ(s->impl()->members()[0]->symbol(),
- p->builder().Symbols().Register("a"));
- EXPECT_EQ(s->impl()->members()[1]->symbol(),
- p->builder().Symbols().Register("b"));
+ ASSERT_EQ(s->name(), p->builder().Symbols().Register("S"));
+ ASSERT_EQ(s->members().size(), 2u);
+ EXPECT_EQ(s->members()[0]->symbol(), p->builder().Symbols().Register("a"));
+ EXPECT_EQ(s->members()[1]->symbol(), p->builder().Symbols().Register("b"));
}
TEST_F(ParserImplTest, StructDecl_ParsesWithDecoration) {
@@ -60,14 +58,12 @@
EXPECT_FALSE(s.errored);
EXPECT_TRUE(s.matched);
ASSERT_NE(s.value, nullptr);
- ASSERT_EQ(s->impl()->name(), p->builder().Symbols().Register("B"));
- ASSERT_EQ(s->impl()->members().size(), 2u);
- EXPECT_EQ(s->impl()->members()[0]->symbol(),
- p->builder().Symbols().Register("a"));
- EXPECT_EQ(s->impl()->members()[1]->symbol(),
- p->builder().Symbols().Register("b"));
- ASSERT_EQ(s->impl()->decorations().size(), 1u);
- EXPECT_TRUE(s->impl()->decorations()[0]->Is<ast::StructBlockDecoration>());
+ ASSERT_EQ(s->name(), p->builder().Symbols().Register("B"));
+ ASSERT_EQ(s->members().size(), 2u);
+ EXPECT_EQ(s->members()[0]->symbol(), p->builder().Symbols().Register("a"));
+ EXPECT_EQ(s->members()[1]->symbol(), p->builder().Symbols().Register("b"));
+ ASSERT_EQ(s->decorations().size(), 1u);
+ EXPECT_TRUE(s->decorations()[0]->Is<ast::StructBlockDecoration>());
}
TEST_F(ParserImplTest, StructDecl_ParsesWithMultipleDecoration) {
@@ -87,15 +83,13 @@
EXPECT_FALSE(s.errored);
EXPECT_TRUE(s.matched);
ASSERT_NE(s.value, nullptr);
- ASSERT_EQ(s->impl()->name(), p->builder().Symbols().Register("S"));
- ASSERT_EQ(s->impl()->members().size(), 2u);
- EXPECT_EQ(s->impl()->members()[0]->symbol(),
- p->builder().Symbols().Register("a"));
- EXPECT_EQ(s->impl()->members()[1]->symbol(),
- p->builder().Symbols().Register("b"));
- ASSERT_EQ(s->impl()->decorations().size(), 2u);
- EXPECT_TRUE(s->impl()->decorations()[0]->Is<ast::StructBlockDecoration>());
- EXPECT_TRUE(s->impl()->decorations()[1]->Is<ast::StructBlockDecoration>());
+ ASSERT_EQ(s->name(), p->builder().Symbols().Register("S"));
+ ASSERT_EQ(s->members().size(), 2u);
+ EXPECT_EQ(s->members()[0]->symbol(), p->builder().Symbols().Register("a"));
+ EXPECT_EQ(s->members()[1]->symbol(), p->builder().Symbols().Register("b"));
+ ASSERT_EQ(s->decorations().size(), 2u);
+ EXPECT_TRUE(s->decorations()[0]->Is<ast::StructBlockDecoration>());
+ EXPECT_TRUE(s->decorations()[1]->Is<ast::StructBlockDecoration>());
}
TEST_F(ParserImplTest, StructDecl_EmptyMembers) {
@@ -110,7 +104,7 @@
EXPECT_FALSE(s.errored);
EXPECT_TRUE(s.matched);
ASSERT_NE(s.value, nullptr);
- ASSERT_EQ(s->impl()->members().size(), 0u);
+ ASSERT_EQ(s->members().size(), 0u);
}
TEST_F(ParserImplTest, StructDecl_MissingIdent) {
diff --git a/src/reader/wgsl/parser_impl_test.cc b/src/reader/wgsl/parser_impl_test.cc
index 861b819..3c415f6 100644
--- a/src/reader/wgsl/parser_impl_test.cc
+++ b/src/reader/wgsl/parser_impl_test.cc
@@ -57,7 +57,7 @@
auto* alias = p->get_constructed("my_alias");
ASSERT_NE(alias, nullptr);
- ASSERT_EQ(alias, ty.i32());
+ EXPECT_TRUE(alias->Is<ast::I32>());
}
TEST_F(ParserImplTest, GetUnregisteredType) {
diff --git a/src/reader/wgsl/parser_impl_texture_sampler_types_test.cc b/src/reader/wgsl/parser_impl_texture_sampler_types_test.cc
index 646100d..2406ae7 100644
--- a/src/reader/wgsl/parser_impl_texture_sampler_types_test.cc
+++ b/src/reader/wgsl/parser_impl_texture_sampler_types_test.cc
@@ -38,9 +38,9 @@
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
ASSERT_NE(t.value, nullptr);
- ASSERT_TRUE(t->Is<sem::Sampler>());
- ASSERT_FALSE(t->As<sem::Sampler>()->IsComparison());
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 8u}}));
+ ASSERT_TRUE(t->Is<ast::Sampler>());
+ ASSERT_FALSE(t->As<ast::Sampler>()->IsComparison());
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 8u}}));
}
TEST_F(ParserImplTest, TextureSamplerTypes_SamplerComparison) {
@@ -50,9 +50,9 @@
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
ASSERT_NE(t.value, nullptr);
- ASSERT_TRUE(t->Is<sem::Sampler>());
- ASSERT_TRUE(t->As<sem::Sampler>()->IsComparison());
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 19u}}));
+ ASSERT_TRUE(t->Is<ast::Sampler>());
+ ASSERT_TRUE(t->As<ast::Sampler>()->IsComparison());
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 19u}}));
}
TEST_F(ParserImplTest, TextureSamplerTypes_DepthTexture) {
@@ -62,10 +62,10 @@
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
ASSERT_NE(t.value, nullptr);
- ASSERT_TRUE(t->Is<sem::Texture>());
- ASSERT_TRUE(t->Is<sem::DepthTexture>());
- EXPECT_EQ(t->As<sem::Texture>()->dim(), ast::TextureDimension::k2d);
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 17u}}));
+ ASSERT_TRUE(t->Is<ast::Texture>());
+ ASSERT_TRUE(t->Is<ast::DepthTexture>());
+ EXPECT_EQ(t->As<ast::Texture>()->dim(), ast::TextureDimension::k2d);
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 17u}}));
}
TEST_F(ParserImplTest, TextureSamplerTypes_SampledTexture_F32) {
@@ -75,11 +75,11 @@
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
ASSERT_NE(t.value, nullptr);
- ASSERT_TRUE(t->Is<sem::Texture>());
- ASSERT_TRUE(t->Is<sem::SampledTexture>());
- ASSERT_TRUE(t->As<sem::SampledTexture>()->type()->Is<sem::F32>());
- EXPECT_EQ(t->As<sem::Texture>()->dim(), ast::TextureDimension::k1d);
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 16u}}));
+ ASSERT_TRUE(t->Is<ast::Texture>());
+ ASSERT_TRUE(t->Is<ast::SampledTexture>());
+ ASSERT_TRUE(t->As<ast::SampledTexture>()->type()->Is<ast::F32>());
+ EXPECT_EQ(t->As<ast::Texture>()->dim(), ast::TextureDimension::k1d);
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 16u}}));
}
TEST_F(ParserImplTest, TextureSamplerTypes_SampledTexture_I32) {
@@ -89,11 +89,11 @@
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
ASSERT_NE(t.value, nullptr);
- ASSERT_TRUE(t->Is<sem::Texture>());
- ASSERT_TRUE(t->Is<sem::SampledTexture>());
- ASSERT_TRUE(t->As<sem::SampledTexture>()->type()->Is<sem::I32>());
- EXPECT_EQ(t->As<sem::Texture>()->dim(), ast::TextureDimension::k2d);
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 16u}}));
+ ASSERT_TRUE(t->Is<ast::Texture>());
+ ASSERT_TRUE(t->Is<ast::SampledTexture>());
+ ASSERT_TRUE(t->As<ast::SampledTexture>()->type()->Is<ast::I32>());
+ EXPECT_EQ(t->As<ast::Texture>()->dim(), ast::TextureDimension::k2d);
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 16u}}));
}
TEST_F(ParserImplTest, TextureSamplerTypes_SampledTexture_U32) {
@@ -103,11 +103,11 @@
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
ASSERT_NE(t.value, nullptr);
- ASSERT_TRUE(t->Is<sem::Texture>());
- ASSERT_TRUE(t->Is<sem::SampledTexture>());
- ASSERT_TRUE(t->As<sem::SampledTexture>()->type()->Is<sem::U32>());
- EXPECT_EQ(t->As<sem::Texture>()->dim(), ast::TextureDimension::k3d);
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 16u}}));
+ ASSERT_TRUE(t->Is<ast::Texture>());
+ ASSERT_TRUE(t->Is<ast::SampledTexture>());
+ ASSERT_TRUE(t->As<ast::SampledTexture>()->type()->Is<ast::U32>());
+ EXPECT_EQ(t->As<ast::Texture>()->dim(), ast::TextureDimension::k3d);
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 16u}}));
}
TEST_F(ParserImplTest, TextureSamplerTypes_SampledTexture_Invalid) {
@@ -157,11 +157,11 @@
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
ASSERT_NE(t.value, nullptr);
- ASSERT_TRUE(t->Is<sem::Texture>());
- ASSERT_TRUE(t->Is<sem::MultisampledTexture>());
- ASSERT_TRUE(t->As<sem::MultisampledTexture>()->type()->Is<sem::I32>());
- EXPECT_EQ(t->As<sem::Texture>()->dim(), ast::TextureDimension::k2d);
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 29u}}));
+ ASSERT_TRUE(t->Is<ast::Texture>());
+ ASSERT_TRUE(t->Is<ast::MultisampledTexture>());
+ ASSERT_TRUE(t->As<ast::MultisampledTexture>()->type()->Is<ast::I32>());
+ EXPECT_EQ(t->As<ast::Texture>()->dim(), ast::TextureDimension::k2d);
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 29u}}));
}
TEST_F(ParserImplTest, TextureSamplerTypes_MultisampledTexture_Invalid) {
@@ -212,12 +212,12 @@
EXPECT_FALSE(t.errored);
ASSERT_NE(t.value, nullptr);
- ASSERT_TRUE(t->Is<sem::Texture>());
- ASSERT_TRUE(t->Is<sem::StorageTexture>());
- EXPECT_EQ(t->As<sem::StorageTexture>()->image_format(),
+ ASSERT_TRUE(t->Is<ast::Texture>());
+ ASSERT_TRUE(t->Is<ast::StorageTexture>());
+ EXPECT_EQ(t->As<ast::StorageTexture>()->image_format(),
ast::ImageFormat::kR8Unorm);
- EXPECT_EQ(t->As<sem::Texture>()->dim(), ast::TextureDimension::k1d);
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 28u}}));
+ EXPECT_EQ(t->As<ast::Texture>()->dim(), ast::TextureDimension::k1d);
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 28u}}));
}
TEST_F(ParserImplTest, TextureSamplerTypes_StorageTexture_Writeonly2dR16Float) {
@@ -228,12 +228,12 @@
EXPECT_FALSE(t.errored);
ASSERT_NE(t.value, nullptr);
- ASSERT_TRUE(t->Is<sem::Texture>());
- ASSERT_TRUE(t->Is<sem::StorageTexture>());
- EXPECT_EQ(t->As<sem::StorageTexture>()->image_format(),
+ ASSERT_TRUE(t->Is<ast::Texture>());
+ ASSERT_TRUE(t->Is<ast::StorageTexture>());
+ EXPECT_EQ(t->As<ast::StorageTexture>()->image_format(),
ast::ImageFormat::kR16Float);
- EXPECT_EQ(t->As<sem::Texture>()->dim(), ast::TextureDimension::k2d);
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 29u}}));
+ EXPECT_EQ(t->As<ast::Texture>()->dim(), ast::TextureDimension::k2d);
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 29u}}));
}
TEST_F(ParserImplTest, TextureSamplerTypes_StorageTexture_InvalidType) {
diff --git a/src/reader/wgsl/parser_impl_type_alias_test.cc b/src/reader/wgsl/parser_impl_type_alias_test.cc
index d7f7203..fba0e5c 100644
--- a/src/reader/wgsl/parser_impl_type_alias_test.cc
+++ b/src/reader/wgsl/parser_impl_type_alias_test.cc
@@ -22,19 +22,16 @@
TEST_F(ParserImplTest, TypeDecl_ParsesType) {
auto p = parser("type a = i32");
- auto* i32 = p->builder().create<sem::I32>();
-
auto t = p->type_alias();
EXPECT_FALSE(p->has_error());
EXPECT_FALSE(t.errored);
EXPECT_TRUE(t.matched);
ASSERT_NE(t.value, nullptr);
- ASSERT_TRUE(t->Is<sem::Alias>());
- auto* alias = t->As<sem::Alias>();
- ASSERT_TRUE(alias->type()->Is<sem::I32>());
- ASSERT_EQ(alias->type(), i32);
+ ASSERT_TRUE(t->Is<ast::Alias>());
+ auto* alias = t->As<ast::Alias>();
+ ASSERT_TRUE(alias->type()->Is<ast::I32>());
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 13u}}));
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 13u}}));
}
TEST_F(ParserImplTest, TypeDecl_ParsesStruct_Ident) {
@@ -48,16 +45,11 @@
EXPECT_FALSE(t.errored);
EXPECT_TRUE(t.matched);
ASSERT_NE(t.value, nullptr);
- ASSERT_TRUE(t->Is<sem::Alias>());
- auto* alias = t->As<sem::Alias>();
+ ASSERT_TRUE(t.value->Is<ast::Alias>());
+ auto* alias = t.value->As<ast::Alias>();
EXPECT_EQ(p->builder().Symbols().NameFor(alias->symbol()), "a");
- ASSERT_TRUE(alias->type()->Is<sem::StructType>());
-
- auto* s = alias->type()->As<sem::StructType>();
- EXPECT_EQ(s->impl()->name(), p->builder().Symbols().Get("B"));
- EXPECT_EQ(s->impl()->name(), p->builder().Symbols().Get("B"));
-
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 11u}}));
+ EXPECT_TRUE(alias->type()->Is<ast::TypeName>());
+ EXPECT_EQ(alias->source().range, (Source::Range{{1u, 1u}, {1u, 11u}}));
}
TEST_F(ParserImplTest, TypeDecl_MissingIdent) {
diff --git a/src/reader/wgsl/parser_impl_type_decl_test.cc b/src/reader/wgsl/parser_impl_type_decl_test.cc
index ea5f413..af10a76 100644
--- a/src/reader/wgsl/parser_impl_type_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_type_decl_test.cc
@@ -37,18 +37,14 @@
auto p = parser("A");
auto& builder = p->builder();
-
- auto* int_type = builder.create<sem::I32>();
- auto* alias_type =
- builder.create<sem::Alias>(builder.Symbols().Register("A"), int_type);
-
+ auto alias_type = builder.ty.alias("A", builder.ty.i32());
p->register_constructed("A", alias_type);
auto t = p->type_decl();
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
- ASSERT_NE(t.value.ast, nullptr) << p->error();
- auto* type_name = t.value.ast->As<ast::TypeName>();
+ ASSERT_NE(t.value, nullptr) << p->error();
+ auto* type_name = t.value->As<ast::TypeName>();
ASSERT_NE(type_name, nullptr);
EXPECT_EQ(p->builder().Symbols().Get("A"), type_name->name());
EXPECT_EQ(type_name->source().range, (Source::Range{{1u, 1u}, {1u, 2u}}));
@@ -68,46 +64,34 @@
TEST_F(ParserImplTest, TypeDecl_Bool) {
auto p = parser("bool");
- auto& builder = p->builder();
- auto* bool_type = builder.create<sem::Bool>();
-
auto t = p->type_decl();
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
- ASSERT_NE(t.value.ast, nullptr) << p->error();
- EXPECT_EQ(t.value, bool_type);
- ASSERT_TRUE(t.value.ast->Is<ast::Bool>());
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 5u}}));
+ ASSERT_NE(t.value, nullptr) << p->error();
+ ASSERT_TRUE(t.value->Is<ast::Bool>());
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 5u}}));
}
TEST_F(ParserImplTest, TypeDecl_F32) {
auto p = parser("f32");
- auto& builder = p->builder();
- auto* float_type = builder.create<sem::F32>();
-
auto t = p->type_decl();
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
- ASSERT_NE(t.value.ast, nullptr) << p->error();
- EXPECT_EQ(t.value, float_type);
- ASSERT_TRUE(t.value.ast->Is<ast::F32>());
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 4u}}));
+ ASSERT_NE(t.value, nullptr) << p->error();
+ ASSERT_TRUE(t.value->Is<ast::F32>());
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 4u}}));
}
TEST_F(ParserImplTest, TypeDecl_I32) {
auto p = parser("i32");
- auto& builder = p->builder();
- auto* int_type = builder.create<sem::I32>();
-
auto t = p->type_decl();
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
- ASSERT_NE(t.value.ast, nullptr) << p->error();
- EXPECT_EQ(t.value, int_type);
- ASSERT_TRUE(t.value.ast->Is<ast::I32>());
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 4u}}));
+ ASSERT_NE(t.value, nullptr) << p->error();
+ ASSERT_TRUE(t.value->Is<ast::I32>());
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 4u}}));
}
TEST_F(ParserImplTest, TypeDecl_U32) {
@@ -116,9 +100,9 @@
auto t = p->type_decl();
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
- ASSERT_NE(t.value.ast, nullptr) << p->error();
- ASSERT_TRUE(t.value.ast->Is<ast::U32>());
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 4u}}));
+ ASSERT_NE(t.value, nullptr) << p->error();
+ ASSERT_TRUE(t.value->Is<ast::U32>());
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 4u}}));
}
struct VecData {
@@ -139,11 +123,11 @@
auto t = p->type_decl();
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
- ASSERT_NE(t.value.ast, nullptr) << p->error();
+ ASSERT_NE(t.value, nullptr) << p->error();
ASSERT_FALSE(p->has_error());
- EXPECT_TRUE(t.value.ast->Is<ast::Vector>());
- EXPECT_EQ(t.value.ast->As<ast::Vector>()->size(), params.count);
- EXPECT_EQ(t.value.ast->source().range, params.range);
+ EXPECT_TRUE(t.value->Is<ast::Vector>());
+ EXPECT_EQ(t.value->As<ast::Vector>()->size(), params.count);
+ EXPECT_EQ(t.value->source().range, params.range);
}
INSTANTIATE_TEST_SUITE_P(
ParserImplTest,
@@ -229,14 +213,14 @@
auto t = p->type_decl();
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
- ASSERT_NE(t.value.ast, nullptr) << p->error();
+ ASSERT_NE(t.value, nullptr) << p->error();
ASSERT_FALSE(p->has_error());
- ASSERT_TRUE(t.value.ast->Is<ast::Pointer>());
+ ASSERT_TRUE(t.value->Is<ast::Pointer>());
- auto* ptr = t.value.ast->As<ast::Pointer>();
+ auto* ptr = t.value->As<ast::Pointer>();
ASSERT_TRUE(ptr->type()->Is<ast::F32>());
ASSERT_EQ(ptr->storage_class(), ast::StorageClass::kFunction);
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 19u}}));
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 19u}}));
}
TEST_F(ParserImplTest, TypeDecl_Ptr_ToVec) {
@@ -244,18 +228,18 @@
auto t = p->type_decl();
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
- ASSERT_NE(t.value.ast, nullptr) << p->error();
+ ASSERT_NE(t.value, nullptr) << p->error();
ASSERT_FALSE(p->has_error());
- ASSERT_TRUE(t.value.ast->Is<ast::Pointer>());
+ ASSERT_TRUE(t.value->Is<ast::Pointer>());
- auto* ptr = t.value.ast->As<ast::Pointer>();
+ auto* ptr = t.value->As<ast::Pointer>();
ASSERT_TRUE(ptr->type()->Is<ast::Vector>());
ASSERT_EQ(ptr->storage_class(), ast::StorageClass::kFunction);
auto* vec = ptr->type()->As<ast::Vector>();
ASSERT_EQ(vec->size(), 2u);
ASSERT_TRUE(vec->type()->Is<ast::F32>());
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 25}}));
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 25}}));
}
TEST_F(ParserImplTest, TypeDecl_Ptr_MissingLessThan) {
@@ -343,16 +327,16 @@
auto t = p->type_decl();
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
- ASSERT_NE(t.value.ast, nullptr) << p->error();
+ ASSERT_NE(t.value, nullptr) << p->error();
ASSERT_FALSE(p->has_error());
- ASSERT_TRUE(t.value.ast->Is<ast::Array>());
+ ASSERT_TRUE(t.value->Is<ast::Array>());
- auto* a = t.value.ast->As<ast::Array>();
+ auto* a = t.value->As<ast::Array>();
ASSERT_FALSE(a->IsRuntimeArray());
ASSERT_EQ(a->size(), 5u);
ASSERT_TRUE(a->type()->Is<ast::F32>());
EXPECT_EQ(a->decorations().size(), 0u);
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 14u}}));
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 14u}}));
}
TEST_F(ParserImplTest, TypeDecl_Array_Stride) {
@@ -360,11 +344,11 @@
auto t = p->type_decl();
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
- ASSERT_NE(t.value.ast, nullptr) << p->error();
+ ASSERT_NE(t.value, nullptr) << p->error();
ASSERT_FALSE(p->has_error());
- ASSERT_TRUE(t.value.ast->Is<ast::Array>());
+ ASSERT_TRUE(t.value->Is<ast::Array>());
- auto* a = t.value.ast->As<ast::Array>();
+ auto* a = t.value->As<ast::Array>();
ASSERT_FALSE(a->IsRuntimeArray());
ASSERT_EQ(a->size(), 5u);
ASSERT_TRUE(a->type()->Is<ast::F32>());
@@ -373,7 +357,7 @@
auto* stride = a->decorations()[0];
ASSERT_TRUE(stride->Is<ast::StrideDecoration>());
ASSERT_EQ(stride->As<ast::StrideDecoration>()->stride(), 16u);
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 16u}, {1u, 29u}}));
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 16u}, {1u, 29u}}));
}
TEST_F(ParserImplTest, TypeDecl_Array_Runtime_Stride) {
@@ -381,11 +365,11 @@
auto t = p->type_decl();
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
- ASSERT_NE(t.value.ast, nullptr) << p->error();
+ ASSERT_NE(t.value, nullptr) << p->error();
ASSERT_FALSE(p->has_error());
- ASSERT_TRUE(t.value.ast->Is<ast::Array>());
+ ASSERT_TRUE(t.value->Is<ast::Array>());
- auto* a = t.value.ast->As<ast::Array>();
+ auto* a = t.value->As<ast::Array>();
ASSERT_TRUE(a->IsRuntimeArray());
ASSERT_TRUE(a->type()->Is<ast::F32>());
@@ -393,7 +377,7 @@
auto* stride = a->decorations()[0];
ASSERT_TRUE(stride->Is<ast::StrideDecoration>());
ASSERT_EQ(stride->As<ast::StrideDecoration>()->stride(), 16u);
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 16u}, {1u, 26u}}));
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 16u}, {1u, 26u}}));
}
TEST_F(ParserImplTest, TypeDecl_Array_MultipleDecorations_OneBlock) {
@@ -401,11 +385,11 @@
auto t = p->type_decl();
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
- ASSERT_NE(t.value.ast, nullptr) << p->error();
+ ASSERT_NE(t.value, nullptr) << p->error();
ASSERT_FALSE(p->has_error());
- ASSERT_TRUE(t.value.ast->Is<ast::Array>());
+ ASSERT_TRUE(t.value->Is<ast::Array>());
- auto* a = t.value.ast->As<ast::Array>();
+ auto* a = t.value->As<ast::Array>();
ASSERT_TRUE(a->IsRuntimeArray());
ASSERT_TRUE(a->type()->Is<ast::F32>());
@@ -415,7 +399,7 @@
EXPECT_EQ(decos[0]->As<ast::StrideDecoration>()->stride(), 16u);
EXPECT_TRUE(decos[1]->Is<ast::StrideDecoration>());
EXPECT_EQ(decos[1]->As<ast::StrideDecoration>()->stride(), 32u);
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 28u}, {1u, 38u}}));
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 28u}, {1u, 38u}}));
}
TEST_F(ParserImplTest, TypeDecl_Array_MultipleDecorations_MultipleBlocks) {
@@ -423,11 +407,11 @@
auto t = p->type_decl();
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
- ASSERT_NE(t.value.ast, nullptr) << p->error();
+ ASSERT_NE(t.value, nullptr) << p->error();
ASSERT_FALSE(p->has_error());
- ASSERT_TRUE(t.value.ast->Is<ast::Array>());
+ ASSERT_TRUE(t.value->Is<ast::Array>());
- auto* a = t.value.ast->As<ast::Array>();
+ auto* a = t.value->As<ast::Array>();
ASSERT_TRUE(a->IsRuntimeArray());
ASSERT_TRUE(a->type()->Is<ast::F32>());
@@ -437,7 +421,7 @@
EXPECT_EQ(decos[0]->As<ast::StrideDecoration>()->stride(), 16u);
EXPECT_TRUE(decos[1]->Is<ast::StrideDecoration>());
EXPECT_EQ(decos[1]->As<ast::StrideDecoration>()->stride(), 32u);
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 31u}, {1u, 41u}}));
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 31u}, {1u, 41u}}));
}
TEST_F(ParserImplTest, TypeDecl_Array_Decoration_MissingArray) {
@@ -527,14 +511,14 @@
auto t = p->type_decl();
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
- ASSERT_NE(t.value.ast, nullptr) << p->error();
+ ASSERT_NE(t.value, nullptr) << p->error();
ASSERT_FALSE(p->has_error());
- ASSERT_TRUE(t.value.ast->Is<ast::Array>());
+ ASSERT_TRUE(t.value->Is<ast::Array>());
- auto* a = t.value.ast->As<ast::Array>();
+ auto* a = t.value->As<ast::Array>();
ASSERT_TRUE(a->IsRuntimeArray());
ASSERT_TRUE(a->type()->Is<ast::U32>());
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 11u}}));
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 11u}}));
}
TEST_F(ParserImplTest, TypeDecl_Array_Runtime_Vec) {
@@ -542,14 +526,14 @@
auto t = p->type_decl();
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
- ASSERT_NE(t.value.ast, nullptr) << p->error();
+ ASSERT_NE(t.value, nullptr) << p->error();
ASSERT_FALSE(p->has_error());
- ASSERT_TRUE(t.value.ast->Is<ast::Array>());
+ ASSERT_TRUE(t.value->Is<ast::Array>());
- auto* a = t.value.ast->As<ast::Array>();
+ auto* a = t.value->As<ast::Array>();
ASSERT_TRUE(a->IsRuntimeArray());
ASSERT_TRUE(a->type()->is_unsigned_integer_vector());
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 17u}}));
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 17u}}));
}
TEST_F(ParserImplTest, TypeDecl_Array_BadType) {
@@ -641,13 +625,13 @@
auto t = p->type_decl();
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
- ASSERT_NE(t.value.ast, nullptr) << p->error();
+ ASSERT_NE(t.value, nullptr) << p->error();
ASSERT_FALSE(p->has_error());
- EXPECT_TRUE(t.value.ast->Is<ast::Matrix>());
- auto* mat = t.value.ast->As<ast::Matrix>();
+ EXPECT_TRUE(t.value->Is<ast::Matrix>());
+ auto* mat = t.value->As<ast::Matrix>();
EXPECT_EQ(mat->rows(), params.rows);
EXPECT_EQ(mat->columns(), params.columns);
- EXPECT_EQ(t.value.ast->source().range, params.range);
+ EXPECT_EQ(t.value->source().range, params.range);
}
INSTANTIATE_TEST_SUITE_P(
ParserImplTest,
@@ -763,35 +747,26 @@
TEST_F(ParserImplTest, TypeDecl_Sampler) {
auto p = parser("sampler");
- auto& builder = p->builder();
- auto type = builder.ty.sampler(ast::SamplerKind::kSampler);
-
auto t = p->type_decl();
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
- ASSERT_NE(t.value.ast, nullptr) << p->error();
- EXPECT_EQ(t.value, type);
- ASSERT_TRUE(t.value.ast->Is<ast::Sampler>());
- ASSERT_FALSE(t.value.ast->As<ast::Sampler>()->IsComparison());
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 8u}}));
+ ASSERT_NE(t.value, nullptr) << p->error();
+ ASSERT_TRUE(t.value->Is<ast::Sampler>());
+ ASSERT_FALSE(t.value->As<ast::Sampler>()->IsComparison());
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 8u}}));
}
TEST_F(ParserImplTest, TypeDecl_Texture) {
auto p = parser("texture_cube<f32>");
- auto& builder = p->builder();
- auto* type = builder.create<sem::SampledTexture>(ast::TextureDimension::kCube,
- ty.f32());
-
auto t = p->type_decl();
EXPECT_TRUE(t.matched);
EXPECT_FALSE(t.errored);
- ASSERT_NE(t.value.ast, nullptr);
- EXPECT_EQ(t.value, type);
- ASSERT_TRUE(t.value.ast->Is<ast::Texture>());
- ASSERT_TRUE(t.value.ast->Is<ast::SampledTexture>());
- ASSERT_TRUE(t.value.ast->As<ast::SampledTexture>()->type()->Is<ast::F32>());
- EXPECT_EQ(t.value.ast->source().range, (Source::Range{{1u, 1u}, {1u, 18u}}));
+ ASSERT_NE(t.value, nullptr);
+ ASSERT_TRUE(t.value->Is<ast::Texture>());
+ ASSERT_TRUE(t.value->Is<ast::SampledTexture>());
+ ASSERT_TRUE(t.value->As<ast::SampledTexture>()->type()->Is<ast::F32>());
+ EXPECT_EQ(t.value->source().range, (Source::Range{{1u, 1u}, {1u, 18u}}));
}
} // namespace
diff --git a/src/reader/wgsl/parser_impl_variable_decl_test.cc b/src/reader/wgsl/parser_impl_variable_decl_test.cc
index d932bd1..bb5a659 100644
--- a/src/reader/wgsl/parser_impl_variable_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_variable_decl_test.cc
@@ -27,10 +27,10 @@
EXPECT_FALSE(v.errored);
EXPECT_EQ(v->name, "my_var");
EXPECT_NE(v->type, nullptr);
- EXPECT_TRUE(v->type->Is<sem::F32>());
+ EXPECT_TRUE(v->type->Is<ast::F32>());
EXPECT_EQ(v->source.range, (Source::Range{{1u, 5u}, {1u, 11u}}));
- EXPECT_EQ(v->type.ast->source().range, (Source::Range{{1u, 14u}, {1u, 17u}}));
+ EXPECT_EQ(v->type->source().range, (Source::Range{{1u, 14u}, {1u, 17u}}));
}
TEST_F(ParserImplTest, VariableDecl_MissingVar) {
@@ -60,7 +60,7 @@
EXPECT_FALSE(v.errored);
EXPECT_FALSE(p->has_error());
EXPECT_EQ(v->name, "my_var");
- EXPECT_TRUE(v->type->Is<sem::F32>());
+ EXPECT_TRUE(v->type->Is<ast::F32>());
EXPECT_EQ(v->storage_class, ast::StorageClass::kPrivate);
EXPECT_EQ(v->source.range.begin.line, 1u);
diff --git a/src/reader/wgsl/parser_impl_variable_ident_decl_test.cc b/src/reader/wgsl/parser_impl_variable_ident_decl_test.cc
index 8d4ac62..55605b9 100644
--- a/src/reader/wgsl/parser_impl_variable_ident_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_variable_ident_decl_test.cc
@@ -28,11 +28,10 @@
ASSERT_FALSE(decl.errored);
ASSERT_EQ(decl->name, "my_var");
ASSERT_NE(decl->type, nullptr);
- ASSERT_TRUE(decl->type->Is<sem::F32>());
+ ASSERT_TRUE(decl->type->Is<ast::F32>());
EXPECT_EQ(decl->source.range, (Source::Range{{1u, 1u}, {1u, 7u}}));
- EXPECT_EQ(decl->type.ast->source().range,
- (Source::Range{{1u, 10u}, {1u, 13u}}));
+ EXPECT_EQ(decl->type->source().range, (Source::Range{{1u, 10u}, {1u, 13u}}));
}
TEST_F(ParserImplTest, VariableIdentDecl_MissingIdent) {
@@ -83,10 +82,10 @@
ASSERT_FALSE(decl.errored);
ASSERT_EQ(decl->name, "my_var");
ASSERT_NE(decl->type, nullptr);
- ASSERT_TRUE(decl->type->Is<sem::AccessControl>());
- EXPECT_TRUE(decl->type->As<sem::AccessControl>()->IsReadOnly());
+ ASSERT_TRUE(decl->type->Is<ast::AccessControl>());
+ EXPECT_TRUE(decl->type->As<ast::AccessControl>()->IsReadOnly());
ASSERT_TRUE(
- decl->type->As<sem::AccessControl>()->type()->Is<sem::StorageTexture>());
+ decl->type->As<ast::AccessControl>()->type()->Is<ast::StorageTexture>());
}
TEST_F(ParserImplTest, VariableIdentDecl_ParsesWithTextureAccessDeco_Write) {
@@ -97,10 +96,10 @@
ASSERT_FALSE(decl.errored);
ASSERT_EQ(decl->name, "my_var");
ASSERT_NE(decl->type, nullptr);
- ASSERT_TRUE(decl->type->Is<sem::AccessControl>());
- EXPECT_TRUE(decl->type->As<sem::AccessControl>()->IsWriteOnly());
+ ASSERT_TRUE(decl->type->Is<ast::AccessControl>());
+ EXPECT_TRUE(decl->type->As<ast::AccessControl>()->IsWriteOnly());
ASSERT_TRUE(
- decl->type->As<sem::AccessControl>()->type()->Is<sem::StorageTexture>());
+ decl->type->As<ast::AccessControl>()->type()->Is<ast::StorageTexture>());
}
TEST_F(ParserImplTest, VariableIdentDecl_ParsesWithAccessDeco_Read) {
@@ -123,8 +122,8 @@
ASSERT_FALSE(decl.errored);
ASSERT_EQ(decl->name, "my_var");
ASSERT_NE(decl->type, nullptr);
- ASSERT_TRUE(decl->type->Is<sem::AccessControl>());
- EXPECT_TRUE(decl->type->As<sem::AccessControl>()->IsReadOnly());
+ ASSERT_TRUE(decl->type->Is<ast::AccessControl>());
+ EXPECT_TRUE(decl->type->As<ast::AccessControl>()->IsReadOnly());
}
TEST_F(ParserImplTest, VariableIdentDecl_ParsesWithAccessDeco_ReadWrite) {
@@ -147,8 +146,8 @@
ASSERT_FALSE(decl.errored);
ASSERT_EQ(decl->name, "my_var");
ASSERT_NE(decl->type, nullptr);
- ASSERT_TRUE(decl->type->Is<sem::AccessControl>());
- EXPECT_TRUE(decl->type->As<sem::AccessControl>()->IsReadWrite());
+ ASSERT_TRUE(decl->type->Is<ast::AccessControl>());
+ EXPECT_TRUE(decl->type->As<ast::AccessControl>()->IsReadWrite());
}
TEST_F(ParserImplTest, VariableIdentDecl_MultipleAccessDecoFail) {