Add helper to create StructMember nodes.

This CL updates the ast::Builder to provide help creating struct members
and decorations. The helpers are then used throughout the various files
to simplify the code.

Change-Id: I53af4578190499d9ae2623073f8a44182954e5d9
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/35821
Commit-Queue: dan sinclair <dsinclair@chromium.org>
Reviewed-by: Ben Clayton <bclayton@google.com>
Auto-Submit: dan sinclair <dsinclair@chromium.org>
This commit is contained in:
dan sinclair 2020-12-16 14:41:00 +00:00 committed by Commit Bot service account
parent 8b40a67cf7
commit 5e5e36e7d2
40 changed files with 922 additions and 1634 deletions

View File

@ -30,6 +30,9 @@
#include "src/ast/module.h" #include "src/ast/module.h"
#include "src/ast/scalar_constructor_expression.h" #include "src/ast/scalar_constructor_expression.h"
#include "src/ast/sint_literal.h" #include "src/ast/sint_literal.h"
#include "src/ast/struct.h"
#include "src/ast/struct_member.h"
#include "src/ast/struct_member_offset_decoration.h"
#include "src/ast/type/array_type.h" #include "src/ast/type/array_type.h"
#include "src/ast/type/bool_type.h" #include "src/ast/type/bool_type.h"
#include "src/ast/type/f32_type.h" #include "src/ast/type/f32_type.h"
@ -571,6 +574,34 @@ class Builder {
Expr(std::forward<IDX>(idx))); Expr(std::forward<IDX>(idx)));
} }
/// Creates a StructMemberOffsetDecoration
/// @param val the offset value
/// @returns the offset decoration pointer
StructMemberOffsetDecoration* MemberOffset(uint32_t val) {
return mod->create<StructMemberOffsetDecoration>(source_, val);
}
/// Creates a StructMember
/// @param name the struct member name
/// @param type the struct member type
/// @returns the struct member pointer
StructMember* Member(const std::string& name, type::Type* type) {
return mod->create<StructMember>(source_, mod->RegisterSymbol(name), name,
type, StructMemberDecorationList{});
}
/// Creates a StructMember
/// @param name the struct member name
/// @param type the struct member type
/// @param decos the struct member decorations
/// @returns the struct member pointer
StructMember* Member(const std::string& name,
type::Type* type,
StructMemberDecorationList decos) {
return mod->create<StructMember>(source_, mod->RegisterSymbol(name), name,
type, decos);
}
/// Creates a new Node owned by the Module, with the explicit Source. /// Creates a new Node owned by the Module, with the explicit Source.
/// When the Module is destructed, the `Node` will also be destructed. /// When the Module is destructed, the `Node` will also be destructed.
/// @param source the source to apply to the Node /// @param source the source to apply to the Node

File diff suppressed because it is too large Load Diff

View File

@ -785,14 +785,10 @@ TEST_F(TypeDeterminerTest, Function_NotRegisterFunctionVariable) {
} }
TEST_F(TypeDeterminerTest, Expr_MemberAccessor_Struct) { TEST_F(TypeDeterminerTest, Expr_MemberAccessor_Struct) {
ast::StructMemberDecorationList decos; auto* strct = create<ast::Struct>(
ast::StructMemberList members; ast::StructMemberList{Member("first_member", ty.i32),
members.push_back(create<ast::StructMember>( Member("second_member", ty.f32)},
mod->RegisterSymbol("first_member"), "first_member", ty.i32, decos)); ast::StructDecorationList{});
members.push_back(create<ast::StructMember>(
mod->RegisterSymbol("second_member"), "second_member", ty.f32, decos));
auto* strct = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct st(mod->RegisterSymbol("S"), "S", strct); ast::type::Struct st(mod->RegisterSymbol("S"), "S", strct);
@ -812,14 +808,10 @@ TEST_F(TypeDeterminerTest, Expr_MemberAccessor_Struct) {
} }
TEST_F(TypeDeterminerTest, Expr_MemberAccessor_Struct_Alias) { TEST_F(TypeDeterminerTest, Expr_MemberAccessor_Struct_Alias) {
ast::StructMemberDecorationList decos; auto* strct = create<ast::Struct>(
ast::StructMemberList members; ast::StructMemberList{Member("first_member", ty.i32),
members.push_back(create<ast::StructMember>( Member("second_member", ty.f32)},
mod->RegisterSymbol("first_member"), "first_member", ty.i32, decos)); ast::StructDecorationList{});
members.push_back(create<ast::StructMember>(
mod->RegisterSymbol("second_member"), "second_member", ty.f32, decos));
auto* strct = create<ast::Struct>(members, ast::StructDecorationList{});
auto st = std::make_unique<ast::type::Struct>(mod->RegisterSymbol("alias"), auto st = std::make_unique<ast::type::Struct>(mod->RegisterSymbol("alias"),
"alias", strct); "alias", strct);
@ -898,21 +890,14 @@ TEST_F(TypeDeterminerTest, Expr_Accessor_MultiLevel) {
// } // }
// //
ast::StructMemberDecorationList decos; auto* strctB =
ast::StructMemberList b_members; create<ast::Struct>(ast::StructMemberList{Member("foo", ty.vec4<f32>())},
b_members.push_back(create<ast::StructMember>(mod->RegisterSymbol("foo"), ast::StructDecorationList{});
"foo", ty.vec4<f32>(), decos));
auto* strctB = create<ast::Struct>(b_members, ast::StructDecorationList{});
ast::type::Struct stB(mod->RegisterSymbol("B"), "B", strctB); ast::type::Struct stB(mod->RegisterSymbol("B"), "B", strctB);
ast::type::Vector vecB(&stB, 3); ast::type::Vector vecB(&stB, 3);
auto* strctA = create<ast::Struct>(
ast::StructMemberList a_members; ast::StructMemberList{Member("mem", &vecB)}, ast::StructDecorationList{});
a_members.push_back(create<ast::StructMember>(mod->RegisterSymbol("mem"),
"mem", &vecB, decos));
auto* strctA = create<ast::Struct>(a_members, ast::StructDecorationList{});
ast::type::Struct stA(mod->RegisterSymbol("A"), "A", strctA); ast::type::Struct stA(mod->RegisterSymbol("A"), "A", strctA);

View File

@ -42,21 +42,13 @@ TEST_F(ValidatorTypeTest, RuntimeArrayIsLast_Pass) {
// rt: array<f32>; // rt: array<f32>;
// }; // };
ast::StructMemberList members;
{
ast::StructMemberDecorationList deco;
members.push_back(create<ast::StructMember>(mod->RegisterSymbol("vf"), "vf",
ty.f32, deco));
}
{
ast::StructMemberDecorationList deco;
members.push_back(create<ast::StructMember>(
Source{Source::Location{12, 34}}, mod->RegisterSymbol("rt"), "rt",
ty.array<f32>(), deco));
}
ast::StructDecorationList decos; ast::StructDecorationList decos;
decos.push_back(create<ast::StructBlockDecoration>()); decos.push_back(create<ast::StructBlockDecoration>());
auto* st = create<ast::Struct>(members, decos); auto* st =
create<ast::Struct>(ast::StructMemberList{Member("vf", ty.f32),
Member("rt", ty.array<f32>())},
decos);
ast::type::Struct struct_type(mod->RegisterSymbol("Foo"), "Foo", st); ast::type::Struct struct_type(mod->RegisterSymbol("Foo"), "Foo", st);
mod->AddConstructedType(&struct_type); mod->AddConstructedType(&struct_type);
@ -69,26 +61,18 @@ TEST_F(ValidatorTypeTest, RuntimeArrayIsLastNoBlock_Fail) {
// rt: array<f32>; // rt: array<f32>;
// }; // };
ast::StructMemberList members;
{
ast::StructMemberDecorationList deco;
members.push_back(create<ast::StructMember>(mod->RegisterSymbol("vf"), "vf",
ty.f32, deco));
}
{
ast::StructMemberDecorationList deco;
members.push_back(create<ast::StructMember>(
Source{Source::Location{12, 34}}, mod->RegisterSymbol("rt"), "rt",
ty.array<f32>(), deco));
}
ast::StructDecorationList decos; ast::StructDecorationList decos;
auto* st = create<ast::Struct>(members, decos); auto* st =
create<ast::Struct>(ast::StructMemberList{Member("vf", ty.f32),
Member("rt", ty.array<f32>())},
decos);
ast::type::Struct struct_type(mod->RegisterSymbol("Foo"), "Foo", st); ast::type::Struct struct_type(mod->RegisterSymbol("Foo"), "Foo", st);
mod->AddConstructedType(&struct_type); mod->AddConstructedType(&struct_type);
EXPECT_FALSE(v()->ValidateConstructedTypes(mod->constructed_types())); EXPECT_FALSE(v()->ValidateConstructedTypes(mod->constructed_types()));
EXPECT_EQ(v()->error(), EXPECT_EQ(v()->error(),
"12:34 v-0031: a struct containing a runtime-sized array must be " "v-0031: a struct containing a runtime-sized array must be "
"in the 'storage' storage class: 'Foo'"); "in the 'storage' storage class: 'Foo'");
} }
@ -99,27 +83,19 @@ TEST_F(ValidatorTypeTest, RuntimeArrayIsNotLast_Fail) {
// vf: f32; // vf: f32;
// }; // };
ast::StructMemberList members;
{
ast::StructMemberDecorationList deco;
members.push_back(create<ast::StructMember>(
Source{Source::Location{12, 34}}, mod->RegisterSymbol("rt"), "rt",
ty.array<f32>(), deco));
}
{
ast::StructMemberDecorationList deco;
members.push_back(create<ast::StructMember>(mod->RegisterSymbol("vf"), "vf",
ty.f32, deco));
}
ast::StructDecorationList decos; ast::StructDecorationList decos;
decos.push_back(create<ast::StructBlockDecoration>()); decos.push_back(create<ast::StructBlockDecoration>());
auto* st = create<ast::Struct>(members, decos); auto* st =
create<ast::Struct>(ast::StructMemberList{Member("rt", ty.array<f32>()),
Member("vf", ty.f32)},
decos);
ast::type::Struct struct_type(mod->RegisterSymbol("Foo"), "Foo", st); ast::type::Struct struct_type(mod->RegisterSymbol("Foo"), "Foo", st);
mod->AddConstructedType(&struct_type); mod->AddConstructedType(&struct_type);
EXPECT_FALSE(v()->ValidateConstructedTypes(mod->constructed_types())); EXPECT_FALSE(v()->ValidateConstructedTypes(mod->constructed_types()));
EXPECT_EQ(v()->error(), EXPECT_EQ(v()->error(),
"12:34 v-0015: runtime arrays may only appear as the last member " "v-0015: runtime arrays may only appear as the last member "
"of a struct: 'rt'"); "of a struct: 'rt'");
} }
@ -134,27 +110,16 @@ TEST_F(ValidatorTypeTest, AliasRuntimeArrayIsNotLast_Fail) {
ast::type::Alias alias{mod->RegisterSymbol("RTArr"), "RTArr", ast::type::Alias alias{mod->RegisterSymbol("RTArr"), "RTArr",
ty.array<u32>()}; ty.array<u32>()};
ast::StructMemberList members;
{
ast::StructMemberDecorationList deco;
members.push_back(
create<ast::StructMember>(Source{Source::Location{12, 34}},
mod->RegisterSymbol("b"), "b", &alias, deco));
}
{
ast::StructMemberDecorationList deco;
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.u32, deco));
}
ast::StructDecorationList decos; ast::StructDecorationList decos;
decos.push_back(create<ast::StructBlockDecoration>()); decos.push_back(create<ast::StructBlockDecoration>());
auto* st = create<ast::Struct>(members, decos); auto* st = create<ast::Struct>(
ast::StructMemberList{Member("b", &alias), Member("a", ty.u32)}, decos);
ast::type::Struct struct_type(mod->RegisterSymbol("s"), "s", st); ast::type::Struct struct_type(mod->RegisterSymbol("s"), "s", st);
mod->AddConstructedType(&struct_type); mod->AddConstructedType(&struct_type);
EXPECT_FALSE(v()->ValidateConstructedTypes(mod->constructed_types())); EXPECT_FALSE(v()->ValidateConstructedTypes(mod->constructed_types()));
EXPECT_EQ(v()->error(), EXPECT_EQ(v()->error(),
"12:34 v-0015: runtime arrays may only appear as the last member " "v-0015: runtime arrays may only appear as the last member "
"of a struct: 'b'"); "of a struct: 'b'");
} }
@ -169,21 +134,11 @@ TEST_F(ValidatorTypeTest, AliasRuntimeArrayIsLast_Pass) {
ast::type::Alias alias{mod->RegisterSymbol("RTArr"), "RTArr", ast::type::Alias alias{mod->RegisterSymbol("RTArr"), "RTArr",
ty.array<u32>()}; ty.array<u32>()};
ast::StructMemberList members;
{
ast::StructMemberDecorationList deco;
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.u32, deco));
}
{
ast::StructMemberDecorationList deco;
members.push_back(
create<ast::StructMember>(Source{Source::Location{12, 34}},
mod->RegisterSymbol("b"), "b", &alias, deco));
}
ast::StructDecorationList decos; ast::StructDecorationList decos;
decos.push_back(create<ast::StructBlockDecoration>()); decos.push_back(create<ast::StructBlockDecoration>());
auto* st = create<ast::Struct>(members, decos); auto* st = create<ast::Struct>(
ast::StructMemberList{Member("a", ty.u32), Member("b", &alias)}, decos);
ast::type::Struct struct_type(mod->RegisterSymbol("s"), "s", st); ast::type::Struct struct_type(mod->RegisterSymbol("s"), "s", st);
mod->AddConstructedType(&struct_type); mod->AddConstructedType(&struct_type);
EXPECT_TRUE(v()->ValidateConstructedTypes(mod->constructed_types())); EXPECT_TRUE(v()->ValidateConstructedTypes(mod->constructed_types()));

View File

@ -16,8 +16,6 @@
#include "src/ast/struct_member.h" #include "src/ast/struct_member.h"
#include "src/ast/struct_member_decoration.h" #include "src/ast/struct_member_decoration.h"
#include "src/ast/struct_member_offset_decoration.h" #include "src/ast/struct_member_offset_decoration.h"
#include "src/ast/type/f32_type.h"
#include "src/ast/type/i32_type.h"
#include "src/ast/type/struct_type.h" #include "src/ast/type/struct_type.h"
#include "src/writer/hlsl/test_helper.h" #include "src/writer/hlsl/test_helper.h"
@ -46,15 +44,8 @@ TEST_F(HlslGeneratorImplTest_Alias, EmitAlias_NameCollision) {
TEST_F(HlslGeneratorImplTest_Alias, EmitAlias_Struct) { TEST_F(HlslGeneratorImplTest_Alias, EmitAlias_Struct) {
auto* str = create<ast::Struct>( auto* str = create<ast::Struct>(
ast::StructMemberList{Member("a", ty.f32),
ast::StructMemberList{ Member("b", ty.i32, {MemberOffset(4)})},
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.f32,
ast::StructMemberDecorationList{}),
create<ast::StructMember>(
mod->RegisterSymbol("b"), "b", ty.i32,
ast::StructMemberDecorationList{
create<ast::StructMemberOffsetDecoration>(4)}),
},
ast::StructDecorationList{}); ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("A"), "A", str); ast::type::Struct s(mod->RegisterSymbol("A"), "A", str);

View File

@ -260,12 +260,9 @@ void frag_main() {
TEST_F(HlslGeneratorImplTest_Function, TEST_F(HlslGeneratorImplTest_Function,
Emit_FunctionDecoration_EntryPoint_With_UniformStruct) { Emit_FunctionDecoration_EntryPoint_With_UniformStruct) {
ast::StructMemberList members; auto* str = create<ast::Struct>(
members.push_back(create<ast::StructMember>( ast::StructMemberList{Member("coord", ty.vec4<f32>())},
mod->RegisterSymbol("coord"), "coord", ty.vec4<f32>(), ast::StructDecorationList{});
ast::StructMemberDecorationList{}));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("Uniforms"), "Uniforms", str); ast::type::Struct s(mod->RegisterSymbol("Uniforms"), "Uniforms", str);
@ -316,18 +313,10 @@ void frag_main() {
TEST_F(HlslGeneratorImplTest_Function, TEST_F(HlslGeneratorImplTest_Function,
Emit_FunctionDecoration_EntryPoint_With_RW_StorageBuffer_Read) { Emit_FunctionDecoration_EntryPoint_With_RW_StorageBuffer_Read) {
ast::StructMemberList members; auto* str = create<ast::Struct>(
ast::StructMemberDecorationList a_deco; ast::StructMemberList{Member("a", ty.i32, {MemberOffset(0)}),
a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0)); Member("b", ty.f32, {MemberOffset(4)})},
members.push_back( ast::StructDecorationList{});
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.i32, a_deco));
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4));
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("b"), "b", ty.f32, b_deco));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str); ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s); ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s);
@ -372,18 +361,10 @@ void frag_main() {
TEST_F(HlslGeneratorImplTest_Function, TEST_F(HlslGeneratorImplTest_Function,
Emit_FunctionDecoration_EntryPoint_With_RO_StorageBuffer_Read) { Emit_FunctionDecoration_EntryPoint_With_RO_StorageBuffer_Read) {
ast::StructMemberList members; auto* str = create<ast::Struct>(
ast::StructMemberDecorationList a_deco; ast::StructMemberList{Member("a", ty.i32, {MemberOffset(0)}),
a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0)); Member("b", ty.f32, {MemberOffset(4)})},
members.push_back( ast::StructDecorationList{});
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.i32, a_deco));
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4));
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("b"), "b", ty.f32, b_deco));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str); ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
ast::type::AccessControl ac(ast::AccessControl::kReadOnly, &s); ast::type::AccessControl ac(ast::AccessControl::kReadOnly, &s);
@ -429,18 +410,10 @@ void frag_main() {
TEST_F(HlslGeneratorImplTest_Function, TEST_F(HlslGeneratorImplTest_Function,
Emit_FunctionDecoration_EntryPoint_With_StorageBuffer_Store) { Emit_FunctionDecoration_EntryPoint_With_StorageBuffer_Store) {
ast::StructMemberList members; auto* str = create<ast::Struct>(
ast::StructMemberDecorationList a_deco; ast::StructMemberList{Member("a", ty.i32, {MemberOffset(0)}),
a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0)); Member("b", ty.f32, {MemberOffset(4)})},
members.push_back( ast::StructDecorationList{});
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.i32, a_deco));
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4));
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("b"), "b", ty.f32, b_deco));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str); ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s); ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s);
@ -969,16 +942,9 @@ TEST_F(HlslGeneratorImplTest_Function,
// return; // return;
// } // }
ast::StructMemberList members; auto* str = create<ast::Struct>(
ast::StructMemberDecorationList a_deco; ast::StructMemberList{Member("d", ty.f32, {MemberOffset(0)})},
a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0)); ast::StructDecorationList{create<ast::StructBlockDecoration>()});
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("d"), "d", ty.f32, a_deco));
ast::StructDecorationList s_decos;
s_decos.push_back(create<ast::StructBlockDecoration>());
auto* str = create<ast::Struct>(members, s_decos);
ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str); ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s); ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s);

View File

@ -40,13 +40,9 @@ namespace {
using HlslGeneratorImplTest_MemberAccessor = TestHelper; using HlslGeneratorImplTest_MemberAccessor = TestHelper;
TEST_F(HlslGeneratorImplTest_MemberAccessor, EmitExpression_MemberAccessor) { TEST_F(HlslGeneratorImplTest_MemberAccessor, EmitExpression_MemberAccessor) {
ast::StructMemberList members; auto* strct = create<ast::Struct>(
ast::StructMemberDecorationList deco; ast::StructMemberList{Member("mem", ty.f32, {MemberOffset(0)})},
deco.push_back(create<ast::StructMemberOffsetDecoration>(0)); ast::StructDecorationList{});
members.push_back(create<ast::StructMember>(mod->RegisterSymbol("mem"), "mem",
ty.f32, deco));
auto* strct = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("Str"), "Str", strct); ast::type::Struct s(mod->RegisterSymbol("Str"), "Str", strct);
@ -74,18 +70,11 @@ TEST_F(HlslGeneratorImplTest_MemberAccessor,
// //
// -> asfloat(data.Load(4)); // -> asfloat(data.Load(4));
ast::StructMemberList members; auto* str = create<ast::Struct>(
ast::StructMemberDecorationList a_deco; ast::StructMemberList{Member("a", ty.i32, {MemberOffset(0)}),
a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0)); Member("b", ty.f32, {MemberOffset(4)})},
members.push_back( ast::StructDecorationList{});
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.i32, a_deco));
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4));
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("b"), "b", ty.f32, b_deco));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str); ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
auto* coord_var = Var("data", ast::StorageClass::kStorageBuffer, &s); auto* coord_var = Var("data", ast::StorageClass::kStorageBuffer, &s);
auto* expr = MemberAccessor("data", "b"); auto* expr = MemberAccessor("data", "b");
@ -112,18 +101,10 @@ TEST_F(HlslGeneratorImplTest_MemberAccessor,
// //
// -> asint(data.Load(0)); // -> asint(data.Load(0));
ast::StructMemberList members; auto* str = create<ast::Struct>(
ast::StructMemberDecorationList a_deco; ast::StructMemberList{Member("a", ty.i32, {MemberOffset(0)}),
a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0)); Member("b", ty.f32, {MemberOffset(4)})},
members.push_back( ast::StructDecorationList{});
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.i32, a_deco));
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4));
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("b"), "b", ty.f32, b_deco));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str); ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
auto* coord_var = Var("data", ast::StorageClass::kStorageBuffer, &s); auto* coord_var = Var("data", ast::StorageClass::kStorageBuffer, &s);
auto* expr = MemberAccessor("data", "a"); auto* expr = MemberAccessor("data", "a");
@ -153,16 +134,8 @@ TEST_F(HlslGeneratorImplTest_MemberAccessor,
// data.Store3(4 + 16, asuint(_tint_tmp[1])); // data.Store3(4 + 16, asuint(_tint_tmp[1]));
auto* str = create<ast::Struct>( auto* str = create<ast::Struct>(
ast::StructMemberList{ ast::StructMemberList{Member("z", ty.i32, {MemberOffset(0)}),
create<ast::StructMember>( Member("a", ty.mat2x3<f32>(), {MemberOffset(4)})},
mod->RegisterSymbol("z"), "z", ty.i32,
ast::StructMemberDecorationList{
create<ast::StructMemberOffsetDecoration>(0)}),
create<ast::StructMember>(
mod->RegisterSymbol("z"), "a", ty.mat2x3<f32>(),
ast::StructMemberDecorationList{
create<ast::StructMemberOffsetDecoration>(4)}),
},
ast::StructDecorationList{}); ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str); ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
@ -207,18 +180,10 @@ TEST_F(HlslGeneratorImplTest_MemberAccessor,
// data.Store3(4 + 0, asuint(_tint_tmp[0]); // data.Store3(4 + 0, asuint(_tint_tmp[0]);
// data.Store3(4 + 16, asuint(_tint_tmp[1])); // data.Store3(4 + 16, asuint(_tint_tmp[1]));
ast::StructMemberList members; auto* str = create<ast::Struct>(
ast::StructMemberDecorationList a_deco; ast::StructMemberList{Member("z", ty.i32, {MemberOffset(0)}),
a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0)); Member("a", ty.mat2x3<f32>(), {MemberOffset(4)})},
members.push_back( ast::StructDecorationList{});
create<ast::StructMember>(mod->RegisterSymbol("z"), "z", ty.i32, a_deco));
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4));
members.push_back(create<ast::StructMember>(mod->RegisterSymbol("a"), "a",
ty.mat2x3<f32>(), b_deco));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str); ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
@ -257,18 +222,10 @@ TEST_F(HlslGeneratorImplTest_MemberAccessor,
// -> asfloat(uint2x3(data.Load2(4 + 0), data.Load2(4 + 8), // -> asfloat(uint2x3(data.Load2(4 + 0), data.Load2(4 + 8),
// data.Load2(4 + 16))); // data.Load2(4 + 16)));
ast::StructMemberList members; auto* str = create<ast::Struct>(
ast::StructMemberDecorationList a_deco; ast::StructMemberList{Member("z", ty.i32, {MemberOffset(0)}),
a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0)); Member("a", ty.mat3x2<f32>(), {MemberOffset(4)})},
members.push_back( ast::StructDecorationList{});
create<ast::StructMember>(mod->RegisterSymbol("z"), "z", ty.i32, a_deco));
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4));
members.push_back(create<ast::StructMember>(mod->RegisterSymbol("a"), "a",
ty.mat3x2<f32>(), b_deco));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str); ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
@ -304,18 +261,13 @@ TEST_F(HlslGeneratorImplTest_MemberAccessor,
// //
// -> asfloat(uint3x2(data.Load3(4 + 0), data.Load3(4 + 16))); // -> asfloat(uint3x2(data.Load3(4 + 0), data.Load3(4 + 16)));
ast::StructMemberList members; auto* str = create<ast::Struct>(
ast::StructMemberDecorationList a_deco; ast::StructMemberList{
a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0)); Member("z", ty.i32, {MemberOffset(0)}),
members.push_back( Member("a", ty.mat2x3<f32>(), {MemberOffset(4)}),
create<ast::StructMember>(mod->RegisterSymbol("z"), "z", ty.i32, a_deco)); },
ast::StructDecorationList{});
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4));
members.push_back(create<ast::StructMember>(mod->RegisterSymbol("a"), "a",
ty.mat2x3<f32>(), b_deco));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str); ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
auto* coord_var = Var("data", ast::StorageClass::kStorageBuffer, &s); auto* coord_var = Var("data", ast::StorageClass::kStorageBuffer, &s);
auto* expr = MemberAccessor("data", "a"); auto* expr = MemberAccessor("data", "a");
@ -344,13 +296,10 @@ TEST_F(
// -> asfloat(uint3x3(data.Load3(0), data.Load3(16), // -> asfloat(uint3x3(data.Load3(0), data.Load3(16),
// data.Load3(32))); // data.Load3(32)));
ast::StructMemberList members; auto* str = create<ast::Struct>(
ast::StructMemberDecorationList deco; ast::StructMemberList{Member("a", ty.mat3x3<f32>(), {MemberOffset(0)})},
deco.push_back(create<ast::StructMemberOffsetDecoration>(0)); ast::StructDecorationList{});
members.push_back(create<ast::StructMember>(mod->RegisterSymbol("a"), "a",
ty.mat3x3<f32>(), deco));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str); ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
auto* coord_var = Var("data", ast::StorageClass::kStorageBuffer, &s); auto* coord_var = Var("data", ast::StorageClass::kStorageBuffer, &s);
auto* expr = MemberAccessor("data", "a"); auto* expr = MemberAccessor("data", "a");
@ -379,18 +328,11 @@ TEST_F(HlslGeneratorImplTest_MemberAccessor,
// //
// -> asfloat(data.Load((2 * 16) + (1 * 4) + 16))) // -> asfloat(data.Load((2 * 16) + (1 * 4) + 16)))
ast::StructMemberList members; auto* str = create<ast::Struct>(
ast::StructMemberDecorationList a_deco; ast::StructMemberList{Member("z", ty.i32, {MemberOffset(0)}),
a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0)); Member("a", ty.mat4x3<f32>(), {MemberOffset(16)})},
members.push_back( ast::StructDecorationList{});
create<ast::StructMember>(mod->RegisterSymbol("z"), "z", ty.i32, a_deco));
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(16));
members.push_back(create<ast::StructMember>(mod->RegisterSymbol("a"), "a",
ty.mat4x3<f32>(), b_deco));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str); ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
auto* coord_var = Var("data", ast::StorageClass::kStorageBuffer, &s); auto* coord_var = Var("data", ast::StorageClass::kStorageBuffer, &s);
auto* expr = IndexAccessor( auto* expr = IndexAccessor(
@ -421,13 +363,9 @@ TEST_F(HlslGeneratorImplTest_MemberAccessor,
create<ast::StrideDecoration>(4), create<ast::StrideDecoration>(4),
}); });
ast::StructMemberList members; auto* str = create<ast::Struct>(
ast::StructMemberDecorationList a_deco; ast::StructMemberList{Member("a", &ary, {MemberOffset(0)})},
a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0)); ast::StructDecorationList{});
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", &ary, a_deco));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str); ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
auto* coord_var = Var("data", ast::StorageClass::kStorageBuffer, &s); auto* coord_var = Var("data", ast::StorageClass::kStorageBuffer, &s);
auto* expr = IndexAccessor(MemberAccessor("data", "a"), Expr(2)); auto* expr = IndexAccessor(MemberAccessor("data", "a"), Expr(2));
@ -457,13 +395,9 @@ TEST_F(HlslGeneratorImplTest_MemberAccessor,
create<ast::StrideDecoration>(4), create<ast::StrideDecoration>(4),
}); });
ast::StructMemberList members; auto* str = create<ast::Struct>(
ast::StructMemberDecorationList a_deco; ast::StructMemberList{Member("a", &ary, {MemberOffset(0)})},
a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0)); ast::StructDecorationList{});
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", &ary, a_deco));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str); ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
auto* coord_var = Var("data", ast::StorageClass::kStorageBuffer, &s); auto* coord_var = Var("data", ast::StorageClass::kStorageBuffer, &s);
auto* expr = IndexAccessor(MemberAccessor("data", "a"), auto* expr = IndexAccessor(MemberAccessor("data", "a"),
@ -491,18 +425,11 @@ TEST_F(HlslGeneratorImplTest_MemberAccessor,
// //
// -> data.Store(0, asuint(2.0f)); // -> data.Store(0, asuint(2.0f));
ast::StructMemberList members; auto* str = create<ast::Struct>(
ast::StructMemberDecorationList a_deco; ast::StructMemberList{Member("a", ty.i32, {MemberOffset(0)}),
a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0)); Member("b", ty.f32, {MemberOffset(4)})},
members.push_back( ast::StructDecorationList{});
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.i32, a_deco));
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4));
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("b"), "b", ty.f32, b_deco));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str); ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
auto* coord_var = Var("data", ast::StorageClass::kStorageBuffer, &s); auto* coord_var = Var("data", ast::StorageClass::kStorageBuffer, &s);
@ -537,13 +464,9 @@ TEST_F(HlslGeneratorImplTest_MemberAccessor,
create<ast::StrideDecoration>(4), create<ast::StrideDecoration>(4),
}); });
ast::StructMemberList members; auto* str = create<ast::Struct>(
ast::StructMemberDecorationList a_deco; ast::StructMemberList{Member("a", &ary, {MemberOffset(0)})},
a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0)); ast::StructDecorationList{});
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", &ary, a_deco));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str); ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
@ -576,18 +499,11 @@ TEST_F(HlslGeneratorImplTest_MemberAccessor,
// //
// -> data.Store(0, asuint(2)); // -> data.Store(0, asuint(2));
ast::StructMemberList members; auto* str = create<ast::Struct>(
ast::StructMemberDecorationList a_deco; ast::StructMemberList{Member("a", ty.i32, {MemberOffset(0)}),
a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0)); Member("b", ty.f32, {MemberOffset(4)})},
members.push_back( ast::StructDecorationList{});
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.i32, a_deco));
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4));
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("b"), "b", ty.f32, b_deco));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str); ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
auto* coord_var = Var("data", ast::StorageClass::kStorageBuffer, &s); auto* coord_var = Var("data", ast::StorageClass::kStorageBuffer, &s);
@ -618,18 +534,11 @@ TEST_F(HlslGeneratorImplTest_MemberAccessor,
// //
// -> asfloat(data.Load(16)); // -> asfloat(data.Load(16));
ast::StructMemberList members; auto* str = create<ast::Struct>(
ast::StructMemberDecorationList a_deco; ast::StructMemberList{Member("a", ty.vec3<i32>(), {MemberOffset(0)}),
a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0)); Member("b", ty.vec3<f32>(), {MemberOffset(16)})},
members.push_back(create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ast::StructDecorationList{});
ty.vec3<i32>(), a_deco));
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(16));
members.push_back(create<ast::StructMember>(mod->RegisterSymbol("b"), "b",
ty.vec3<f32>(), b_deco));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str); ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
auto* coord_var = Var("data", ast::StorageClass::kStorageBuffer, &s); auto* coord_var = Var("data", ast::StorageClass::kStorageBuffer, &s);
@ -657,18 +566,10 @@ TEST_F(HlslGeneratorImplTest_MemberAccessor,
// //
// -> data.Store(16, asuint(float3(2.3f, 1.2f, 0.2f))); // -> data.Store(16, asuint(float3(2.3f, 1.2f, 0.2f)));
ast::StructMemberList members; auto* str = create<ast::Struct>(
ast::StructMemberDecorationList a_deco; ast::StructMemberList{Member("a", ty.vec3<i32>(), {MemberOffset(0)}),
a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0)); Member("b", ty.vec3<f32>(), {MemberOffset(16)})},
members.push_back(create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ast::StructDecorationList{});
ty.vec3<i32>(), a_deco));
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(16));
members.push_back(create<ast::StructMember>(mod->RegisterSymbol("b"), "b",
ty.vec3<f32>(), b_deco));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str); ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
@ -709,14 +610,8 @@ TEST_F(HlslGeneratorImplTest_MemberAccessor,
auto* data_str = create<ast::Struct>( auto* data_str = create<ast::Struct>(
ast::StructMemberList{ ast::StructMemberList{
create<ast::StructMember>( Member("a", ty.vec3<i32>(), {MemberOffset(0)}),
mod->RegisterSymbol("a"), "a", ty.vec3<i32>(), Member("b", ty.vec3<f32>(), {MemberOffset(16)}),
ast::StructMemberDecorationList{
create<ast::StructMemberOffsetDecoration>(0)}),
create<ast::StructMember>(
mod->RegisterSymbol("b"), "b", ty.vec3<f32>(),
ast::StructMemberDecorationList{
create<ast::StructMemberOffsetDecoration>(16)}),
}, },
ast::StructDecorationList{}); ast::StructDecorationList{});
@ -728,12 +623,7 @@ TEST_F(HlslGeneratorImplTest_MemberAccessor,
}); });
auto* pre_str = create<ast::Struct>( auto* pre_str = create<ast::Struct>(
ast::StructMemberList{ ast::StructMemberList{Member("c", &ary, {MemberOffset(0)})},
create<ast::StructMember>(
mod->RegisterSymbol("c"), "c", &ary,
ast::StructMemberDecorationList{
create<ast::StructMemberOffsetDecoration>(0)}),
},
ast::StructDecorationList{}); ast::StructDecorationList{});
ast::type::Struct pre_struct(mod->RegisterSymbol("Pre"), "Pre", pre_str); ast::type::Struct pre_struct(mod->RegisterSymbol("Pre"), "Pre", pre_str);
@ -769,19 +659,10 @@ TEST_F(HlslGeneratorImplTest_MemberAccessor,
// //
// -> asfloat(data.Load3(16 + (2 * 32))).xy // -> asfloat(data.Load3(16 + (2 * 32))).xy
ast::StructMemberList members;
ast::StructMemberDecorationList deco;
auto* data_str = create<ast::Struct>( auto* data_str = create<ast::Struct>(
ast::StructMemberList{ ast::StructMemberList{
create<ast::StructMember>( Member("a", ty.vec3<i32>(), {MemberOffset(0)}),
mod->RegisterSymbol("a"), "a", ty.vec3<i32>(), Member("b", ty.vec3<f32>(), {MemberOffset(16)}),
ast::StructMemberDecorationList{
create<ast::StructMemberOffsetDecoration>(0)}),
create<ast::StructMember>(
mod->RegisterSymbol("b"), "b", ty.vec3<f32>(),
ast::StructMemberDecorationList{
create<ast::StructMemberOffsetDecoration>(16)}),
}, },
ast::StructDecorationList{}); ast::StructDecorationList{});
@ -791,10 +672,7 @@ TEST_F(HlslGeneratorImplTest_MemberAccessor,
&data, 4, ast::ArrayDecorationList{create<ast::StrideDecoration>(32)}); &data, 4, ast::ArrayDecorationList{create<ast::StrideDecoration>(32)});
auto* pre_str = create<ast::Struct>( auto* pre_str = create<ast::Struct>(
ast::StructMemberList{create<ast::StructMember>( ast::StructMemberList{Member("c", &ary, {MemberOffset(0)})},
mod->RegisterSymbol("c"), "c", &ary,
ast::StructMemberDecorationList{
create<ast::StructMemberOffsetDecoration>(0)})},
ast::StructDecorationList{}); ast::StructDecorationList{});
ast::type::Struct pre_struct(mod->RegisterSymbol("Pre"), "Pre", pre_str); ast::type::Struct pre_struct(mod->RegisterSymbol("Pre"), "Pre", pre_str);
@ -834,14 +712,8 @@ TEST_F(
auto* data_str = create<ast::Struct>( auto* data_str = create<ast::Struct>(
ast::StructMemberList{ ast::StructMemberList{
create<ast::StructMember>( Member("a", ty.vec3<i32>(), {MemberOffset(0)}),
mod->RegisterSymbol("a"), "a", ty.vec3<i32>(), Member("b", ty.vec3<f32>(), {MemberOffset(16)}),
ast::StructMemberDecorationList{
create<ast::StructMemberOffsetDecoration>(0)}),
create<ast::StructMember>(
mod->RegisterSymbol("b"), "b", ty.vec3<f32>(),
ast::StructMemberDecorationList{
create<ast::StructMemberOffsetDecoration>(16)}),
}, },
ast::StructDecorationList{}); ast::StructDecorationList{});
@ -853,10 +725,7 @@ TEST_F(
}); });
auto* pre_str = create<ast::Struct>( auto* pre_str = create<ast::Struct>(
ast::StructMemberList{create<ast::StructMember>( ast::StructMemberList{Member("c", &ary, {MemberOffset(0)})},
mod->RegisterSymbol("c"), "c", &ary,
ast::StructMemberDecorationList{
create<ast::StructMemberOffsetDecoration>(0)})},
ast::StructDecorationList{}); ast::StructDecorationList{});
ast::type::Struct pre_struct(mod->RegisterSymbol("Pre"), "Pre", pre_str); ast::type::Struct pre_struct(mod->RegisterSymbol("Pre"), "Pre", pre_str);
@ -895,14 +764,8 @@ TEST_F(HlslGeneratorImplTest_MemberAccessor,
auto* data_str = create<ast::Struct>( auto* data_str = create<ast::Struct>(
ast::StructMemberList{ ast::StructMemberList{
create<ast::StructMember>( Member("a", ty.vec3<i32>(), {MemberOffset(0)}),
mod->RegisterSymbol("a"), "a", ty.vec3<i32>(), Member("b", ty.vec3<f32>(), {MemberOffset(16)}),
ast::StructMemberDecorationList{
create<ast::StructMemberOffsetDecoration>(0)}),
create<ast::StructMember>(
mod->RegisterSymbol("b"), "b", ty.vec3<f32>(),
ast::StructMemberDecorationList{
create<ast::StructMemberOffsetDecoration>(16)}),
}, },
ast::StructDecorationList{}); ast::StructDecorationList{});
@ -914,10 +777,7 @@ TEST_F(HlslGeneratorImplTest_MemberAccessor,
}); });
auto* pre_str = create<ast::Struct>( auto* pre_str = create<ast::Struct>(
ast::StructMemberList{create<ast::StructMember>( ast::StructMemberList{Member("c", &ary, {MemberOffset(0)})},
mod->RegisterSymbol("c"), "c", &ary,
ast::StructMemberDecorationList{
create<ast::StructMemberOffsetDecoration>(0)})},
ast::StructDecorationList{}); ast::StructDecorationList{});
ast::type::Struct pre_struct(mod->RegisterSymbol("Pre"), "Pre", pre_str); ast::type::Struct pre_struct(mod->RegisterSymbol("Pre"), "Pre", pre_str);
@ -956,14 +816,8 @@ TEST_F(HlslGeneratorImplTest_MemberAccessor,
auto* data_str = create<ast::Struct>( auto* data_str = create<ast::Struct>(
ast::StructMemberList{ ast::StructMemberList{
create<ast::StructMember>( Member("a", ty.vec3<i32>(), {MemberOffset(0)}),
mod->RegisterSymbol("a"), "a", ty.vec3<i32>(), Member("b", ty.vec3<f32>(), {MemberOffset(16)}),
ast::StructMemberDecorationList{
create<ast::StructMemberOffsetDecoration>(0)}),
create<ast::StructMember>(
mod->RegisterSymbol("b"), "b", ty.vec3<f32>(),
ast::StructMemberDecorationList{
create<ast::StructMemberOffsetDecoration>(16)}),
}, },
ast::StructDecorationList{}); ast::StructDecorationList{});
@ -975,10 +829,7 @@ TEST_F(HlslGeneratorImplTest_MemberAccessor,
}); });
auto* pre_str = create<ast::Struct>( auto* pre_str = create<ast::Struct>(
ast::StructMemberList{create<ast::StructMember>( ast::StructMemberList{Member("c", &ary, {MemberOffset(0)})},
mod->RegisterSymbol("c"), "c", &ary,
ast::StructMemberDecorationList{
create<ast::StructMemberOffsetDecoration>(0)})},
ast::StructDecorationList{}); ast::StructDecorationList{});
ast::type::Struct pre_struct(mod->RegisterSymbol("Pre"), "Pre", pre_str); ast::type::Struct pre_struct(mod->RegisterSymbol("Pre"), "Pre", pre_str);
@ -1021,14 +872,8 @@ TEST_F(HlslGeneratorImplTest_MemberAccessor,
auto* data_str = create<ast::Struct>( auto* data_str = create<ast::Struct>(
ast::StructMemberList{ ast::StructMemberList{
create<ast::StructMember>( Member("a", ty.vec3<i32>(), {MemberOffset(0)}),
mod->RegisterSymbol("a"), "a", ty.vec3<i32>(), Member("b", ty.vec3<f32>(), {MemberOffset(16)}),
ast::StructMemberDecorationList{
create<ast::StructMemberOffsetDecoration>(0)}),
create<ast::StructMember>(
mod->RegisterSymbol("b"), "b", ty.vec3<f32>(),
ast::StructMemberDecorationList{
create<ast::StructMemberOffsetDecoration>(16)}),
}, },
ast::StructDecorationList{}); ast::StructDecorationList{});
@ -1040,10 +885,7 @@ TEST_F(HlslGeneratorImplTest_MemberAccessor,
}); });
auto* pre_str = create<ast::Struct>( auto* pre_str = create<ast::Struct>(
ast::StructMemberList{create<ast::StructMember>( ast::StructMemberList{Member("c", &ary, {MemberOffset(0)})},
mod->RegisterSymbol("c"), "c", &ary,
ast::StructMemberDecorationList{
create<ast::StructMemberOffsetDecoration>(0)})},
ast::StructDecorationList{}); ast::StructDecorationList{});
ast::type::Struct pre_struct(mod->RegisterSymbol("Pre"), "Pre", pre_str); ast::type::Struct pre_struct(mod->RegisterSymbol("Pre"), "Pre", pre_str);

View File

@ -132,17 +132,10 @@ TEST_F(HlslGeneratorImplTest_Type, DISABLED_EmitType_Pointer) {
} }
TEST_F(HlslGeneratorImplTest_Type, EmitType_StructDecl) { TEST_F(HlslGeneratorImplTest_Type, EmitType_StructDecl) {
ast::StructMemberList members; auto* str = create<ast::Struct>(
members.push_back( ast::StructMemberList{Member("a", ty.i32),
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.i32, Member("b", ty.f32, {MemberOffset(4)})},
ast::StructMemberDecorationList{})); ast::StructDecorationList{});
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4));
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("b"), "b", ty.f32, b_deco));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("S"), "S", str); ast::type::Struct s(mod->RegisterSymbol("S"), "S", str);
@ -155,17 +148,10 @@ TEST_F(HlslGeneratorImplTest_Type, EmitType_StructDecl) {
} }
TEST_F(HlslGeneratorImplTest_Type, EmitType_Struct) { TEST_F(HlslGeneratorImplTest_Type, EmitType_Struct) {
ast::StructMemberList members; auto* str = create<ast::Struct>(
members.push_back( ast::StructMemberList{Member("a", ty.i32),
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.i32, Member("b", ty.f32, {MemberOffset(4)})},
ast::StructMemberDecorationList{})); ast::StructDecorationList{});
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4));
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("b"), "b", ty.f32, b_deco));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("S"), "S", str); ast::type::Struct s(mod->RegisterSymbol("S"), "S", str);
@ -174,22 +160,11 @@ TEST_F(HlslGeneratorImplTest_Type, EmitType_Struct) {
} }
TEST_F(HlslGeneratorImplTest_Type, DISABLED_EmitType_Struct_InjectPadding) { TEST_F(HlslGeneratorImplTest_Type, DISABLED_EmitType_Struct_InjectPadding) {
ast::StructMemberDecorationList decos; auto* str = create<ast::Struct>(
decos.push_back(create<ast::StructMemberOffsetDecoration>(4)); ast::StructMemberList{Member("a", ty.i32, {MemberOffset(4)}),
Member("b", ty.f32, {MemberOffset(32)}),
ast::StructMemberList members; Member("c", ty.f32, {MemberOffset(128)})},
members.push_back( ast::StructDecorationList{});
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.i32, decos));
decos.push_back(create<ast::StructMemberOffsetDecoration>(32));
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("b"), "b", ty.f32, decos));
decos.push_back(create<ast::StructMemberOffsetDecoration>(128));
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("c"), "c", ty.f32, decos));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("S"), "S", str); ast::type::Struct s(mod->RegisterSymbol("S"), "S", str);
@ -205,16 +180,9 @@ TEST_F(HlslGeneratorImplTest_Type, DISABLED_EmitType_Struct_InjectPadding) {
} }
TEST_F(HlslGeneratorImplTest_Type, EmitType_Struct_NameCollision) { TEST_F(HlslGeneratorImplTest_Type, EmitType_Struct_NameCollision) {
ast::StructMemberList members; auto* str = create<ast::Struct>(
members.push_back( ast::StructMemberList{Member("double", ty.i32), Member("float", ty.f32)},
create<ast::StructMember>(mod->RegisterSymbol("double"), "double", ty.i32, ast::StructDecorationList{});
ast::StructMemberDecorationList{}));
ast::StructMemberDecorationList b_deco;
members.push_back(create<ast::StructMember>(mod->RegisterSymbol("float"),
"float", ty.f32, b_deco));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("S"), "S", str); ast::type::Struct s(mod->RegisterSymbol("S"), "S", str);
@ -228,20 +196,13 @@ TEST_F(HlslGeneratorImplTest_Type, EmitType_Struct_NameCollision) {
// TODO(dsinclair): How to translate [[block]] // TODO(dsinclair): How to translate [[block]]
TEST_F(HlslGeneratorImplTest_Type, DISABLED_EmitType_Struct_WithDecoration) { TEST_F(HlslGeneratorImplTest_Type, DISABLED_EmitType_Struct_WithDecoration) {
ast::StructMemberList members;
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.i32,
ast::StructMemberDecorationList{}));
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4));
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("b"), "b", ty.f32, b_deco));
ast::StructDecorationList decos; ast::StructDecorationList decos;
decos.push_back(create<ast::StructBlockDecoration>()); decos.push_back(create<ast::StructBlockDecoration>());
auto* str = create<ast::Struct>(members, decos); auto* str = create<ast::Struct>(
ast::StructMemberList{Member("a", ty.i32),
Member("b", ty.f32, {MemberOffset(4)})},
decos);
ast::type::Struct s(mod->RegisterSymbol("S"), "S", str); ast::type::Struct s(mod->RegisterSymbol("S"), "S", str);

View File

@ -16,10 +16,6 @@
#include "src/ast/module.h" #include "src/ast/module.h"
#include "src/ast/struct.h" #include "src/ast/struct.h"
#include "src/ast/struct_member.h" #include "src/ast/struct_member.h"
#include "src/ast/struct_member_decoration.h"
#include "src/ast/struct_member_offset_decoration.h"
#include "src/ast/type/f32_type.h"
#include "src/ast/type/i32_type.h"
#include "src/ast/type/struct_type.h" #include "src/ast/type/struct_type.h"
#include "src/writer/msl/generator_impl.h" #include "src/writer/msl/generator_impl.h"
#include "src/writer/msl/test_helper.h" #include "src/writer/msl/test_helper.h"
@ -32,8 +28,7 @@ namespace {
using MslGeneratorImplTest = TestHelper; using MslGeneratorImplTest = TestHelper;
TEST_F(MslGeneratorImplTest, EmitConstructedType_F32) { TEST_F(MslGeneratorImplTest, EmitConstructedType_F32) {
ast::type::F32 f32; ast::type::Alias alias(mod->RegisterSymbol("a"), "a", ty.f32);
ast::type::Alias alias(mod.RegisterSymbol("a"), "a", &f32);
ASSERT_TRUE(gen.EmitConstructedType(&alias)) << gen.error(); ASSERT_TRUE(gen.EmitConstructedType(&alias)) << gen.error();
EXPECT_EQ(gen.result(), R"(typedef float a; EXPECT_EQ(gen.result(), R"(typedef float a;
@ -41,8 +36,7 @@ TEST_F(MslGeneratorImplTest, EmitConstructedType_F32) {
} }
TEST_F(MslGeneratorImplTest, EmitConstructedType_NameCollision) { TEST_F(MslGeneratorImplTest, EmitConstructedType_NameCollision) {
ast::type::F32 f32; ast::type::Alias alias(mod->RegisterSymbol("float"), "float", ty.f32);
ast::type::Alias alias(mod.RegisterSymbol("float"), "float", &f32);
ASSERT_TRUE(gen.EmitConstructedType(&alias)) << gen.error(); ASSERT_TRUE(gen.EmitConstructedType(&alias)) << gen.error();
EXPECT_EQ(gen.result(), R"(typedef float float_tint_0; EXPECT_EQ(gen.result(), R"(typedef float float_tint_0;
@ -50,23 +44,12 @@ TEST_F(MslGeneratorImplTest, EmitConstructedType_NameCollision) {
} }
TEST_F(MslGeneratorImplTest, EmitConstructedType_Struct) { TEST_F(MslGeneratorImplTest, EmitConstructedType_Struct) {
ast::type::I32 i32; auto* str = create<ast::Struct>(
ast::type::F32 f32; ast::StructMemberList{Member("a", ty.f32),
Member("b", ty.i32, {MemberOffset(4)})},
ast::StructDecorationList{});
ast::StructMemberList members; ast::type::Struct s(mod->RegisterSymbol("a"), "a", str);
members.push_back(
create<ast::StructMember>(Source{}, mod.RegisterSymbol("a"), "a", &f32,
ast::StructMemberDecorationList{}));
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
members.push_back(create<ast::StructMember>(Source{}, mod.RegisterSymbol("b"),
"b", &i32, b_deco));
auto* str =
create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
ast::type::Struct s(mod.RegisterSymbol("a"), "a", str);
ASSERT_TRUE(gen.EmitConstructedType(&s)) << gen.error(); ASSERT_TRUE(gen.EmitConstructedType(&s)) << gen.error();
EXPECT_EQ(gen.result(), R"(struct a { EXPECT_EQ(gen.result(), R"(struct a {
@ -77,24 +60,13 @@ TEST_F(MslGeneratorImplTest, EmitConstructedType_Struct) {
} }
TEST_F(MslGeneratorImplTest, EmitConstructedType_AliasStructIdent) { TEST_F(MslGeneratorImplTest, EmitConstructedType_AliasStructIdent) {
ast::type::I32 i32; auto* str = create<ast::Struct>(
ast::type::F32 f32; ast::StructMemberList{Member("a", ty.f32),
Member("b", ty.i32, {MemberOffset(4)})},
ast::StructDecorationList{});
ast::StructMemberList members; ast::type::Struct s(mod->RegisterSymbol("b"), "b", str);
members.push_back( ast::type::Alias alias(mod->RegisterSymbol("a"), "a", &s);
create<ast::StructMember>(Source{}, mod.RegisterSymbol("a"), "a", &f32,
ast::StructMemberDecorationList{}));
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
members.push_back(create<ast::StructMember>(Source{}, mod.RegisterSymbol("b"),
"b", &i32, b_deco));
auto* str =
create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
ast::type::Struct s(mod.RegisterSymbol("b"), "b", str);
ast::type::Alias alias(mod.RegisterSymbol("a"), "a", &s);
ASSERT_TRUE(gen.EmitConstructedType(&alias)) << gen.error(); ASSERT_TRUE(gen.EmitConstructedType(&alias)) << gen.error();
EXPECT_EQ(gen.result(), R"(typedef b a; EXPECT_EQ(gen.result(), R"(typedef b a;

View File

@ -36,7 +36,7 @@ TEST_F(MslGeneratorImplTest, EmitExpression_ArrayAccessor) {
auto* lit = create<ast::SintLiteral>(Source{}, &i32, 5); auto* lit = create<ast::SintLiteral>(Source{}, &i32, 5);
auto* idx = create<ast::ScalarConstructorExpression>(Source{}, lit); auto* idx = create<ast::ScalarConstructorExpression>(Source{}, lit);
auto* ary = create<ast::IdentifierExpression>( auto* ary = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("ary"), "ary"); Source{}, mod->RegisterSymbol("ary"), "ary");
ast::ArrayAccessorExpression expr(Source{}, ary, idx); ast::ArrayAccessorExpression expr(Source{}, ary, idx);
@ -46,9 +46,9 @@ TEST_F(MslGeneratorImplTest, EmitExpression_ArrayAccessor) {
TEST_F(MslGeneratorImplTest, EmitArrayAccessor) { TEST_F(MslGeneratorImplTest, EmitArrayAccessor) {
auto* ary = create<ast::IdentifierExpression>( auto* ary = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("ary"), "ary"); Source{}, mod->RegisterSymbol("ary"), "ary");
auto* idx = create<ast::IdentifierExpression>( auto* idx = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("idx"), "idx"); Source{}, mod->RegisterSymbol("idx"), "idx");
ast::ArrayAccessorExpression expr(Source{}, ary, idx); ast::ArrayAccessorExpression expr(Source{}, ary, idx);

View File

@ -31,9 +31,9 @@ using MslGeneratorImplTest = TestHelper;
TEST_F(MslGeneratorImplTest, Emit_Assign) { TEST_F(MslGeneratorImplTest, Emit_Assign) {
auto* lhs = create<ast::IdentifierExpression>( auto* lhs = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("lhs"), "lhs"); Source{}, mod->RegisterSymbol("lhs"), "lhs");
auto* rhs = create<ast::IdentifierExpression>( auto* rhs = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("rhs"), "rhs"); Source{}, mod->RegisterSymbol("rhs"), "rhs");
ast::AssignmentStatement assign(Source{}, lhs, rhs); ast::AssignmentStatement assign(Source{}, lhs, rhs);
gen.increment_indent(); gen.increment_indent();

View File

@ -39,9 +39,9 @@ TEST_P(MslBinaryTest, Emit) {
auto params = GetParam(); auto params = GetParam();
auto* left = create<ast::IdentifierExpression>( auto* left = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("left"), "left"); Source{}, mod->RegisterSymbol("left"), "left");
auto* right = create<ast::IdentifierExpression>( auto* right = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("right"), "right"); Source{}, mod->RegisterSymbol("right"), "right");
ast::BinaryExpression expr(Source{}, params.op, left, right); ast::BinaryExpression expr(Source{}, params.op, left, right);

View File

@ -32,7 +32,7 @@ using MslGeneratorImplTest = TestHelper;
TEST_F(MslGeneratorImplTest, EmitExpression_Bitcast) { TEST_F(MslGeneratorImplTest, EmitExpression_Bitcast) {
ast::type::F32 f32; ast::type::F32 f32;
auto* id = create<ast::IdentifierExpression>(Source{}, auto* id = create<ast::IdentifierExpression>(Source{},
mod.RegisterSymbol("id"), "id"); mod->RegisterSymbol("id"), "id");
ast::BitcastExpression bitcast(Source{}, &f32, id); ast::BitcastExpression bitcast(Source{}, &f32, id);
ASSERT_TRUE(gen.EmitExpression(&bitcast)) << gen.error(); ASSERT_TRUE(gen.EmitExpression(&bitcast)) << gen.error();

View File

@ -35,14 +35,14 @@ TEST_F(MslGeneratorImplTest, EmitExpression_Call_WithoutParams) {
ast::type::Void void_type; ast::type::Void void_type;
auto* id = create<ast::IdentifierExpression>( auto* id = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("my_func"), "my_func"); Source{}, mod->RegisterSymbol("my_func"), "my_func");
ast::CallExpression call(Source{}, id, {}); ast::CallExpression call(Source{}, id, {});
auto* func = create<ast::Function>( auto* func = create<ast::Function>(
Source{}, mod.RegisterSymbol("my_func"), "my_func", ast::VariableList{}, Source{}, mod->RegisterSymbol("my_func"), "my_func", ast::VariableList{},
&void_type, create<ast::BlockStatement>(Source{}, ast::StatementList{}), &void_type, create<ast::BlockStatement>(Source{}, ast::StatementList{}),
ast::FunctionDecorationList{}); ast::FunctionDecorationList{});
mod.AddFunction(func); mod->AddFunction(func);
ASSERT_TRUE(gen.EmitExpression(&call)) << gen.error(); ASSERT_TRUE(gen.EmitExpression(&call)) << gen.error();
EXPECT_EQ(gen.result(), "my_func()"); EXPECT_EQ(gen.result(), "my_func()");
@ -52,19 +52,19 @@ TEST_F(MslGeneratorImplTest, EmitExpression_Call_WithParams) {
ast::type::Void void_type; ast::type::Void void_type;
auto* id = create<ast::IdentifierExpression>( auto* id = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("my_func"), "my_func"); Source{}, mod->RegisterSymbol("my_func"), "my_func");
ast::ExpressionList params; ast::ExpressionList params;
params.push_back(create<ast::IdentifierExpression>( params.push_back(create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("param1"), "param1")); Source{}, mod->RegisterSymbol("param1"), "param1"));
params.push_back(create<ast::IdentifierExpression>( params.push_back(create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("param2"), "param2")); Source{}, mod->RegisterSymbol("param2"), "param2"));
ast::CallExpression call(Source{}, id, params); ast::CallExpression call(Source{}, id, params);
auto* func = create<ast::Function>( auto* func = create<ast::Function>(
Source{}, mod.RegisterSymbol("my_func"), "my_func", ast::VariableList{}, Source{}, mod->RegisterSymbol("my_func"), "my_func", ast::VariableList{},
&void_type, create<ast::BlockStatement>(Source{}, ast::StatementList{}), &void_type, create<ast::BlockStatement>(Source{}, ast::StatementList{}),
ast::FunctionDecorationList{}); ast::FunctionDecorationList{});
mod.AddFunction(func); mod->AddFunction(func);
ASSERT_TRUE(gen.EmitExpression(&call)) << gen.error(); ASSERT_TRUE(gen.EmitExpression(&call)) << gen.error();
EXPECT_EQ(gen.result(), "my_func(param1, param2)"); EXPECT_EQ(gen.result(), "my_func(param1, param2)");
@ -74,20 +74,20 @@ TEST_F(MslGeneratorImplTest, EmitStatement_Call) {
ast::type::Void void_type; ast::type::Void void_type;
auto* id = create<ast::IdentifierExpression>( auto* id = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("my_func"), "my_func"); Source{}, mod->RegisterSymbol("my_func"), "my_func");
ast::ExpressionList params; ast::ExpressionList params;
params.push_back(create<ast::IdentifierExpression>( params.push_back(create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("param1"), "param1")); Source{}, mod->RegisterSymbol("param1"), "param1"));
params.push_back(create<ast::IdentifierExpression>( params.push_back(create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("param2"), "param2")); Source{}, mod->RegisterSymbol("param2"), "param2"));
ast::CallStatement call(Source{}, ast::CallStatement call(Source{},
create<ast::CallExpression>(Source{}, id, params)); create<ast::CallExpression>(Source{}, id, params));
auto* func = create<ast::Function>( auto* func = create<ast::Function>(
Source{}, mod.RegisterSymbol("my_func"), "my_func", ast::VariableList{}, Source{}, mod->RegisterSymbol("my_func"), "my_func", ast::VariableList{},
&void_type, create<ast::BlockStatement>(Source{}, ast::StatementList{}), &void_type, create<ast::BlockStatement>(Source{}, ast::StatementList{}),
ast::FunctionDecorationList{}); ast::FunctionDecorationList{});
mod.AddFunction(func); mod->AddFunction(func);
gen.increment_indent(); gen.increment_indent();
ASSERT_TRUE(gen.EmitStatement(&call)) << gen.error(); ASSERT_TRUE(gen.EmitStatement(&call)) << gen.error();

View File

@ -35,7 +35,7 @@ TEST_F(MslGeneratorImplTest, EmitExpression_Cast_Scalar) {
ast::ExpressionList params; ast::ExpressionList params;
params.push_back(create<ast::IdentifierExpression>( params.push_back(create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("id"), "id")); Source{}, mod->RegisterSymbol("id"), "id"));
ast::TypeConstructorExpression cast(Source{}, &f32, params); ast::TypeConstructorExpression cast(Source{}, &f32, params);
@ -49,7 +49,7 @@ TEST_F(MslGeneratorImplTest, EmitExpression_Cast_Vector) {
ast::ExpressionList params; ast::ExpressionList params;
params.push_back(create<ast::IdentifierExpression>( params.push_back(create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("id"), "id")); Source{}, mod->RegisterSymbol("id"), "id"));
ast::TypeConstructorExpression cast(Source{}, &vec3, params); ast::TypeConstructorExpression cast(Source{}, &vec3, params);

View File

@ -77,8 +77,8 @@ TEST_F(MslGeneratorImplTest, Emit_Function_EntryPointData_Vertex_Input) {
td.RegisterVariableForTesting(foo_var); td.RegisterVariableForTesting(foo_var);
td.RegisterVariableForTesting(bar_var); td.RegisterVariableForTesting(bar_var);
mod.AddGlobalVariable(foo_var); mod->AddGlobalVariable(foo_var);
mod.AddGlobalVariable(bar_var); mod->AddGlobalVariable(bar_var);
ast::VariableList params; ast::VariableList params;
auto* body = create<ast::BlockStatement>( auto* body = create<ast::BlockStatement>(
@ -86,23 +86,23 @@ TEST_F(MslGeneratorImplTest, Emit_Function_EntryPointData_Vertex_Input) {
create<ast::AssignmentStatement>( create<ast::AssignmentStatement>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("foo"), "foo"), Source{}, mod->RegisterSymbol("foo"), "foo"),
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("foo"), "foo")), Source{}, mod->RegisterSymbol("foo"), "foo")),
create<ast::AssignmentStatement>( create<ast::AssignmentStatement>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("bar"), "bar"), Source{}, mod->RegisterSymbol("bar"), "bar"),
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("bar"), "bar")), Source{}, mod->RegisterSymbol("bar"), "bar")),
}); });
auto* func = create<ast::Function>( auto* func = create<ast::Function>(
Source{}, mod.RegisterSymbol("vtx_main"), "vtx_main", params, &f32, body, Source{}, mod->RegisterSymbol("vtx_main"), "vtx_main", params, &f32, body,
ast::FunctionDecorationList{ ast::FunctionDecorationList{
create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex), create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
}); });
mod.AddFunction(func); mod->AddFunction(func);
ASSERT_TRUE(td.Determine()) << td.error(); ASSERT_TRUE(td.Determine()) << td.error();
@ -154,8 +154,8 @@ TEST_F(MslGeneratorImplTest, Emit_Function_EntryPointData_Vertex_Output) {
td.RegisterVariableForTesting(foo_var); td.RegisterVariableForTesting(foo_var);
td.RegisterVariableForTesting(bar_var); td.RegisterVariableForTesting(bar_var);
mod.AddGlobalVariable(foo_var); mod->AddGlobalVariable(foo_var);
mod.AddGlobalVariable(bar_var); mod->AddGlobalVariable(bar_var);
ast::VariableList params; ast::VariableList params;
auto* body = create<ast::BlockStatement>( auto* body = create<ast::BlockStatement>(
@ -163,23 +163,23 @@ TEST_F(MslGeneratorImplTest, Emit_Function_EntryPointData_Vertex_Output) {
create<ast::AssignmentStatement>( create<ast::AssignmentStatement>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("foo"), "foo"), Source{}, mod->RegisterSymbol("foo"), "foo"),
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("foo"), "foo")), Source{}, mod->RegisterSymbol("foo"), "foo")),
create<ast::AssignmentStatement>( create<ast::AssignmentStatement>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("bar"), "bar"), Source{}, mod->RegisterSymbol("bar"), "bar"),
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("bar"), "bar")), Source{}, mod->RegisterSymbol("bar"), "bar")),
}); });
auto* func = create<ast::Function>( auto* func = create<ast::Function>(
Source{}, mod.RegisterSymbol("vtx_main"), "vtx_main", params, &f32, body, Source{}, mod->RegisterSymbol("vtx_main"), "vtx_main", params, &f32, body,
ast::FunctionDecorationList{ ast::FunctionDecorationList{
create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex), create<ast::StageDecoration>(Source{}, ast::PipelineStage::kVertex),
}); });
mod.AddFunction(func); mod->AddFunction(func);
ASSERT_TRUE(td.Determine()) << td.error(); ASSERT_TRUE(td.Determine()) << td.error();
@ -231,8 +231,8 @@ TEST_F(MslGeneratorImplTest, Emit_Function_EntryPointData_Fragment_Input) {
td.RegisterVariableForTesting(foo_var); td.RegisterVariableForTesting(foo_var);
td.RegisterVariableForTesting(bar_var); td.RegisterVariableForTesting(bar_var);
mod.AddGlobalVariable(foo_var); mod->AddGlobalVariable(foo_var);
mod.AddGlobalVariable(bar_var); mod->AddGlobalVariable(bar_var);
ast::VariableList params; ast::VariableList params;
auto* body = create<ast::BlockStatement>( auto* body = create<ast::BlockStatement>(
@ -240,23 +240,23 @@ TEST_F(MslGeneratorImplTest, Emit_Function_EntryPointData_Fragment_Input) {
create<ast::AssignmentStatement>( create<ast::AssignmentStatement>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("foo"), "foo"), Source{}, mod->RegisterSymbol("foo"), "foo"),
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("foo"), "foo")), Source{}, mod->RegisterSymbol("foo"), "foo")),
create<ast::AssignmentStatement>( create<ast::AssignmentStatement>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("bar"), "bar"), Source{}, mod->RegisterSymbol("bar"), "bar"),
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("bar"), "bar")), Source{}, mod->RegisterSymbol("bar"), "bar")),
}); });
auto* func = create<ast::Function>( auto* func = create<ast::Function>(
Source{}, mod.RegisterSymbol("main"), "main", params, &f32, body, Source{}, mod->RegisterSymbol("main"), "main", params, &f32, body,
ast::FunctionDecorationList{ ast::FunctionDecorationList{
create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment), create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
}); });
mod.AddFunction(func); mod->AddFunction(func);
ASSERT_TRUE(td.Determine()) << td.error(); ASSERT_TRUE(td.Determine()) << td.error();
@ -308,8 +308,8 @@ TEST_F(MslGeneratorImplTest, Emit_Function_EntryPointData_Fragment_Output) {
td.RegisterVariableForTesting(foo_var); td.RegisterVariableForTesting(foo_var);
td.RegisterVariableForTesting(bar_var); td.RegisterVariableForTesting(bar_var);
mod.AddGlobalVariable(foo_var); mod->AddGlobalVariable(foo_var);
mod.AddGlobalVariable(bar_var); mod->AddGlobalVariable(bar_var);
ast::VariableList params; ast::VariableList params;
auto* body = create<ast::BlockStatement>( auto* body = create<ast::BlockStatement>(
@ -317,23 +317,23 @@ TEST_F(MslGeneratorImplTest, Emit_Function_EntryPointData_Fragment_Output) {
create<ast::AssignmentStatement>( create<ast::AssignmentStatement>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("foo"), "foo"), Source{}, mod->RegisterSymbol("foo"), "foo"),
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("foo"), "foo")), Source{}, mod->RegisterSymbol("foo"), "foo")),
create<ast::AssignmentStatement>( create<ast::AssignmentStatement>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("bar"), "bar"), Source{}, mod->RegisterSymbol("bar"), "bar"),
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("bar"), "bar")), Source{}, mod->RegisterSymbol("bar"), "bar")),
}); });
auto* func = create<ast::Function>( auto* func = create<ast::Function>(
Source{}, mod.RegisterSymbol("main"), "main", params, &f32, body, Source{}, mod->RegisterSymbol("main"), "main", params, &f32, body,
ast::FunctionDecorationList{ ast::FunctionDecorationList{
create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment), create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
}); });
mod.AddFunction(func); mod->AddFunction(func);
ASSERT_TRUE(td.Determine()) << td.error(); ASSERT_TRUE(td.Determine()) << td.error();
@ -382,8 +382,8 @@ TEST_F(MslGeneratorImplTest, Emit_Function_EntryPointData_Compute_Input) {
td.RegisterVariableForTesting(foo_var); td.RegisterVariableForTesting(foo_var);
td.RegisterVariableForTesting(bar_var); td.RegisterVariableForTesting(bar_var);
mod.AddGlobalVariable(foo_var); mod->AddGlobalVariable(foo_var);
mod.AddGlobalVariable(bar_var); mod->AddGlobalVariable(bar_var);
ast::VariableList params; ast::VariableList params;
auto* body = create<ast::BlockStatement>( auto* body = create<ast::BlockStatement>(
@ -391,23 +391,23 @@ TEST_F(MslGeneratorImplTest, Emit_Function_EntryPointData_Compute_Input) {
create<ast::AssignmentStatement>( create<ast::AssignmentStatement>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("foo"), "foo"), Source{}, mod->RegisterSymbol("foo"), "foo"),
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("foo"), "foo")), Source{}, mod->RegisterSymbol("foo"), "foo")),
create<ast::AssignmentStatement>( create<ast::AssignmentStatement>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("bar"), "bar"), Source{}, mod->RegisterSymbol("bar"), "bar"),
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("bar"), "bar")), Source{}, mod->RegisterSymbol("bar"), "bar")),
}); });
auto* func = create<ast::Function>( auto* func = create<ast::Function>(
Source{}, mod.RegisterSymbol("main"), "main", params, &f32, body, Source{}, mod->RegisterSymbol("main"), "main", params, &f32, body,
ast::FunctionDecorationList{ ast::FunctionDecorationList{
create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute), create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute),
}); });
mod.AddFunction(func); mod->AddFunction(func);
ASSERT_TRUE(td.Determine()) << td.error(); ASSERT_TRUE(td.Determine()) << td.error();
@ -451,8 +451,8 @@ TEST_F(MslGeneratorImplTest, Emit_Function_EntryPointData_Compute_Output) {
td.RegisterVariableForTesting(foo_var); td.RegisterVariableForTesting(foo_var);
td.RegisterVariableForTesting(bar_var); td.RegisterVariableForTesting(bar_var);
mod.AddGlobalVariable(foo_var); mod->AddGlobalVariable(foo_var);
mod.AddGlobalVariable(bar_var); mod->AddGlobalVariable(bar_var);
ast::VariableList params; ast::VariableList params;
auto* body = create<ast::BlockStatement>( auto* body = create<ast::BlockStatement>(
@ -460,23 +460,23 @@ TEST_F(MslGeneratorImplTest, Emit_Function_EntryPointData_Compute_Output) {
create<ast::AssignmentStatement>( create<ast::AssignmentStatement>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("foo"), "foo"), Source{}, mod->RegisterSymbol("foo"), "foo"),
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("foo"), "foo")), Source{}, mod->RegisterSymbol("foo"), "foo")),
create<ast::AssignmentStatement>( create<ast::AssignmentStatement>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("bar"), "bar"), Source{}, mod->RegisterSymbol("bar"), "bar"),
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("bar"), "bar")), Source{}, mod->RegisterSymbol("bar"), "bar")),
}); });
auto* func = create<ast::Function>( auto* func = create<ast::Function>(
Source{}, mod.RegisterSymbol("main"), "main", params, &f32, body, Source{}, mod->RegisterSymbol("main"), "main", params, &f32, body,
ast::FunctionDecorationList{ ast::FunctionDecorationList{
create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute), create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute),
}); });
mod.AddFunction(func); mod->AddFunction(func);
ASSERT_TRUE(td.Determine()) << td.error(); ASSERT_TRUE(td.Determine()) << td.error();
@ -526,31 +526,32 @@ TEST_F(MslGeneratorImplTest, Emit_Function_EntryPointData_Builtins) {
td.RegisterVariableForTesting(coord_var); td.RegisterVariableForTesting(coord_var);
td.RegisterVariableForTesting(depth_var); td.RegisterVariableForTesting(depth_var);
mod.AddGlobalVariable(coord_var); mod->AddGlobalVariable(coord_var);
mod.AddGlobalVariable(depth_var); mod->AddGlobalVariable(depth_var);
ast::VariableList params; ast::VariableList params;
auto* body = create<ast::BlockStatement>( auto* body = create<ast::BlockStatement>(
Source{}, ast::StatementList{ Source{},
create<ast::AssignmentStatement>( ast::StatementList{
Source{}, create<ast::AssignmentStatement>(
create<ast::IdentifierExpression>( Source{},
Source{}, mod.RegisterSymbol("depth"), "depth"), create<ast::IdentifierExpression>(
create<ast::MemberAccessorExpression>( Source{}, mod->RegisterSymbol("depth"), "depth"),
Source{}, create<ast::MemberAccessorExpression>(
create<ast::IdentifierExpression>( Source{},
Source{}, mod.RegisterSymbol("coord"), "coord"), create<ast::IdentifierExpression>(
create<ast::IdentifierExpression>( Source{}, mod->RegisterSymbol("coord"), "coord"),
Source{}, mod.RegisterSymbol("x"), "x"))), create<ast::IdentifierExpression>(
}); Source{}, mod->RegisterSymbol("x"), "x"))),
});
auto* func = create<ast::Function>( auto* func = create<ast::Function>(
Source{}, mod.RegisterSymbol("main"), "main", params, &void_type, body, Source{}, mod->RegisterSymbol("main"), "main", params, &void_type, body,
ast::FunctionDecorationList{ ast::FunctionDecorationList{
create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment), create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
}); });
mod.AddFunction(func); mod->AddFunction(func);
ASSERT_TRUE(td.Determine()) << td.error(); ASSERT_TRUE(td.Determine()) << td.error();

View File

@ -63,11 +63,11 @@ TEST_F(MslGeneratorImplTest, Emit_Function) {
create<ast::ReturnStatement>(Source{}), create<ast::ReturnStatement>(Source{}),
}); });
auto* func = create<ast::Function>(Source{}, mod.RegisterSymbol("my_func"), auto* func = create<ast::Function>(Source{}, mod->RegisterSymbol("my_func"),
"my_func", ast::VariableList{}, &void_type, "my_func", ast::VariableList{}, &void_type,
body, ast::FunctionDecorationList{}); body, ast::FunctionDecorationList{});
mod.AddFunction(func); mod->AddFunction(func);
gen.increment_indent(); gen.increment_indent();
ASSERT_TRUE(gen.Generate()) << gen.error(); ASSERT_TRUE(gen.Generate()) << gen.error();
@ -88,11 +88,11 @@ TEST_F(MslGeneratorImplTest, Emit_Function_Name_Collision) {
create<ast::ReturnStatement>(Source{}), create<ast::ReturnStatement>(Source{}),
}); });
auto* func = create<ast::Function>(Source{}, mod.RegisterSymbol("main"), auto* func = create<ast::Function>(Source{}, mod->RegisterSymbol("main"),
"main", ast::VariableList{}, &void_type, "main", ast::VariableList{}, &void_type,
body, ast::FunctionDecorationList{}); body, ast::FunctionDecorationList{});
mod.AddFunction(func); mod->AddFunction(func);
gen.increment_indent(); gen.increment_indent();
ASSERT_TRUE(gen.Generate()) << gen.error(); ASSERT_TRUE(gen.Generate()) << gen.error();
@ -134,11 +134,11 @@ TEST_F(MslGeneratorImplTest, Emit_Function_WithParams) {
create<ast::ReturnStatement>(Source{}), create<ast::ReturnStatement>(Source{}),
}); });
auto* func = create<ast::Function>(Source{}, mod.RegisterSymbol("my_func"), auto* func = create<ast::Function>(Source{}, mod->RegisterSymbol("my_func"),
"my_func", params, &void_type, body, "my_func", params, &void_type, body,
ast::FunctionDecorationList{}); ast::FunctionDecorationList{});
mod.AddFunction(func); mod->AddFunction(func);
gen.increment_indent(); gen.increment_indent();
ASSERT_TRUE(gen.Generate()) << gen.error(); ASSERT_TRUE(gen.Generate()) << gen.error();
@ -182,8 +182,8 @@ TEST_F(MslGeneratorImplTest, Emit_FunctionDecoration_EntryPoint_WithInOutVars) {
td.RegisterVariableForTesting(foo_var); td.RegisterVariableForTesting(foo_var);
td.RegisterVariableForTesting(bar_var); td.RegisterVariableForTesting(bar_var);
mod.AddGlobalVariable(foo_var); mod->AddGlobalVariable(foo_var);
mod.AddGlobalVariable(bar_var); mod->AddGlobalVariable(bar_var);
ast::VariableList params; ast::VariableList params;
auto* body = create<ast::BlockStatement>( auto* body = create<ast::BlockStatement>(
@ -191,18 +191,18 @@ TEST_F(MslGeneratorImplTest, Emit_FunctionDecoration_EntryPoint_WithInOutVars) {
create<ast::AssignmentStatement>( create<ast::AssignmentStatement>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("bar"), "bar"), Source{}, mod->RegisterSymbol("bar"), "bar"),
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("foo"), "foo")), Source{}, mod->RegisterSymbol("foo"), "foo")),
create<ast::ReturnStatement>(Source{}), create<ast::ReturnStatement>(Source{}),
}); });
auto* func = create<ast::Function>( auto* func = create<ast::Function>(
Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params, Source{}, mod->RegisterSymbol("frag_main"), "frag_main", params,
&void_type, body, &void_type, body,
ast::FunctionDecorationList{create<ast::StageDecoration>( ast::FunctionDecorationList{create<ast::StageDecoration>(
Source{}, ast::PipelineStage::kFragment)}); Source{}, ast::PipelineStage::kFragment)});
mod.AddFunction(func); mod->AddFunction(func);
ASSERT_TRUE(td.Determine()) << td.error(); ASSERT_TRUE(td.Determine()) << td.error();
@ -259,32 +259,33 @@ TEST_F(MslGeneratorImplTest,
td.RegisterVariableForTesting(coord_var); td.RegisterVariableForTesting(coord_var);
td.RegisterVariableForTesting(depth_var); td.RegisterVariableForTesting(depth_var);
mod.AddGlobalVariable(coord_var); mod->AddGlobalVariable(coord_var);
mod.AddGlobalVariable(depth_var); mod->AddGlobalVariable(depth_var);
ast::VariableList params; ast::VariableList params;
auto* body = create<ast::BlockStatement>( auto* body = create<ast::BlockStatement>(
Source{}, ast::StatementList{ Source{},
create<ast::AssignmentStatement>( ast::StatementList{
Source{}, create<ast::AssignmentStatement>(
create<ast::IdentifierExpression>( Source{},
Source{}, mod.RegisterSymbol("depth"), "depth"), create<ast::IdentifierExpression>(
create<ast::MemberAccessorExpression>( Source{}, mod->RegisterSymbol("depth"), "depth"),
Source{}, create<ast::MemberAccessorExpression>(
create<ast::IdentifierExpression>( Source{},
Source{}, mod.RegisterSymbol("coord"), "coord"), create<ast::IdentifierExpression>(
create<ast::IdentifierExpression>( Source{}, mod->RegisterSymbol("coord"), "coord"),
Source{}, mod.RegisterSymbol("x"), "x"))), create<ast::IdentifierExpression>(
create<ast::ReturnStatement>(Source{}), Source{}, mod->RegisterSymbol("x"), "x"))),
}); create<ast::ReturnStatement>(Source{}),
});
auto* func = create<ast::Function>( auto* func = create<ast::Function>(
Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params, Source{}, mod->RegisterSymbol("frag_main"), "frag_main", params,
&void_type, body, &void_type, body,
ast::FunctionDecorationList{ ast::FunctionDecorationList{
create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment), create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
}); });
mod.AddFunction(func); mod->AddFunction(func);
ASSERT_TRUE(td.Determine()) << td.error(); ASSERT_TRUE(td.Determine()) << td.error();
@ -324,7 +325,7 @@ TEST_F(MslGeneratorImplTest, Emit_FunctionDecoration_EntryPoint_With_Uniform) {
td.RegisterVariableForTesting(coord_var); td.RegisterVariableForTesting(coord_var);
mod.AddGlobalVariable(coord_var); mod->AddGlobalVariable(coord_var);
ast::VariableList params; ast::VariableList params;
auto* var = create<ast::Variable>( auto* var = create<ast::Variable>(
@ -336,8 +337,8 @@ TEST_F(MslGeneratorImplTest, Emit_FunctionDecoration_EntryPoint_With_Uniform) {
create<ast::MemberAccessorExpression>( create<ast::MemberAccessorExpression>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("coord"), "coord"), Source{}, mod->RegisterSymbol("coord"), "coord"),
create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("x"), create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("x"),
"x")), // constructor "x")), // constructor
ast::VariableDecorationList{}); // decorations ast::VariableDecorationList{}); // decorations
@ -347,13 +348,13 @@ TEST_F(MslGeneratorImplTest, Emit_FunctionDecoration_EntryPoint_With_Uniform) {
create<ast::ReturnStatement>(Source{}), create<ast::ReturnStatement>(Source{}),
}); });
auto* func = create<ast::Function>( auto* func = create<ast::Function>(
Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params, Source{}, mod->RegisterSymbol("frag_main"), "frag_main", params,
&void_type, body, &void_type, body,
ast::FunctionDecorationList{ ast::FunctionDecorationList{
create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment), create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
}); });
mod.AddFunction(func); mod->AddFunction(func);
ASSERT_TRUE(td.Determine()) << td.error(); ASSERT_TRUE(td.Determine()) << td.error();
@ -371,27 +372,16 @@ fragment void frag_main(constant float4& coord [[buffer(0)]]) {
TEST_F(MslGeneratorImplTest, TEST_F(MslGeneratorImplTest,
Emit_FunctionDecoration_EntryPoint_With_RW_StorageBuffer) { Emit_FunctionDecoration_EntryPoint_With_RW_StorageBuffer) {
ast::type::Void void_type; ast::type::Void void_type;
ast::type::F32 f32;
ast::type::I32 i32;
ast::StructMemberList members; auto* str = create<ast::Struct>(
ast::StructMemberDecorationList a_deco; ast::StructMemberList{Member("a", ty.i32, {MemberOffset(0)}),
a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0)); Member("b", ty.f32, {MemberOffset(4)})},
members.push_back(create<ast::StructMember>(Source{}, mod.RegisterSymbol("a"), ast::StructDecorationList{});
"a", &i32, a_deco));
ast::StructMemberDecorationList b_deco; ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
members.push_back(create<ast::StructMember>(Source{}, mod.RegisterSymbol("b"),
"b", &f32, b_deco));
auto* str =
create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
ast::type::Struct s(mod.RegisterSymbol("Data"), "Data", str);
ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s); ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s);
mod.AddConstructedType(&s); mod->AddConstructedType(&s);
auto* coord_var = auto* coord_var =
create<ast::Variable>(Source{}, // source create<ast::Variable>(Source{}, // source
@ -408,20 +398,20 @@ TEST_F(MslGeneratorImplTest,
td.RegisterVariableForTesting(coord_var); td.RegisterVariableForTesting(coord_var);
mod.AddGlobalVariable(coord_var); mod->AddGlobalVariable(coord_var);
ast::VariableList params; ast::VariableList params;
auto* var = create<ast::Variable>( auto* var = create<ast::Variable>(
Source{}, // source Source{}, // source
"v", // name "v", // name
ast::StorageClass::kFunction, // storage_class ast::StorageClass::kFunction, // storage_class
&f32, // type ty.f32, // type
false, // is_const false, // is_const
create<ast::MemberAccessorExpression>( create<ast::MemberAccessorExpression>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("coord"), "coord"), Source{}, mod->RegisterSymbol("coord"), "coord"),
create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("b"), create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("b"),
"b")), // constructor "b")), // constructor
ast::VariableDecorationList{}); // decorations ast::VariableDecorationList{}); // decorations
@ -431,13 +421,13 @@ TEST_F(MslGeneratorImplTest,
create<ast::ReturnStatement>(Source{}), create<ast::ReturnStatement>(Source{}),
}); });
auto* func = create<ast::Function>( auto* func = create<ast::Function>(
Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params, Source{}, mod->RegisterSymbol("frag_main"), "frag_main", params,
&void_type, body, &void_type, body,
ast::FunctionDecorationList{ ast::FunctionDecorationList{
create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment), create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
}); });
mod.AddFunction(func); mod->AddFunction(func);
ASSERT_TRUE(td.Determine()) << td.error(); ASSERT_TRUE(td.Determine()) << td.error();
ASSERT_TRUE(gen.Generate()) << gen.error(); ASSERT_TRUE(gen.Generate()) << gen.error();
@ -459,27 +449,16 @@ fragment void frag_main(device Data& coord [[buffer(0)]]) {
TEST_F(MslGeneratorImplTest, TEST_F(MslGeneratorImplTest,
Emit_FunctionDecoration_EntryPoint_With_RO_StorageBuffer) { Emit_FunctionDecoration_EntryPoint_With_RO_StorageBuffer) {
ast::type::Void void_type; ast::type::Void void_type;
ast::type::F32 f32;
ast::type::I32 i32;
ast::StructMemberList members; auto* str = create<ast::Struct>(
ast::StructMemberDecorationList a_deco; ast::StructMemberList{Member("a", ty.i32, {MemberOffset(0)}),
a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0)); Member("b", ty.f32, {MemberOffset(4)})},
members.push_back(create<ast::StructMember>(Source{}, mod.RegisterSymbol("a"), ast::StructDecorationList{});
"a", &i32, a_deco));
ast::StructMemberDecorationList b_deco; ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
members.push_back(create<ast::StructMember>(Source{}, mod.RegisterSymbol("b"),
"b", &f32, b_deco));
auto* str =
create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
ast::type::Struct s(mod.RegisterSymbol("Data"), "Data", str);
ast::type::AccessControl ac(ast::AccessControl::kReadOnly, &s); ast::type::AccessControl ac(ast::AccessControl::kReadOnly, &s);
mod.AddConstructedType(&s); mod->AddConstructedType(&s);
auto* coord_var = auto* coord_var =
create<ast::Variable>(Source{}, // source create<ast::Variable>(Source{}, // source
@ -496,7 +475,7 @@ TEST_F(MslGeneratorImplTest,
td.RegisterVariableForTesting(coord_var); td.RegisterVariableForTesting(coord_var);
mod.AddGlobalVariable(coord_var); mod->AddGlobalVariable(coord_var);
ast::VariableList params; ast::VariableList params;
@ -504,13 +483,13 @@ TEST_F(MslGeneratorImplTest,
Source{}, // source Source{}, // source
"v", // name "v", // name
ast::StorageClass::kFunction, // storage_class ast::StorageClass::kFunction, // storage_class
&f32, // type ty.f32, // type
false, // is_const false, // is_const
create<ast::MemberAccessorExpression>( create<ast::MemberAccessorExpression>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("coord"), "coord"), Source{}, mod->RegisterSymbol("coord"), "coord"),
create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("b"), create<ast::IdentifierExpression>(Source{}, mod->RegisterSymbol("b"),
"b")), // constructor "b")), // constructor
ast::VariableDecorationList{}); // decorations ast::VariableDecorationList{}); // decorations
@ -520,13 +499,13 @@ TEST_F(MslGeneratorImplTest,
create<ast::ReturnStatement>(Source{}), create<ast::ReturnStatement>(Source{}),
}); });
auto* func = create<ast::Function>( auto* func = create<ast::Function>(
Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params, Source{}, mod->RegisterSymbol("frag_main"), "frag_main", params,
&void_type, body, &void_type, body,
ast::FunctionDecorationList{ ast::FunctionDecorationList{
create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment), create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
}); });
mod.AddFunction(func); mod->AddFunction(func);
ASSERT_TRUE(td.Determine()) << td.error(); ASSERT_TRUE(td.Determine()) << td.error();
@ -592,9 +571,9 @@ TEST_F(
td.RegisterVariableForTesting(bar_var); td.RegisterVariableForTesting(bar_var);
td.RegisterVariableForTesting(val_var); td.RegisterVariableForTesting(val_var);
mod.AddGlobalVariable(foo_var); mod->AddGlobalVariable(foo_var);
mod.AddGlobalVariable(bar_var); mod->AddGlobalVariable(bar_var);
mod.AddGlobalVariable(val_var); mod->AddGlobalVariable(val_var);
ast::VariableList params; ast::VariableList params;
params.push_back( params.push_back(
@ -612,24 +591,24 @@ TEST_F(
create<ast::AssignmentStatement>( create<ast::AssignmentStatement>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("bar"), "bar"), Source{}, mod->RegisterSymbol("bar"), "bar"),
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("foo"), "foo")), Source{}, mod->RegisterSymbol("foo"), "foo")),
create<ast::AssignmentStatement>( create<ast::AssignmentStatement>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("val"), "val"), Source{}, mod->RegisterSymbol("val"), "val"),
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("param"), "param")), Source{}, mod->RegisterSymbol("param"), "param")),
create<ast::ReturnStatement>( create<ast::ReturnStatement>(
Source{}, create<ast::IdentifierExpression>( Source{}, create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("foo"), "foo")), Source{}, mod->RegisterSymbol("foo"), "foo")),
}); });
auto* sub_func = create<ast::Function>( auto* sub_func = create<ast::Function>(
Source{}, mod.RegisterSymbol("sub_func"), "sub_func", params, &f32, body, Source{}, mod->RegisterSymbol("sub_func"), "sub_func", params, &f32, body,
ast::FunctionDecorationList{}); ast::FunctionDecorationList{});
mod.AddFunction(sub_func); mod->AddFunction(sub_func);
ast::ExpressionList expr; ast::ExpressionList expr;
expr.push_back(create<ast::ScalarConstructorExpression>( expr.push_back(create<ast::ScalarConstructorExpression>(
@ -641,21 +620,21 @@ TEST_F(
create<ast::AssignmentStatement>( create<ast::AssignmentStatement>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("bar"), "bar"), Source{}, mod->RegisterSymbol("bar"), "bar"),
create<ast::CallExpression>( create<ast::CallExpression>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("sub_func"), "sub_func"), Source{}, mod->RegisterSymbol("sub_func"), "sub_func"),
expr)), expr)),
create<ast::ReturnStatement>(Source{}), create<ast::ReturnStatement>(Source{}),
}); });
auto* func_1 = create<ast::Function>( auto* func_1 = create<ast::Function>(
Source{}, mod.RegisterSymbol("ep_1"), "ep_1", params, &void_type, body, Source{}, mod->RegisterSymbol("ep_1"), "ep_1", params, &void_type, body,
ast::FunctionDecorationList{ ast::FunctionDecorationList{
create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment), create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
}); });
mod.AddFunction(func_1); mod->AddFunction(func_1);
ASSERT_TRUE(td.Determine()) << td.error(); ASSERT_TRUE(td.Determine()) << td.error();
@ -706,7 +685,7 @@ TEST_F(MslGeneratorImplTest,
td.RegisterVariableForTesting(depth_var); td.RegisterVariableForTesting(depth_var);
mod.AddGlobalVariable(depth_var); mod->AddGlobalVariable(depth_var);
ast::VariableList params; ast::VariableList params;
params.push_back( params.push_back(
@ -723,13 +702,13 @@ TEST_F(MslGeneratorImplTest,
ast::StatementList{ ast::StatementList{
create<ast::ReturnStatement>( create<ast::ReturnStatement>(
Source{}, create<ast::IdentifierExpression>( Source{}, create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("param"), "param")), Source{}, mod->RegisterSymbol("param"), "param")),
}); });
auto* sub_func = create<ast::Function>( auto* sub_func = create<ast::Function>(
Source{}, mod.RegisterSymbol("sub_func"), "sub_func", params, &f32, body, Source{}, mod->RegisterSymbol("sub_func"), "sub_func", params, &f32, body,
ast::FunctionDecorationList{}); ast::FunctionDecorationList{});
mod.AddFunction(sub_func); mod->AddFunction(sub_func);
ast::ExpressionList expr; ast::ExpressionList expr;
expr.push_back(create<ast::ScalarConstructorExpression>( expr.push_back(create<ast::ScalarConstructorExpression>(
@ -741,22 +720,22 @@ TEST_F(MslGeneratorImplTest,
create<ast::AssignmentStatement>( create<ast::AssignmentStatement>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("depth"), "depth"), Source{}, mod->RegisterSymbol("depth"), "depth"),
create<ast::CallExpression>( create<ast::CallExpression>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("sub_func"), "sub_func"), Source{}, mod->RegisterSymbol("sub_func"), "sub_func"),
expr)), expr)),
create<ast::ReturnStatement>(Source{}), create<ast::ReturnStatement>(Source{}),
}); });
auto* func_1 = create<ast::Function>( auto* func_1 = create<ast::Function>(
Source{}, mod.RegisterSymbol("ep_1"), "ep_1", params, &void_type, body, Source{}, mod->RegisterSymbol("ep_1"), "ep_1", params, &void_type, body,
ast::FunctionDecorationList{ ast::FunctionDecorationList{
create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment), create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
}); });
mod.AddFunction(func_1); mod->AddFunction(func_1);
ASSERT_TRUE(td.Determine()) << td.error(); ASSERT_TRUE(td.Determine()) << td.error();
@ -814,8 +793,8 @@ TEST_F(
td.RegisterVariableForTesting(coord_var); td.RegisterVariableForTesting(coord_var);
td.RegisterVariableForTesting(depth_var); td.RegisterVariableForTesting(depth_var);
mod.AddGlobalVariable(coord_var); mod->AddGlobalVariable(coord_var);
mod.AddGlobalVariable(depth_var); mod->AddGlobalVariable(depth_var);
ast::VariableList params; ast::VariableList params;
params.push_back( params.push_back(
@ -833,22 +812,22 @@ TEST_F(
create<ast::AssignmentStatement>( create<ast::AssignmentStatement>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("depth"), "depth"), Source{}, mod->RegisterSymbol("depth"), "depth"),
create<ast::MemberAccessorExpression>( create<ast::MemberAccessorExpression>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("coord"), "coord"), Source{}, mod->RegisterSymbol("coord"), "coord"),
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("x"), "x"))), Source{}, mod->RegisterSymbol("x"), "x"))),
create<ast::ReturnStatement>( create<ast::ReturnStatement>(
Source{}, create<ast::IdentifierExpression>( Source{}, create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("param"), "param")), Source{}, mod->RegisterSymbol("param"), "param")),
}); });
auto* sub_func = create<ast::Function>( auto* sub_func = create<ast::Function>(
Source{}, mod.RegisterSymbol("sub_func"), "sub_func", params, &f32, body, Source{}, mod->RegisterSymbol("sub_func"), "sub_func", params, &f32, body,
ast::FunctionDecorationList{}); ast::FunctionDecorationList{});
mod.AddFunction(sub_func); mod->AddFunction(sub_func);
ast::ExpressionList expr; ast::ExpressionList expr;
expr.push_back(create<ast::ScalarConstructorExpression>( expr.push_back(create<ast::ScalarConstructorExpression>(
@ -860,21 +839,21 @@ TEST_F(
create<ast::AssignmentStatement>( create<ast::AssignmentStatement>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("depth"), "depth"), Source{}, mod->RegisterSymbol("depth"), "depth"),
create<ast::CallExpression>( create<ast::CallExpression>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("sub_func"), "sub_func"), Source{}, mod->RegisterSymbol("sub_func"), "sub_func"),
expr)), expr)),
create<ast::ReturnStatement>(Source{}), create<ast::ReturnStatement>(Source{}),
}); });
auto* func_1 = create<ast::Function>( auto* func_1 = create<ast::Function>(
Source{}, mod.RegisterSymbol("ep_1"), "ep_1", params, &void_type, body, Source{}, mod->RegisterSymbol("ep_1"), "ep_1", params, &void_type, body,
ast::FunctionDecorationList{ ast::FunctionDecorationList{
create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment), create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
}); });
mod.AddFunction(func_1); mod->AddFunction(func_1);
ASSERT_TRUE(td.Determine()) << td.error(); ASSERT_TRUE(td.Determine()) << td.error();
ASSERT_TRUE(gen.Generate()) << gen.error(); ASSERT_TRUE(gen.Generate()) << gen.error();
@ -919,7 +898,7 @@ TEST_F(MslGeneratorImplTest,
td.RegisterVariableForTesting(coord_var); td.RegisterVariableForTesting(coord_var);
mod.AddGlobalVariable(coord_var); mod->AddGlobalVariable(coord_var);
ast::VariableList params; ast::VariableList params;
params.push_back( params.push_back(
@ -935,18 +914,19 @@ TEST_F(MslGeneratorImplTest,
Source{}, Source{},
ast::StatementList{ ast::StatementList{
create<ast::ReturnStatement>( create<ast::ReturnStatement>(
Source{}, create<ast::MemberAccessorExpression>( Source{},
Source{}, create<ast::MemberAccessorExpression>(
create<ast::IdentifierExpression>( Source{},
Source{}, mod.RegisterSymbol("coord"), "coord"), create<ast::IdentifierExpression>(
create<ast::IdentifierExpression>( Source{}, mod->RegisterSymbol("coord"), "coord"),
Source{}, mod.RegisterSymbol("x"), "x"))), create<ast::IdentifierExpression>(
Source{}, mod->RegisterSymbol("x"), "x"))),
}); });
auto* sub_func = create<ast::Function>( auto* sub_func = create<ast::Function>(
Source{}, mod.RegisterSymbol("sub_func"), "sub_func", params, &f32, body, Source{}, mod->RegisterSymbol("sub_func"), "sub_func", params, &f32, body,
ast::FunctionDecorationList{}); ast::FunctionDecorationList{});
mod.AddFunction(sub_func); mod->AddFunction(sub_func);
ast::ExpressionList expr; ast::ExpressionList expr;
expr.push_back(create<ast::ScalarConstructorExpression>( expr.push_back(create<ast::ScalarConstructorExpression>(
@ -961,7 +941,7 @@ TEST_F(MslGeneratorImplTest,
create<ast::CallExpression>( create<ast::CallExpression>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("sub_func"), "sub_func"), Source{}, mod->RegisterSymbol("sub_func"), "sub_func"),
expr), // constructor expr), // constructor
ast::VariableDecorationList{}); // decorations ast::VariableDecorationList{}); // decorations
@ -972,13 +952,13 @@ TEST_F(MslGeneratorImplTest,
}); });
auto* func = create<ast::Function>( auto* func = create<ast::Function>(
Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params, Source{}, mod->RegisterSymbol("frag_main"), "frag_main", params,
&void_type, body, &void_type, body,
ast::FunctionDecorationList{ ast::FunctionDecorationList{
create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment), create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
}); });
mod.AddFunction(func); mod->AddFunction(func);
ASSERT_TRUE(td.Determine()) << td.error(); ASSERT_TRUE(td.Determine()) << td.error();
ASSERT_TRUE(gen.Generate()) << gen.error(); ASSERT_TRUE(gen.Generate()) << gen.error();
@ -999,27 +979,16 @@ fragment void frag_main(constant float4& coord [[buffer(0)]]) {
TEST_F(MslGeneratorImplTest, TEST_F(MslGeneratorImplTest,
Emit_FunctionDecoration_Called_By_EntryPoint_With_RW_StorageBuffer) { Emit_FunctionDecoration_Called_By_EntryPoint_With_RW_StorageBuffer) {
ast::type::Void void_type; ast::type::Void void_type;
ast::type::F32 f32;
ast::type::I32 i32;
ast::StructMemberList members; auto* str = create<ast::Struct>(
ast::StructMemberDecorationList a_deco; ast::StructMemberList{Member("a", ty.i32, {MemberOffset(0)}),
a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0)); Member("b", ty.f32, {MemberOffset(4)})},
members.push_back(create<ast::StructMember>(Source{}, mod.RegisterSymbol("a"), ast::StructDecorationList{});
"a", &i32, a_deco));
ast::StructMemberDecorationList b_deco; ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
members.push_back(create<ast::StructMember>(Source{}, mod.RegisterSymbol("b"),
"b", &f32, b_deco));
auto* str =
create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
ast::type::Struct s(mod.RegisterSymbol("Data"), "Data", str);
ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s); ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s);
mod.AddConstructedType(&s); mod->AddConstructedType(&s);
auto* coord_var = auto* coord_var =
create<ast::Variable>(Source{}, // source create<ast::Variable>(Source{}, // source
@ -1035,14 +1004,14 @@ TEST_F(MslGeneratorImplTest,
}); });
td.RegisterVariableForTesting(coord_var); td.RegisterVariableForTesting(coord_var);
mod.AddGlobalVariable(coord_var); mod->AddGlobalVariable(coord_var);
ast::VariableList params; ast::VariableList params;
params.push_back( params.push_back(
create<ast::Variable>(Source{}, // source create<ast::Variable>(Source{}, // source
"param", // name "param", // name
ast::StorageClass::kFunction, // storage_class ast::StorageClass::kFunction, // storage_class
&f32, // type ty.f32, // type
false, // is_const false, // is_const
nullptr, // constructor nullptr, // constructor
ast::VariableDecorationList{})); // decorations ast::VariableDecorationList{})); // decorations
@ -1051,33 +1020,34 @@ TEST_F(MslGeneratorImplTest,
Source{}, Source{},
ast::StatementList{ ast::StatementList{
create<ast::ReturnStatement>( create<ast::ReturnStatement>(
Source{}, create<ast::MemberAccessorExpression>( Source{},
Source{}, create<ast::MemberAccessorExpression>(
create<ast::IdentifierExpression>( Source{},
Source{}, mod.RegisterSymbol("coord"), "coord"), create<ast::IdentifierExpression>(
create<ast::IdentifierExpression>( Source{}, mod->RegisterSymbol("coord"), "coord"),
Source{}, mod.RegisterSymbol("b"), "b"))), create<ast::IdentifierExpression>(
Source{}, mod->RegisterSymbol("b"), "b"))),
}); });
auto* sub_func = create<ast::Function>( auto* sub_func = create<ast::Function>(
Source{}, mod.RegisterSymbol("sub_func"), "sub_func", params, &f32, body, Source{}, mod->RegisterSymbol("sub_func"), "sub_func", params, ty.f32,
ast::FunctionDecorationList{}); body, ast::FunctionDecorationList{});
mod.AddFunction(sub_func); mod->AddFunction(sub_func);
ast::ExpressionList expr; ast::ExpressionList expr;
expr.push_back(create<ast::ScalarConstructorExpression>( expr.push_back(create<ast::ScalarConstructorExpression>(
Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.0f))); Source{}, create<ast::FloatLiteral>(Source{}, ty.f32, 1.0f)));
auto* var = create<ast::Variable>( auto* var = create<ast::Variable>(
Source{}, // source Source{}, // source
"v", // name "v", // name
ast::StorageClass::kFunction, // storage_class ast::StorageClass::kFunction, // storage_class
&f32, // type ty.f32, // type
false, // is_const false, // is_const
create<ast::CallExpression>( create<ast::CallExpression>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("sub_func"), "sub_func"), Source{}, mod->RegisterSymbol("sub_func"), "sub_func"),
expr), // constructor expr), // constructor
ast::VariableDecorationList{}); // decorations ast::VariableDecorationList{}); // decorations
@ -1088,13 +1058,13 @@ TEST_F(MslGeneratorImplTest,
}); });
auto* func = create<ast::Function>( auto* func = create<ast::Function>(
Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params, Source{}, mod->RegisterSymbol("frag_main"), "frag_main", params,
&void_type, body, &void_type, body,
ast::FunctionDecorationList{ ast::FunctionDecorationList{
create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment), create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
}); });
mod.AddFunction(func); mod->AddFunction(func);
ASSERT_TRUE(td.Determine()) << td.error(); ASSERT_TRUE(td.Determine()) << td.error();
@ -1121,27 +1091,16 @@ fragment void frag_main(device Data& coord [[buffer(0)]]) {
TEST_F(MslGeneratorImplTest, TEST_F(MslGeneratorImplTest,
Emit_FunctionDecoration_Called_By_EntryPoint_With_RO_StorageBuffer) { Emit_FunctionDecoration_Called_By_EntryPoint_With_RO_StorageBuffer) {
ast::type::Void void_type; ast::type::Void void_type;
ast::type::F32 f32;
ast::type::I32 i32;
ast::StructMemberList members; auto* str = create<ast::Struct>(
ast::StructMemberDecorationList a_deco; ast::StructMemberList{Member("a", ty.i32, {MemberOffset(0)}),
a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0)); Member("b", ty.f32, {MemberOffset(4)})},
members.push_back(create<ast::StructMember>(Source{}, mod.RegisterSymbol("a"), ast::StructDecorationList{});
"a", &i32, a_deco));
ast::StructMemberDecorationList b_deco; ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
members.push_back(create<ast::StructMember>(Source{}, mod.RegisterSymbol("b"),
"b", &f32, b_deco));
auto* str =
create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
ast::type::Struct s(mod.RegisterSymbol("Data"), "Data", str);
ast::type::AccessControl ac(ast::AccessControl::kReadOnly, &s); ast::type::AccessControl ac(ast::AccessControl::kReadOnly, &s);
mod.AddConstructedType(&s); mod->AddConstructedType(&s);
auto* coord_var = auto* coord_var =
create<ast::Variable>(Source{}, // source create<ast::Variable>(Source{}, // source
@ -1157,14 +1116,14 @@ TEST_F(MslGeneratorImplTest,
}); });
td.RegisterVariableForTesting(coord_var); td.RegisterVariableForTesting(coord_var);
mod.AddGlobalVariable(coord_var); mod->AddGlobalVariable(coord_var);
ast::VariableList params; ast::VariableList params;
params.push_back( params.push_back(
create<ast::Variable>(Source{}, // source create<ast::Variable>(Source{}, // source
"param", // name "param", // name
ast::StorageClass::kFunction, // storage_class ast::StorageClass::kFunction, // storage_class
&f32, // type ty.f32, // type
false, // is_const false, // is_const
nullptr, // constructor nullptr, // constructor
ast::VariableDecorationList{})); // decorations ast::VariableDecorationList{})); // decorations
@ -1173,33 +1132,34 @@ TEST_F(MslGeneratorImplTest,
Source{}, Source{},
ast::StatementList{ ast::StatementList{
create<ast::ReturnStatement>( create<ast::ReturnStatement>(
Source{}, create<ast::MemberAccessorExpression>( Source{},
Source{}, create<ast::MemberAccessorExpression>(
create<ast::IdentifierExpression>( Source{},
Source{}, mod.RegisterSymbol("coord"), "coord"), create<ast::IdentifierExpression>(
create<ast::IdentifierExpression>( Source{}, mod->RegisterSymbol("coord"), "coord"),
Source{}, mod.RegisterSymbol("b"), "b"))), create<ast::IdentifierExpression>(
Source{}, mod->RegisterSymbol("b"), "b"))),
}); });
auto* sub_func = create<ast::Function>( auto* sub_func = create<ast::Function>(
Source{}, mod.RegisterSymbol("sub_func"), "sub_func", params, &f32, body, Source{}, mod->RegisterSymbol("sub_func"), "sub_func", params, ty.f32,
ast::FunctionDecorationList{}); body, ast::FunctionDecorationList{});
mod.AddFunction(sub_func); mod->AddFunction(sub_func);
ast::ExpressionList expr; ast::ExpressionList expr;
expr.push_back(create<ast::ScalarConstructorExpression>( expr.push_back(create<ast::ScalarConstructorExpression>(
Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.0f))); Source{}, create<ast::FloatLiteral>(Source{}, ty.f32, 1.0f)));
auto* var = create<ast::Variable>( auto* var = create<ast::Variable>(
Source{}, // source Source{}, // source
"v", // name "v", // name
ast::StorageClass::kFunction, // storage_class ast::StorageClass::kFunction, // storage_class
&f32, // type ty.f32, // type
false, // is_const false, // is_const
create<ast::CallExpression>( create<ast::CallExpression>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("sub_func"), "sub_func"), Source{}, mod->RegisterSymbol("sub_func"), "sub_func"),
expr), // constructor expr), // constructor
ast::VariableDecorationList{}); // decorations ast::VariableDecorationList{}); // decorations
@ -1210,13 +1170,13 @@ TEST_F(MslGeneratorImplTest,
}); });
auto* func = create<ast::Function>( auto* func = create<ast::Function>(
Source{}, mod.RegisterSymbol("frag_main"), "frag_main", params, Source{}, mod->RegisterSymbol("frag_main"), "frag_main", params,
&void_type, body, &void_type, body,
ast::FunctionDecorationList{ ast::FunctionDecorationList{
create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment), create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
}); });
mod.AddFunction(func); mod->AddFunction(func);
ASSERT_TRUE(td.Determine()) << td.error(); ASSERT_TRUE(td.Determine()) << td.error();
@ -1259,7 +1219,7 @@ TEST_F(MslGeneratorImplTest,
}); });
td.RegisterVariableForTesting(bar_var); td.RegisterVariableForTesting(bar_var);
mod.AddGlobalVariable(bar_var); mod->AddGlobalVariable(bar_var);
ast::VariableList params; ast::VariableList params;
auto* list = create<ast::BlockStatement>( auto* list = create<ast::BlockStatement>(
@ -1273,7 +1233,7 @@ TEST_F(MslGeneratorImplTest,
create<ast::AssignmentStatement>( create<ast::AssignmentStatement>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("bar"), "bar"), Source{}, mod->RegisterSymbol("bar"), "bar"),
create<ast::ScalarConstructorExpression>( create<ast::ScalarConstructorExpression>(
Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.0f))), Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.0f))),
create<ast::IfStatement>( create<ast::IfStatement>(
@ -1289,12 +1249,12 @@ TEST_F(MslGeneratorImplTest,
}); });
auto* func_1 = create<ast::Function>( auto* func_1 = create<ast::Function>(
Source{}, mod.RegisterSymbol("ep_1"), "ep_1", params, &void_type, body, Source{}, mod->RegisterSymbol("ep_1"), "ep_1", params, &void_type, body,
ast::FunctionDecorationList{ ast::FunctionDecorationList{
create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment), create<ast::StageDecoration>(Source{}, ast::PipelineStage::kFragment),
}); });
mod.AddFunction(func_1); mod->AddFunction(func_1);
ASSERT_TRUE(td.Determine()) << td.error(); ASSERT_TRUE(td.Determine()) << td.error();
ASSERT_TRUE(gen.Generate()) << gen.error(); ASSERT_TRUE(gen.Generate()) << gen.error();
@ -1321,13 +1281,13 @@ TEST_F(MslGeneratorImplTest,
ast::type::Void void_type; ast::type::Void void_type;
auto* func = create<ast::Function>( auto* func = create<ast::Function>(
Source{}, mod.RegisterSymbol("main"), "main", ast::VariableList{}, Source{}, mod->RegisterSymbol("main"), "main", ast::VariableList{},
&void_type, create<ast::BlockStatement>(Source{}, ast::StatementList{}), &void_type, create<ast::BlockStatement>(Source{}, ast::StatementList{}),
ast::FunctionDecorationList{ ast::FunctionDecorationList{
create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute), create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute),
}); });
mod.AddFunction(func); mod->AddFunction(func);
ASSERT_TRUE(gen.Generate()) << gen.error(); ASSERT_TRUE(gen.Generate()) << gen.error();
EXPECT_EQ(gen.result(), R"(#include <metal_stdlib> EXPECT_EQ(gen.result(), R"(#include <metal_stdlib>
@ -1359,11 +1319,11 @@ TEST_F(MslGeneratorImplTest, Emit_Function_WithArrayParams) {
create<ast::ReturnStatement>(Source{}), create<ast::ReturnStatement>(Source{}),
}); });
auto* func = create<ast::Function>(Source{}, mod.RegisterSymbol("my_func"), auto* func = create<ast::Function>(Source{}, mod->RegisterSymbol("my_func"),
"my_func", params, &void_type, body, "my_func", params, &void_type, body,
ast::FunctionDecorationList{}); ast::FunctionDecorationList{});
mod.AddFunction(func); mod->AddFunction(func);
gen.increment_indent(); gen.increment_indent();
@ -1396,20 +1356,14 @@ TEST_F(MslGeneratorImplTest,
// } // }
ast::type::Void void_type; ast::type::Void void_type;
ast::type::F32 f32;
ast::StructMemberList members;
ast::StructMemberDecorationList a_deco;
a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
members.push_back(create<ast::StructMember>(Source{}, mod.RegisterSymbol("d"),
"d", &f32, a_deco));
ast::StructDecorationList s_decos; ast::StructDecorationList s_decos;
s_decos.push_back(create<ast::StructBlockDecoration>(Source{})); s_decos.push_back(create<ast::StructBlockDecoration>(Source{}));
auto* str = create<ast::Struct>(Source{}, members, s_decos); auto* str = create<ast::Struct>(
ast::StructMemberList{Member("d", ty.f32, {MemberOffset(0)})}, s_decos);
ast::type::Struct s(mod.RegisterSymbol("Data"), "Data", str); ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s); ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s);
auto* data_var = auto* data_var =
@ -1425,10 +1379,10 @@ TEST_F(MslGeneratorImplTest,
create<ast::SetDecoration>(Source{}, 0), create<ast::SetDecoration>(Source{}, 0),
}); });
mod.AddConstructedType(&s); mod->AddConstructedType(&s);
td.RegisterVariableForTesting(data_var); td.RegisterVariableForTesting(data_var);
mod.AddGlobalVariable(data_var); mod->AddGlobalVariable(data_var);
{ {
ast::VariableList params; ast::VariableList params;
@ -1436,13 +1390,14 @@ TEST_F(MslGeneratorImplTest,
Source{}, // source Source{}, // source
"v", // name "v", // name
ast::StorageClass::kFunction, // storage_class ast::StorageClass::kFunction, // storage_class
&f32, // type ty.f32, // type
false, // is_const false, // is_const
create<ast::MemberAccessorExpression>( create<ast::MemberAccessorExpression>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("data"), "data"), Source{}, mod->RegisterSymbol("data"), "data"),
create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("d"), create<ast::IdentifierExpression>(Source{},
mod->RegisterSymbol("d"),
"d")), // constructor "d")), // constructor
ast::VariableDecorationList{}); // decorations ast::VariableDecorationList{}); // decorations
@ -1452,13 +1407,13 @@ TEST_F(MslGeneratorImplTest,
create<ast::ReturnStatement>(Source{}), create<ast::ReturnStatement>(Source{}),
}); });
auto* func = create<ast::Function>( auto* func = create<ast::Function>(
Source{}, mod.RegisterSymbol("a"), "a", params, &void_type, body, Source{}, mod->RegisterSymbol("a"), "a", params, &void_type, body,
ast::FunctionDecorationList{ ast::FunctionDecorationList{
create<ast::StageDecoration>(Source{}, create<ast::StageDecoration>(Source{},
ast::PipelineStage::kCompute), ast::PipelineStage::kCompute),
}); });
mod.AddFunction(func); mod->AddFunction(func);
} }
{ {
@ -1467,13 +1422,14 @@ TEST_F(MslGeneratorImplTest,
Source{}, // source Source{}, // source
"v", // name "v", // name
ast::StorageClass::kFunction, // storage_class ast::StorageClass::kFunction, // storage_class
&f32, // type ty.f32, // type
false, // is_const false, // is_const
create<ast::MemberAccessorExpression>( create<ast::MemberAccessorExpression>(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("data"), "data"), Source{}, mod->RegisterSymbol("data"), "data"),
create<ast::IdentifierExpression>(Source{}, mod.RegisterSymbol("d"), create<ast::IdentifierExpression>(Source{},
mod->RegisterSymbol("d"),
"d")), // constructor "d")), // constructor
ast::VariableDecorationList{}); // decorations ast::VariableDecorationList{}); // decorations
@ -1483,13 +1439,13 @@ TEST_F(MslGeneratorImplTest,
create<ast::ReturnStatement>(Source{}), create<ast::ReturnStatement>(Source{}),
}); });
auto* func = create<ast::Function>( auto* func = create<ast::Function>(
Source{}, mod.RegisterSymbol("b"), "b", params, &void_type, body, Source{}, mod->RegisterSymbol("b"), "b", params, &void_type, body,
ast::FunctionDecorationList{ ast::FunctionDecorationList{
create<ast::StageDecoration>(Source{}, create<ast::StageDecoration>(Source{},
ast::PipelineStage::kCompute), ast::PipelineStage::kCompute),
}); });
mod.AddFunction(func); mod->AddFunction(func);
} }
ASSERT_TRUE(td.Determine()) << td.error(); ASSERT_TRUE(td.Determine()) << td.error();

View File

@ -26,14 +26,14 @@ namespace {
using MslGeneratorImplTest = TestHelper; using MslGeneratorImplTest = TestHelper;
TEST_F(MslGeneratorImplTest, EmitIdentifierExpression) { TEST_F(MslGeneratorImplTest, EmitIdentifierExpression) {
ast::IdentifierExpression i(Source{}, mod.RegisterSymbol("foo"), "foo"); ast::IdentifierExpression i(Source{}, mod->RegisterSymbol("foo"), "foo");
ASSERT_TRUE(gen.EmitExpression(&i)) << gen.error(); ASSERT_TRUE(gen.EmitExpression(&i)) << gen.error();
EXPECT_EQ(gen.result(), "foo"); EXPECT_EQ(gen.result(), "foo");
} }
TEST_F(MslGeneratorImplTest, EmitIdentifierExpression_Single_WithCollision) { TEST_F(MslGeneratorImplTest, EmitIdentifierExpression_Single_WithCollision) {
ast::IdentifierExpression i(Source{}, mod.RegisterSymbol("virtual"), ast::IdentifierExpression i(Source{}, mod->RegisterSymbol("virtual"),
"virtual"); "virtual");
ASSERT_TRUE(gen.EmitExpression(&i)) << gen.error(); ASSERT_TRUE(gen.EmitExpression(&i)) << gen.error();

View File

@ -30,7 +30,7 @@ using MslGeneratorImplTest = TestHelper;
TEST_F(MslGeneratorImplTest, Emit_If) { TEST_F(MslGeneratorImplTest, Emit_If) {
auto* cond = create<ast::IdentifierExpression>( auto* cond = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("cond"), "cond"); Source{}, mod->RegisterSymbol("cond"), "cond");
auto* body = create<ast::BlockStatement>( auto* body = create<ast::BlockStatement>(
Source{}, ast::StatementList{ Source{}, ast::StatementList{
create<ast::ReturnStatement>(Source{}), create<ast::ReturnStatement>(Source{}),
@ -48,14 +48,14 @@ TEST_F(MslGeneratorImplTest, Emit_If) {
TEST_F(MslGeneratorImplTest, Emit_IfWithElseIf) { TEST_F(MslGeneratorImplTest, Emit_IfWithElseIf) {
auto* else_cond = create<ast::IdentifierExpression>( auto* else_cond = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("else_cond"), "else_cond"); Source{}, mod->RegisterSymbol("else_cond"), "else_cond");
auto* else_body = create<ast::BlockStatement>( auto* else_body = create<ast::BlockStatement>(
Source{}, ast::StatementList{ Source{}, ast::StatementList{
create<ast::ReturnStatement>(Source{}), create<ast::ReturnStatement>(Source{}),
}); });
auto* cond = create<ast::IdentifierExpression>( auto* cond = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("cond"), "cond"); Source{}, mod->RegisterSymbol("cond"), "cond");
auto* body = create<ast::BlockStatement>( auto* body = create<ast::BlockStatement>(
Source{}, ast::StatementList{ Source{}, ast::StatementList{
create<ast::ReturnStatement>(Source{}), create<ast::ReturnStatement>(Source{}),
@ -82,7 +82,7 @@ TEST_F(MslGeneratorImplTest, Emit_IfWithElse) {
}); });
auto* cond = create<ast::IdentifierExpression>( auto* cond = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("cond"), "cond"); Source{}, mod->RegisterSymbol("cond"), "cond");
auto* body = create<ast::BlockStatement>( auto* body = create<ast::BlockStatement>(
Source{}, ast::StatementList{ Source{}, ast::StatementList{
create<ast::ReturnStatement>(Source{}), create<ast::ReturnStatement>(Source{}),
@ -104,7 +104,7 @@ TEST_F(MslGeneratorImplTest, Emit_IfWithElse) {
TEST_F(MslGeneratorImplTest, Emit_IfWithMultiple) { TEST_F(MslGeneratorImplTest, Emit_IfWithMultiple) {
auto* else_cond = create<ast::IdentifierExpression>( auto* else_cond = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("else_cond"), "else_cond"); Source{}, mod->RegisterSymbol("else_cond"), "else_cond");
auto* else_body = create<ast::BlockStatement>( auto* else_body = create<ast::BlockStatement>(
Source{}, ast::StatementList{ Source{}, ast::StatementList{
@ -117,7 +117,7 @@ TEST_F(MslGeneratorImplTest, Emit_IfWithMultiple) {
}); });
auto* cond = create<ast::IdentifierExpression>( auto* cond = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("cond"), "cond"); Source{}, mod->RegisterSymbol("cond"), "cond");
auto* body = create<ast::BlockStatement>( auto* body = create<ast::BlockStatement>(
Source{}, ast::StatementList{ Source{}, ast::StatementList{
create<ast::ReturnStatement>(Source{}), create<ast::ReturnStatement>(Source{}),

View File

@ -58,7 +58,7 @@ TEST_P(MslImportData_SingleParamTest, FloatScalar) {
Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.f))); Source{}, create<ast::FloatLiteral>(Source{}, &f32, 1.f)));
auto* ident = create<ast::IdentifierExpression>( auto* ident = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol(param.name), param.name); Source{}, mod->RegisterSymbol(param.name), param.name);
ast::CallExpression call(Source{}, ident, params); ast::CallExpression call(Source{}, ident, params);
@ -103,7 +103,7 @@ TEST_F(MslGeneratorImplTest, MslImportData_SingleParamTest_IntScalar) {
ast::CallExpression expr(Source{}, ast::CallExpression expr(Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("abs"), "abs"), Source{}, mod->RegisterSymbol("abs"), "abs"),
params); params);
ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error(); ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
@ -127,7 +127,7 @@ TEST_P(MslImportData_DualParamTest, FloatScalar) {
ast::CallExpression expr( ast::CallExpression expr(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol(param.name), param.name), Source{}, mod->RegisterSymbol(param.name), param.name),
params); params);
ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error(); ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
@ -180,7 +180,7 @@ TEST_P(MslImportData_DualParam_VectorTest, FloatVector) {
ast::CallExpression expr( ast::CallExpression expr(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol(param.name), param.name), Source{}, mod->RegisterSymbol(param.name), param.name),
params); params);
ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error(); ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
@ -208,7 +208,7 @@ TEST_P(MslImportData_DualParam_Int_Test, IntScalar) {
ast::CallExpression expr( ast::CallExpression expr(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol(param.name), param.name), Source{}, mod->RegisterSymbol(param.name), param.name),
params); params);
ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error(); ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
@ -237,7 +237,7 @@ TEST_P(MslImportData_TripleParamTest, FloatScalar) {
ast::CallExpression expr( ast::CallExpression expr(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol(param.name), param.name), Source{}, mod->RegisterSymbol(param.name), param.name),
params); params);
ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error(); ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
@ -271,7 +271,7 @@ TEST_P(MslImportData_TripleParam_Int_Test, IntScalar) {
ast::CallExpression expr( ast::CallExpression expr(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol(param.name), param.name), Source{}, mod->RegisterSymbol(param.name), param.name),
params); params);
ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error(); ASSERT_TRUE(td.DetermineResultType(&expr)) << td.error();
@ -299,15 +299,15 @@ TEST_F(MslGeneratorImplTest, MslImportData_Determinant) {
ast::ExpressionList params; ast::ExpressionList params;
params.push_back(create<ast::IdentifierExpression>( params.push_back(create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("var"), "var")); Source{}, mod->RegisterSymbol("var"), "var"));
ast::CallExpression expr( ast::CallExpression expr(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("determinant"), "determinant"), Source{}, mod->RegisterSymbol("determinant"), "determinant"),
params); params);
mod.AddGlobalVariable(var); mod->AddGlobalVariable(var);
// Register the global // Register the global
ASSERT_TRUE(td.Determine()) << td.error(); ASSERT_TRUE(td.Determine()) << td.error();

View File

@ -89,21 +89,21 @@ TEST_F(MslGeneratorImplTest, DISABLED_Intrinsic_OuterProduct) {
ast::ExpressionList params; ast::ExpressionList params;
params.push_back(create<ast::IdentifierExpression>( params.push_back(create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("a"), "a")); Source{}, mod->RegisterSymbol("a"), "a"));
params.push_back(create<ast::IdentifierExpression>( params.push_back(create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("b"), "b")); Source{}, mod->RegisterSymbol("b"), "b"));
ast::CallExpression call( ast::CallExpression call(
Source{}, Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("outer_product"), "outer_product"), Source{}, mod->RegisterSymbol("outer_product"), "outer_product"),
params); params);
td.RegisterVariableForTesting(a); td.RegisterVariableForTesting(a);
td.RegisterVariableForTesting(b); td.RegisterVariableForTesting(b);
mod.AddGlobalVariable(a); mod->AddGlobalVariable(a);
mod.AddGlobalVariable(b); mod->AddGlobalVariable(b);
ASSERT_TRUE(td.Determine()) << td.error(); ASSERT_TRUE(td.Determine()) << td.error();
ASSERT_TRUE(td.DetermineResultType(&call)) << td.error(); ASSERT_TRUE(td.DetermineResultType(&call)) << td.error();
@ -123,13 +123,13 @@ TEST_F(MslGeneratorImplTest, Intrinsic_Call) {
ast::ExpressionList params; ast::ExpressionList params;
params.push_back(create<ast::IdentifierExpression>( params.push_back(create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("param1"), "param1")); Source{}, mod->RegisterSymbol("param1"), "param1"));
params.push_back(create<ast::IdentifierExpression>( params.push_back(create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("param2"), "param2")); Source{}, mod->RegisterSymbol("param2"), "param2"));
ast::CallExpression call(Source{}, ast::CallExpression call(Source{},
create<ast::IdentifierExpression>( create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("dot"), "dot"), Source{}, mod->RegisterSymbol("dot"), "dot"),
params); params);
ast::Variable v1(Source{}, "param1", ast::StorageClass::kFunction, &vec, ast::Variable v1(Source{}, "param1", ast::StorageClass::kFunction, &vec,

View File

@ -97,9 +97,9 @@ TEST_F(MslGeneratorImplTest, Emit_LoopNestedWithContinuing) {
}); });
auto* lhs = create<ast::IdentifierExpression>( auto* lhs = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("lhs"), "lhs"); Source{}, mod->RegisterSymbol("lhs"), "lhs");
auto* rhs = create<ast::IdentifierExpression>( auto* rhs = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("rhs"), "rhs"); Source{}, mod->RegisterSymbol("rhs"), "rhs");
continuing = create<ast::BlockStatement>( continuing = create<ast::BlockStatement>(
Source{}, ast::StatementList{ Source{}, ast::StatementList{
@ -186,9 +186,9 @@ TEST_F(MslGeneratorImplTest, Emit_LoopWithVarUsedInContinuing) {
}); });
auto* lhs = create<ast::IdentifierExpression>( auto* lhs = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("lhs"), "lhs"); Source{}, mod->RegisterSymbol("lhs"), "lhs");
auto* rhs = create<ast::IdentifierExpression>( auto* rhs = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("rhs"), "rhs"); Source{}, mod->RegisterSymbol("rhs"), "rhs");
auto* continuing = create<ast::BlockStatement>( auto* continuing = create<ast::BlockStatement>(
Source{}, ast::StatementList{ Source{}, ast::StatementList{

View File

@ -30,9 +30,9 @@ using MslGeneratorImplTest = TestHelper;
TEST_F(MslGeneratorImplTest, EmitExpression_MemberAccessor) { TEST_F(MslGeneratorImplTest, EmitExpression_MemberAccessor) {
auto* str = create<ast::IdentifierExpression>( auto* str = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("str"), "str"); Source{}, mod->RegisterSymbol("str"), "str");
auto* mem = create<ast::IdentifierExpression>( auto* mem = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("mem"), "mem"); Source{}, mod->RegisterSymbol("mem"), "mem");
ast::MemberAccessorExpression expr(Source{}, str, mem); ast::MemberAccessorExpression expr(Source{}, str, mem);

View File

@ -40,7 +40,7 @@ TEST_F(MslGeneratorImplTest, Emit_Return) {
TEST_F(MslGeneratorImplTest, Emit_ReturnWithValue) { TEST_F(MslGeneratorImplTest, Emit_ReturnWithValue) {
auto* expr = create<ast::IdentifierExpression>( auto* expr = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("expr"), "expr"); Source{}, mod->RegisterSymbol("expr"), "expr");
ast::ReturnStatement r(Source{}, expr); ast::ReturnStatement r(Source{}, expr);
gen.increment_indent(); gen.increment_indent();

View File

@ -56,7 +56,7 @@ TEST_F(MslGeneratorImplTest, Emit_Switch) {
body.push_back(def); body.push_back(def);
auto* cond = create<ast::IdentifierExpression>( auto* cond = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("cond"), "cond"); Source{}, mod->RegisterSymbol("cond"), "cond");
ast::SwitchStatement s(Source{}, cond, body); ast::SwitchStatement s(Source{}, cond, body);
gen.increment_indent(); gen.increment_indent();

View File

@ -51,12 +51,12 @@ TEST_F(MslGeneratorImplTest, Generate) {
ast::type::Void void_type; ast::type::Void void_type;
auto* func = create<ast::Function>( auto* func = create<ast::Function>(
Source{}, mod.RegisterSymbol("my_func"), "my_func", ast::VariableList{}, Source{}, mod->RegisterSymbol("my_func"), "my_func", ast::VariableList{},
&void_type, create<ast::BlockStatement>(Source{}, ast::StatementList{}), &void_type, create<ast::BlockStatement>(Source{}, ast::StatementList{}),
ast::FunctionDecorationList{ ast::FunctionDecorationList{
create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute), create<ast::StageDecoration>(Source{}, ast::PipelineStage::kCompute),
}); });
mod.AddFunction(func); mod->AddFunction(func);
ASSERT_TRUE(gen.Generate()) << gen.error(); ASSERT_TRUE(gen.Generate()) << gen.error();
EXPECT_EQ(gen.result(), R"(#include <metal_stdlib> EXPECT_EQ(gen.result(), R"(#include <metal_stdlib>
@ -79,7 +79,7 @@ TEST_F(MslGeneratorImplTest, InputStructName_ConflictWithExisting) {
TEST_F(MslGeneratorImplTest, NameConflictWith_InputStructName) { TEST_F(MslGeneratorImplTest, NameConflictWith_InputStructName) {
ASSERT_EQ(gen.generate_name("func_main_in"), "func_main_in"); ASSERT_EQ(gen.generate_name("func_main_in"), "func_main_in");
ast::IdentifierExpression ident(Source{}, mod.RegisterSymbol("func_main_in"), ast::IdentifierExpression ident(Source{}, mod->RegisterSymbol("func_main_in"),
"func_main_in"); "func_main_in");
ASSERT_TRUE(gen.EmitIdentifier(&ident)); ASSERT_TRUE(gen.EmitIdentifier(&ident));
EXPECT_EQ(gen.result(), "func_main_in_0"); EXPECT_EQ(gen.result(), "func_main_in_0");
@ -118,7 +118,7 @@ INSTANTIATE_TEST_SUITE_P(
TEST_F(MslGeneratorImplTest, calculate_alignment_size_alias) { TEST_F(MslGeneratorImplTest, calculate_alignment_size_alias) {
ast::type::F32 f32; ast::type::F32 f32;
ast::type::Alias alias(mod.RegisterSymbol("a"), "a", &f32); ast::type::Alias alias(mod->RegisterSymbol("a"), "a", &f32);
EXPECT_EQ(4u, gen.calculate_alignment_size(&alias)); EXPECT_EQ(4u, gen.calculate_alignment_size(&alias));
} }
@ -156,73 +156,33 @@ TEST_F(MslGeneratorImplTest, calculate_alignment_size_pointer) {
} }
TEST_F(MslGeneratorImplTest, calculate_alignment_size_struct) { TEST_F(MslGeneratorImplTest, calculate_alignment_size_struct) {
ast::type::I32 i32; auto* str = create<ast::Struct>(
ast::type::F32 f32; ast::StructMemberList{Member("a", ty.i32, {MemberOffset(4)}),
Member("b", ty.f32, {MemberOffset(32)}),
Member("c", ty.f32, {MemberOffset(128)})},
ast::StructDecorationList{});
ast::StructMemberDecorationList decos; ast::type::Struct s(mod->RegisterSymbol("S"), "S", str);
decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
ast::StructMemberList members;
members.push_back(create<ast::StructMember>(Source{}, mod.RegisterSymbol("a"),
"a", &i32, decos));
decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 32));
members.push_back(create<ast::StructMember>(Source{}, mod.RegisterSymbol("b"),
"b", &f32, decos));
decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 128));
members.push_back(create<ast::StructMember>(Source{}, mod.RegisterSymbol("c"),
"c", &f32, decos));
auto* str =
create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
ast::type::Struct s(mod.RegisterSymbol("S"), "S", str);
EXPECT_EQ(132u, gen.calculate_alignment_size(&s)); EXPECT_EQ(132u, gen.calculate_alignment_size(&s));
} }
TEST_F(MslGeneratorImplTest, calculate_alignment_size_struct_of_struct) { TEST_F(MslGeneratorImplTest, calculate_alignment_size_struct_of_struct) {
ast::type::I32 i32; auto* inner_str = create<ast::Struct>(
ast::type::F32 f32; ast::StructMemberList{Member("a", ty.i32, {MemberOffset(0)}),
ast::type::Vector fvec(&f32, 3); Member("b", ty.vec3<f32>(), {MemberOffset(16)}),
Member("c", ty.f32, {MemberOffset(32)})},
ast::StructDecorationList{});
ast::StructMemberDecorationList decos; ast::type::Struct inner_s(mod->RegisterSymbol("Inner"), "Inner", inner_str);
decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
ast::StructMemberList members; auto* outer_str = create<ast::Struct>(
members.push_back(create<ast::StructMember>(Source{}, mod.RegisterSymbol("a"), ast::StructMemberList{Member("d", ty.f32, {MemberOffset(0)}),
"a", &i32, decos)); Member("e", &inner_s, {MemberOffset(32)}),
Member("f", ty.f32, {MemberOffset(64)})},
ast::StructDecorationList{});
decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 16)); ast::type::Struct outer_s(mod->RegisterSymbol("Outer"), "Outer", outer_str);
members.push_back(create<ast::StructMember>(Source{}, mod.RegisterSymbol("b"),
"b", &fvec, decos));
decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 32));
members.push_back(create<ast::StructMember>(Source{}, mod.RegisterSymbol("c"),
"c", &f32, decos));
auto* inner_str =
create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
ast::type::Struct inner_s(mod.RegisterSymbol("Inner"), "Inner", inner_str);
decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
members.push_back(create<ast::StructMember>(Source{}, mod.RegisterSymbol("d"),
"d", &f32, decos));
decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 32));
members.push_back(create<ast::StructMember>(Source{}, mod.RegisterSymbol("e"),
"e", &inner_s, decos));
decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 64));
members.push_back(create<ast::StructMember>(Source{}, mod.RegisterSymbol("f"),
"f", &f32, decos));
auto* outer_str =
create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
ast::type::Struct outer_s(mod.RegisterSymbol("Outer"), "Outer", outer_str);
EXPECT_EQ(80u, gen.calculate_alignment_size(&outer_s)); EXPECT_EQ(80u, gen.calculate_alignment_size(&outer_s));
} }

View File

@ -48,7 +48,7 @@ using MslGeneratorImplTest = TestHelper;
TEST_F(MslGeneratorImplTest, EmitType_Alias) { TEST_F(MslGeneratorImplTest, EmitType_Alias) {
ast::type::F32 f32; ast::type::F32 f32;
ast::type::Alias alias(mod.RegisterSymbol("alias"), "alias", &f32); ast::type::Alias alias(mod->RegisterSymbol("alias"), "alias", &f32);
ASSERT_TRUE(gen.EmitType(&alias, "")) << gen.error(); ASSERT_TRUE(gen.EmitType(&alias, "")) << gen.error();
EXPECT_EQ(gen.result(), "alias"); EXPECT_EQ(gen.result(), "alias");
@ -56,7 +56,7 @@ TEST_F(MslGeneratorImplTest, EmitType_Alias) {
TEST_F(MslGeneratorImplTest, EmitType_Alias_NameCollision) { TEST_F(MslGeneratorImplTest, EmitType_Alias_NameCollision) {
ast::type::F32 f32; ast::type::F32 f32;
ast::type::Alias alias(mod.RegisterSymbol("bool"), "bool", &f32); ast::type::Alias alias(mod->RegisterSymbol("bool"), "bool", &f32);
ASSERT_TRUE(gen.EmitType(&alias, "")) << gen.error(); ASSERT_TRUE(gen.EmitType(&alias, "")) << gen.error();
EXPECT_EQ(gen.result(), "bool_tint_0"); EXPECT_EQ(gen.result(), "bool_tint_0");
@ -171,46 +171,24 @@ TEST_F(MslGeneratorImplTest, DISABLED_EmitType_Pointer) {
} }
TEST_F(MslGeneratorImplTest, EmitType_Struct) { TEST_F(MslGeneratorImplTest, EmitType_Struct) {
ast::type::I32 i32; auto* str = create<ast::Struct>(
ast::type::F32 f32; ast::StructMemberList{Member("a", ty.i32),
Member("b", ty.f32, {MemberOffset(4)})},
ast::StructDecorationList{});
ast::StructMemberList members; ast::type::Struct s(mod->RegisterSymbol("S"), "S", str);
members.push_back(
create<ast::StructMember>(Source{}, mod.RegisterSymbol("a"), "a", &i32,
ast::StructMemberDecorationList{}));
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
members.push_back(create<ast::StructMember>(Source{}, mod.RegisterSymbol("b"),
"b", &f32, b_deco));
auto* str =
create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
ast::type::Struct s(mod.RegisterSymbol("S"), "S", str);
ASSERT_TRUE(gen.EmitType(&s, "")) << gen.error(); ASSERT_TRUE(gen.EmitType(&s, "")) << gen.error();
EXPECT_EQ(gen.result(), "S"); EXPECT_EQ(gen.result(), "S");
} }
TEST_F(MslGeneratorImplTest, EmitType_StructDecl) { TEST_F(MslGeneratorImplTest, EmitType_StructDecl) {
ast::type::I32 i32; auto* str = create<ast::Struct>(
ast::type::F32 f32; ast::StructMemberList{Member("a", ty.i32),
Member("b", ty.f32, {MemberOffset(4)})},
ast::StructDecorationList{});
ast::StructMemberList members; ast::type::Struct s(mod->RegisterSymbol("S"), "S", str);
members.push_back(
create<ast::StructMember>(Source{}, mod.RegisterSymbol("a"), "a", &i32,
ast::StructMemberDecorationList{}));
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
members.push_back(create<ast::StructMember>(Source{}, mod.RegisterSymbol("b"),
"b", &f32, b_deco));
auto* str =
create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
ast::type::Struct s(mod.RegisterSymbol("S"), "S", str);
ASSERT_TRUE(gen.EmitStructType(&s)) << gen.error(); ASSERT_TRUE(gen.EmitStructType(&s)) << gen.error();
EXPECT_EQ(gen.result(), R"(struct S { EXPECT_EQ(gen.result(), R"(struct S {
@ -221,28 +199,15 @@ TEST_F(MslGeneratorImplTest, EmitType_StructDecl) {
} }
TEST_F(MslGeneratorImplTest, EmitType_Struct_InjectPadding) { TEST_F(MslGeneratorImplTest, EmitType_Struct_InjectPadding) {
ast::type::I32 i32;
ast::type::F32 f32;
auto* str = create<ast::Struct>( auto* str = create<ast::Struct>(
Source{},
ast::StructMemberList{ ast::StructMemberList{
create<ast::StructMember>( Member("a", ty.i32, {MemberOffset(4)}),
Source{}, mod.RegisterSymbol("a"), "a", &i32, Member("b", ty.f32, {MemberOffset(32)}),
ast::StructMemberDecorationList{ Member("c", ty.f32, {MemberOffset(128)}),
create<ast::StructMemberOffsetDecoration>(Source{}, 4)}),
create<ast::StructMember>(
Source{}, mod.RegisterSymbol("b"), "b", &f32,
ast::StructMemberDecorationList{
create<ast::StructMemberOffsetDecoration>(Source{}, 32)}),
create<ast::StructMember>(
Source{}, mod.RegisterSymbol("c"), "c", &f32,
ast::StructMemberDecorationList{
create<ast::StructMemberOffsetDecoration>(Source{}, 128)}),
}, },
ast::StructDecorationList{}); ast::StructDecorationList{});
ast::type::Struct s(mod.RegisterSymbol("S"), "S", str); ast::type::Struct s(mod->RegisterSymbol("S"), "S", str);
ASSERT_TRUE(gen.EmitStructType(&s)) << gen.error(); ASSERT_TRUE(gen.EmitStructType(&s)) << gen.error();
EXPECT_EQ(gen.result(), R"(struct S { EXPECT_EQ(gen.result(), R"(struct S {
@ -257,22 +222,11 @@ TEST_F(MslGeneratorImplTest, EmitType_Struct_InjectPadding) {
} }
TEST_F(MslGeneratorImplTest, EmitType_Struct_NameCollision) { TEST_F(MslGeneratorImplTest, EmitType_Struct_NameCollision) {
ast::type::I32 i32; auto* str = create<ast::Struct>(
ast::type::F32 f32; ast::StructMemberList{Member("main", ty.i32), Member("float", ty.f32)},
ast::StructDecorationList{});
ast::StructMemberList members; ast::type::Struct s(mod->RegisterSymbol("S"), "S", str);
members.push_back(
create<ast::StructMember>(Source{}, mod.RegisterSymbol("main"), "main",
&i32, ast::StructMemberDecorationList{}));
ast::StructMemberDecorationList b_deco;
members.push_back(create<ast::StructMember>(
Source{}, mod.RegisterSymbol("float"), "float", &f32, b_deco));
auto* str =
create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
ast::type::Struct s(mod.RegisterSymbol("S"), "S", str);
ASSERT_TRUE(gen.EmitStructType(&s)) << gen.error(); ASSERT_TRUE(gen.EmitStructType(&s)) << gen.error();
EXPECT_EQ(gen.result(), R"(struct S { EXPECT_EQ(gen.result(), R"(struct S {
@ -284,24 +238,14 @@ TEST_F(MslGeneratorImplTest, EmitType_Struct_NameCollision) {
// TODO(dsinclair): How to translate [[block]] // TODO(dsinclair): How to translate [[block]]
TEST_F(MslGeneratorImplTest, DISABLED_EmitType_Struct_WithDecoration) { TEST_F(MslGeneratorImplTest, DISABLED_EmitType_Struct_WithDecoration) {
ast::type::I32 i32;
ast::type::F32 f32;
ast::StructMemberList members;
members.push_back(
create<ast::StructMember>(Source{}, mod.RegisterSymbol("a"), "a", &i32,
ast::StructMemberDecorationList{}));
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
members.push_back(create<ast::StructMember>(Source{}, mod.RegisterSymbol("b"),
"b", &f32, b_deco));
ast::StructDecorationList decos; ast::StructDecorationList decos;
decos.push_back(create<ast::StructBlockDecoration>(Source{})); decos.push_back(create<ast::StructBlockDecoration>(Source{}));
auto* str = create<ast::Struct>(Source{}, members, decos); auto* str = create<ast::Struct>(
ast::StructMemberList{Member("a", ty.i32),
Member("b", ty.f32, {MemberOffset(4)})},
decos);
ast::type::Struct s(mod.RegisterSymbol("S"), "S", str); ast::type::Struct s(mod->RegisterSymbol("S"), "S", str);
ASSERT_TRUE(gen.EmitType(&s, "")) << gen.error(); ASSERT_TRUE(gen.EmitType(&s, "")) << gen.error();
EXPECT_EQ(gen.result(), R"(struct { EXPECT_EQ(gen.result(), R"(struct {

View File

@ -40,7 +40,7 @@ TEST_P(MslUnaryOpTest, Emit) {
auto params = GetParam(); auto params = GetParam();
auto* expr = create<ast::IdentifierExpression>( auto* expr = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("expr"), "expr"); Source{}, mod->RegisterSymbol("expr"), "expr");
ast::UnaryOpExpression op(Source{}, params.op, expr); ast::UnaryOpExpression op(Source{}, params.op, expr);
ASSERT_TRUE(gen.EmitExpression(&op)) << gen.error(); ASSERT_TRUE(gen.EmitExpression(&op)) << gen.error();

View File

@ -100,22 +100,12 @@ TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Array) {
} }
TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Struct) { TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Struct) {
ast::type::F32 f32; auto* str = create<ast::Struct>(
ast::StructMemberList{Member("a", ty.f32),
Member("b", ty.f32, {MemberOffset(4)})},
ast::StructDecorationList{});
ast::StructMemberList members; ast::type::Struct s(mod->RegisterSymbol("S"), "S", str);
members.push_back(
create<ast::StructMember>(Source{}, mod.RegisterSymbol("a"), "a", &f32,
ast::StructMemberDecorationList{}));
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 4));
members.push_back(create<ast::StructMember>(Source{}, mod.RegisterSymbol("b"),
"b", &f32, b_deco));
auto* str =
create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
ast::type::Struct s(mod.RegisterSymbol("S"), "S", str);
auto* var = auto* var =
create<ast::Variable>(Source{}, // source create<ast::Variable>(Source{}, // source
@ -197,7 +187,7 @@ TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Private) {
TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Initializer_Private) { TEST_F(MslGeneratorImplTest, Emit_VariableDeclStatement_Initializer_Private) {
auto* ident = create<ast::IdentifierExpression>( auto* ident = create<ast::IdentifierExpression>(
Source{}, mod.RegisterSymbol("initializer"), "initializer"); Source{}, mod->RegisterSymbol("initializer"), "initializer");
ast::type::F32 f32; ast::type::F32 f32;
auto* var = auto* var =

View File

@ -19,6 +19,7 @@
#include <utility> #include <utility>
#include "gtest/gtest.h" #include "gtest/gtest.h"
#include "src/ast/builder.h"
#include "src/ast/module.h" #include "src/ast/module.h"
#include "src/type_determiner.h" #include "src/type_determiner.h"
#include "src/writer/msl/generator_impl.h" #include "src/writer/msl/generator_impl.h"
@ -29,22 +30,11 @@ namespace msl {
/// Helper class for testing /// Helper class for testing
template <typename BASE> template <typename BASE>
class TestHelperBase : public BASE { class TestHelperBase : public BASE, public ast::BuilderWithModule {
public: public:
TestHelperBase() : td(&mod), gen(&mod) {} TestHelperBase() : td(mod), gen(mod) {}
~TestHelperBase() = default; ~TestHelperBase() = default;
/// Creates a new `ast::Node` owned by the Module. When the Module is
/// destructed, the `ast::Node` will also be destructed.
/// @param args the arguments to pass to the type constructor
/// @returns the node pointer
template <typename T, typename... ARGS>
T* create(ARGS&&... args) {
return mod.create<T>(std::forward<ARGS>(args)...);
}
/// The module
ast::Module mod;
/// The type determiner /// The type determiner
TypeDeterminer td; TypeDeterminer td;
/// The generator /// The generator

View File

@ -243,14 +243,10 @@ TEST_F(BuilderTest, MemberAccessor) {
// var ident : my_struct // var ident : my_struct
// ident.b // ident.b
ast::StructMemberDecorationList decos; auto* s = create<ast::Struct>(
ast::StructMemberList members; ast::StructMemberList{Member("a", ty.f32), Member("b", ty.f32)},
members.push_back( ast::StructDecorationList{});
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.f32, decos));
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("b"), "b", ty.f32, decos));
auto* s = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s_type(mod->RegisterSymbol("my_struct"), "my_struct", s); ast::type::Struct s_type(mod->RegisterSymbol("my_struct"), "my_struct", s);
auto* var = Var("ident", ast::StorageClass::kFunction, &s_type); auto* var = Var("ident", ast::StorageClass::kFunction, &s_type);
@ -291,24 +287,16 @@ TEST_F(BuilderTest, MemberAccessor_Nested) {
// //
// var ident : my_struct // var ident : my_struct
// ident.inner.a // ident.inner.a
ast::StructMemberDecorationList decos;
ast::StructMemberList inner_members;
inner_members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.f32, decos));
inner_members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("b"), "b", ty.f32, decos));
ast::type::Struct inner_struct( ast::type::Struct inner_struct(
mod->RegisterSymbol("Inner"), "Inner", mod->RegisterSymbol("Inner"), "Inner",
create<ast::Struct>(inner_members, ast::StructDecorationList{})); create<ast::Struct>(
ast::StructMemberList{Member("a", ty.f32), Member("b", ty.f32)},
ast::StructMemberList outer_members; ast::StructDecorationList{}));
outer_members.push_back(create<ast::StructMember>(
mod->RegisterSymbol("inner"), "inner", &inner_struct, decos));
ast::type::Struct s_type( ast::type::Struct s_type(
mod->RegisterSymbol("my_struct"), "my_struct", mod->RegisterSymbol("my_struct"), "my_struct",
create<ast::Struct>(outer_members, ast::StructDecorationList{})); create<ast::Struct>(ast::StructMemberList{Member("inner", &inner_struct)},
ast::StructDecorationList{}));
auto* var = Var("ident", ast::StorageClass::kFunction, &s_type); auto* var = Var("ident", ast::StorageClass::kFunction, &s_type);
@ -350,26 +338,18 @@ TEST_F(BuilderTest, MemberAccessor_Nested_WithAlias) {
// //
// var ident : my_struct // var ident : my_struct
// ident.inner.a // ident.inner.a
ast::StructMemberDecorationList decos;
ast::StructMemberList inner_members;
inner_members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.f32, decos));
inner_members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("b"), "b", ty.f32, decos));
ast::type::Struct inner_struct( ast::type::Struct inner_struct(
mod->RegisterSymbol("Inner"), "Inner", mod->RegisterSymbol("Inner"), "Inner",
create<ast::Struct>(inner_members, ast::StructDecorationList{})); create<ast::Struct>(
ast::StructMemberList{Member("a", ty.f32), Member("b", ty.f32)},
ast::StructDecorationList{}));
ast::type::Alias alias(mod->RegisterSymbol("Inner"), "Inner", &inner_struct); ast::type::Alias alias(mod->RegisterSymbol("Inner"), "Inner", &inner_struct);
ast::StructMemberList outer_members;
outer_members.push_back(create<ast::StructMember>(
mod->RegisterSymbol("inner"), "inner", &alias, decos));
ast::type::Struct s_type( ast::type::Struct s_type(
mod->RegisterSymbol("Outer"), "Outer", mod->RegisterSymbol("Outer"), "Outer",
create<ast::Struct>(outer_members, ast::StructDecorationList{})); create<ast::Struct>(ast::StructMemberList{Member("inner", &alias)},
ast::StructDecorationList{}));
auto* var = Var("ident", ast::StorageClass::kFunction, &s_type); auto* var = Var("ident", ast::StorageClass::kFunction, &s_type);
@ -410,25 +390,16 @@ TEST_F(BuilderTest, MemberAccessor_Nested_Assignment_LHS) {
// //
// var ident : my_struct // var ident : my_struct
// ident.inner.a = 2.0f; // ident.inner.a = 2.0f;
ast::StructMemberDecorationList decos;
ast::StructMemberList inner_members;
inner_members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.f32, decos));
inner_members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("b"), "b", ty.f32, decos));
ast::type::Struct inner_struct( ast::type::Struct inner_struct(
mod->RegisterSymbol("Inner"), "Inner", mod->RegisterSymbol("Inner"), "Inner",
create<ast::Struct>(inner_members, ast::StructDecorationList{})); create<ast::Struct>(
ast::StructMemberList{Member("a", ty.f32), Member("b", ty.f32)},
ast::StructMemberList outer_members; ast::StructDecorationList{}));
outer_members.push_back(create<ast::StructMember>(
mod->RegisterSymbol("inner"), "inner", &inner_struct, decos));
ast::type::Struct s_type( ast::type::Struct s_type(
mod->RegisterSymbol("my_struct"), "my_struct", mod->RegisterSymbol("my_struct"), "my_struct",
create<ast::Struct>(outer_members, ast::StructDecorationList{})); create<ast::Struct>(ast::StructMemberList{Member("inner", &inner_struct)},
ast::StructDecorationList{}));
auto* var = Var("ident", ast::StorageClass::kFunction, &s_type); auto* var = Var("ident", ast::StorageClass::kFunction, &s_type);
@ -476,24 +447,16 @@ TEST_F(BuilderTest, MemberAccessor_Nested_Assignment_RHS) {
// var ident : my_struct // var ident : my_struct
// var store : f32 = ident.inner.a // var store : f32 = ident.inner.a
ast::StructMemberDecorationList decos;
ast::StructMemberList inner_members;
inner_members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.f32, decos));
inner_members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("b"), "b", ty.f32, decos));
ast::type::Struct inner_struct( ast::type::Struct inner_struct(
mod->RegisterSymbol("Inner"), "Inner", mod->RegisterSymbol("Inner"), "Inner",
create<ast::Struct>(inner_members, ast::StructDecorationList{})); create<ast::Struct>(
ast::StructMemberList{Member("a", ty.f32), Member("b", ty.f32)},
ast::StructMemberList outer_members; ast::StructDecorationList{}));
outer_members.push_back(create<ast::StructMember>(
mod->RegisterSymbol("inner"), "inner", &inner_struct, decos));
ast::type::Struct s_type( ast::type::Struct s_type(
mod->RegisterSymbol("my_struct"), "my_struct", mod->RegisterSymbol("my_struct"), "my_struct",
create<ast::Struct>(outer_members, ast::StructDecorationList{})); create<ast::Struct>(ast::StructMemberList{Member("inner", &inner_struct)},
ast::StructDecorationList{}));
auto* var = Var("ident", ast::StorageClass::kFunction, &s_type); auto* var = Var("ident", ast::StorageClass::kFunction, &s_type);
auto* store = Var("store", ast::StorageClass::kFunction, ty.f32); auto* store = Var("store", ast::StorageClass::kFunction, ty.f32);
@ -701,26 +664,19 @@ TEST_F(BuilderTest, Accessor_Mixed_ArrayAndMember) {
// var index : array<A, 2> // var index : array<A, 2>
// index[0].foo[2].bar.baz.yx // index[0].foo[2].bar.baz.yx
ast::StructMemberDecorationList decos; auto* s =
create<ast::Struct>(ast::StructMemberList{Member("baz", ty.vec3<f32>())},
auto* s = create<ast::Struct>( ast::StructDecorationList{});
ast::StructMemberList{create<ast::StructMember>(
mod->RegisterSymbol("baz"), "baz", ty.vec3<f32>(), decos)},
ast::StructDecorationList{});
ast::type::Struct c_type(mod->RegisterSymbol("C"), "C", s); ast::type::Struct c_type(mod->RegisterSymbol("C"), "C", s);
s = create<ast::Struct>( s = create<ast::Struct>(ast::StructMemberList{Member("bar", &c_type)},
ast::StructMemberList{create<ast::StructMember>( ast::StructDecorationList{});
mod->RegisterSymbol("bar"), "bar", &c_type, decos)},
ast::StructDecorationList{});
ast::type::Struct b_type(mod->RegisterSymbol("B"), "B", s); ast::type::Struct b_type(mod->RegisterSymbol("B"), "B", s);
ast::type::Array b_ary_type(&b_type, 3, ast::ArrayDecorationList{}); ast::type::Array b_ary_type(&b_type, 3, ast::ArrayDecorationList{});
s = create<ast::Struct>( s = create<ast::Struct>(ast::StructMemberList{Member("foo", &b_ary_type)},
ast::StructMemberList{create<ast::StructMember>( ast::StructDecorationList{});
mod->RegisterSymbol("foo"), "foo", &b_ary_type, decos)},
ast::StructDecorationList{});
ast::type::Struct a_type(mod->RegisterSymbol("A"), "A", s); ast::type::Struct a_type(mod->RegisterSymbol("A"), "A", s);
ast::type::Array a_ary_type(&a_type, 2, ast::ArrayDecorationList{}); ast::type::Array a_ary_type(&a_type, 2, ast::ArrayDecorationList{});

View File

@ -247,8 +247,6 @@ TEST_F(BuilderTest, Assign_Var_Complex_Constructor) {
} }
TEST_F(BuilderTest, Assign_StructMember) { TEST_F(BuilderTest, Assign_StructMember) {
ast::type::F32 f32;
// my_struct { // my_struct {
// a : f32 // a : f32
// b : f32 // b : f32
@ -256,14 +254,10 @@ TEST_F(BuilderTest, Assign_StructMember) {
// var ident : my_struct // var ident : my_struct
// ident.b = 4.0; // ident.b = 4.0;
ast::StructMemberDecorationList decos; auto* s = create<ast::Struct>(
ast::StructMemberList members; ast::StructMemberList{Member("a", ty.f32), Member("b", ty.f32)},
members.push_back(create<ast::StructMember>( ast::StructDecorationList{});
Source{}, mod->RegisterSymbol("a"), "a", &f32, decos));
members.push_back(create<ast::StructMember>(
Source{}, mod->RegisterSymbol("b"), "b", &f32, decos));
auto* s = create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
ast::type::Struct s_type(mod->RegisterSymbol("my_struct"), "my_struct", s); ast::type::Struct s_type(mod->RegisterSymbol("my_struct"), "my_struct", s);
ast::Variable v(Source{}, "ident", ast::StorageClass::kFunction, &s_type, ast::Variable v(Source{}, "ident", ast::StorageClass::kFunction, &s_type,
@ -277,7 +271,7 @@ TEST_F(BuilderTest, Assign_StructMember) {
"b")); "b"));
auto* val = create<ast::ScalarConstructorExpression>( auto* val = create<ast::ScalarConstructorExpression>(
Source{}, create<ast::FloatLiteral>(Source{}, &f32, 4.0f)); Source{}, create<ast::FloatLiteral>(Source{}, ty.f32, 4.0f));
ast::AssignmentStatement assign(Source{}, ident, val); ast::AssignmentStatement assign(Source{}, ident, val);

View File

@ -953,14 +953,10 @@ TEST_F(SpvBuilderConstructorTest, Type_Array_2_Vec3) {
} }
TEST_F(SpvBuilderConstructorTest, Type_Struct) { TEST_F(SpvBuilderConstructorTest, Type_Struct) {
ast::StructMemberDecorationList decos;
auto* s = create<ast::Struct>( auto* s = create<ast::Struct>(
Source{},
ast::StructMemberList{ ast::StructMemberList{
create<ast::StructMember>(Source{}, mod->RegisterSymbol("a"), "a", Member("a", ty.f32),
ty.f32, decos), Member("b", ty.vec3<f32>()),
create<ast::StructMember>(Source{}, mod->RegisterSymbol("b"), "b",
ty.vec3<f32>(), decos),
}, },
ast::StructDecorationList{}); ast::StructDecorationList{});
ast::type::Struct s_type(mod->RegisterSymbol("my_struct"), "my_struct", s); ast::type::Struct s_type(mod->RegisterSymbol("my_struct"), "my_struct", s);
@ -1095,12 +1091,9 @@ TEST_F(SpvBuilderConstructorTest, Type_ZeroInit_Array) {
} }
TEST_F(SpvBuilderConstructorTest, Type_ZeroInit_Struct) { TEST_F(SpvBuilderConstructorTest, Type_ZeroInit_Struct) {
ast::StructMemberDecorationList decos;
auto* s = create<ast::Struct>( auto* s = create<ast::Struct>(
Source{},
ast::StructMemberList{ ast::StructMemberList{
create<ast::StructMember>(Source{}, mod->RegisterSymbol("a"), "a", Member("a", ty.f32),
ty.f32, decos),
}, },
ast::StructDecorationList{}); ast::StructDecorationList{});
ast::type::Struct s_type(mod->RegisterSymbol("my_struct"), "my_struct", s); ast::type::Struct s_type(mod->RegisterSymbol("my_struct"), "my_struct", s);
@ -1511,14 +1504,10 @@ TEST_F(SpvBuilderConstructorTest, IsConstructorConst_BitCastScalars) {
} }
TEST_F(SpvBuilderConstructorTest, IsConstructorConst_Struct) { TEST_F(SpvBuilderConstructorTest, IsConstructorConst_Struct) {
ast::StructMemberDecorationList decos;
auto* s = create<ast::Struct>( auto* s = create<ast::Struct>(
Source{},
ast::StructMemberList{ ast::StructMemberList{
create<ast::StructMember>(Source{}, mod->RegisterSymbol("a"), "a", Member("a", ty.f32),
ty.f32, decos), Member("b", ty.vec3<f32>()),
create<ast::StructMember>(Source{}, mod->RegisterSymbol("b"), "b",
ty.vec3<f32>(), decos),
}, },
ast::StructDecorationList{}); ast::StructDecorationList{});
ast::type::Struct s_type(mod->RegisterSymbol("my_struct"), "my_struct", s); ast::type::Struct s_type(mod->RegisterSymbol("my_struct"), "my_struct", s);
@ -1533,14 +1522,10 @@ TEST_F(SpvBuilderConstructorTest, IsConstructorConst_Struct) {
TEST_F(SpvBuilderConstructorTest, TEST_F(SpvBuilderConstructorTest,
IsConstructorConst_Struct_WithIdentSubExpression) { IsConstructorConst_Struct_WithIdentSubExpression) {
ast::StructMemberDecorationList decos;
auto* s = create<ast::Struct>( auto* s = create<ast::Struct>(
Source{},
ast::StructMemberList{ ast::StructMemberList{
create<ast::StructMember>(Source{}, mod->RegisterSymbol("a"), "a", Member("a", ty.f32),
ty.f32, decos), Member("b", ty.vec3<f32>()),
create<ast::StructMember>(Source{}, mod->RegisterSymbol("b"), "b",
ty.vec3<f32>(), decos),
}, },
ast::StructDecorationList{}); ast::StructDecorationList{});

View File

@ -270,18 +270,12 @@ TEST_F(BuilderTest, Emit_Multiple_EntryPoint_With_Same_ModuleVar) {
// } // }
ast::type::Void void_type; ast::type::Void void_type;
ast::type::F32 f32;
ast::StructMemberList members;
ast::StructMemberDecorationList a_deco;
a_deco.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
members.push_back(create<ast::StructMember>(
Source{}, mod->RegisterSymbol("d"), "d", &f32, a_deco));
ast::StructDecorationList s_decos; ast::StructDecorationList s_decos;
s_decos.push_back(create<ast::StructBlockDecoration>(Source{})); s_decos.push_back(create<ast::StructBlockDecoration>(Source{}));
auto* str = create<ast::Struct>(Source{}, members, s_decos); auto* str = create<ast::Struct>(
ast::StructMemberList{Member("d", ty.f32, {MemberOffset(0)})}, s_decos);
ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str); ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s); ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s);
@ -310,7 +304,7 @@ TEST_F(BuilderTest, Emit_Multiple_EntryPoint_With_Same_ModuleVar) {
Source{}, // source Source{}, // source
"v", // name "v", // name
ast::StorageClass::kFunction, // storage_class ast::StorageClass::kFunction, // storage_class
&f32, // type ty.f32, // type
false, // is_const false, // is_const
create<ast::MemberAccessorExpression>( create<ast::MemberAccessorExpression>(
Source{}, Source{},
@ -342,7 +336,7 @@ TEST_F(BuilderTest, Emit_Multiple_EntryPoint_With_Same_ModuleVar) {
Source{}, // source Source{}, // source
"v", // name "v", // name
ast::StorageClass::kFunction, // storage_class ast::StorageClass::kFunction, // storage_class
&f32, // type ty.f32, // type
false, // is_const false, // is_const
create<ast::MemberAccessorExpression>( create<ast::MemberAccessorExpression>(
Source{}, Source{},

View File

@ -526,18 +526,11 @@ TEST_F(BuilderTest, GlobalVar_DeclReadOnly) {
// }; // };
// var b : [[access(read)]] A // var b : [[access(read)]] A
ast::type::I32 i32;
ast::StructMemberDecorationList decos;
ast::StructMemberList members;
members.push_back(create<ast::StructMember>(
Source{}, mod->RegisterSymbol("a"), "a", &i32, decos));
members.push_back(create<ast::StructMember>(
Source{}, mod->RegisterSymbol("b"), "b", &i32, decos));
ast::type::Struct A( ast::type::Struct A(
mod->RegisterSymbol("A"), "A", mod->RegisterSymbol("A"), "A",
create<ast::Struct>(Source{}, members, ast::StructDecorationList{})); create<ast::Struct>(
ast::StructMemberList{Member("a", ty.i32), Member("b", ty.i32)},
ast::StructDecorationList{}));
ast::type::AccessControl ac{ast::AccessControl::kReadOnly, &A}; ast::type::AccessControl ac{ast::AccessControl::kReadOnly, &A};
ast::Variable var(Source{}, "b", ast::StorageClass::kStorageBuffer, &ac, ast::Variable var(Source{}, "b", ast::StorageClass::kStorageBuffer, &ac,
@ -567,16 +560,10 @@ TEST_F(BuilderTest, GlobalVar_TypeAliasDeclReadOnly) {
// type B = A; // type B = A;
// var b : [[access(read)]] B // var b : [[access(read)]] B
ast::type::I32 i32;
ast::StructMemberDecorationList decos;
ast::StructMemberList members;
members.push_back(create<ast::StructMember>(
Source{}, mod->RegisterSymbol("a"), "a", &i32, decos));
ast::type::Struct A( ast::type::Struct A(
mod->RegisterSymbol("A"), "A", mod->RegisterSymbol("A"), "A",
create<ast::Struct>(Source{}, members, ast::StructDecorationList{})); create<ast::Struct>(ast::StructMemberList{Member("a", ty.i32)},
ast::StructDecorationList{}));
ast::type::Alias B(mod->RegisterSymbol("B"), "B", &A); ast::type::Alias B(mod->RegisterSymbol("B"), "B", &A);
ast::type::AccessControl ac{ast::AccessControl::kReadOnly, &B}; ast::type::AccessControl ac{ast::AccessControl::kReadOnly, &B};
@ -605,16 +592,10 @@ TEST_F(BuilderTest, GlobalVar_TypeAliasAssignReadOnly) {
// type B = [[access(read)]] A; // type B = [[access(read)]] A;
// var b : B // var b : B
ast::type::I32 i32;
ast::StructMemberDecorationList decos;
ast::StructMemberList members;
members.push_back(create<ast::StructMember>(
Source{}, mod->RegisterSymbol("a"), "a", &i32, decos));
ast::type::Struct A( ast::type::Struct A(
mod->RegisterSymbol("A"), "A", mod->RegisterSymbol("A"), "A",
create<ast::Struct>(Source{}, members, ast::StructDecorationList{})); create<ast::Struct>(ast::StructMemberList{Member("a", ty.i32)},
ast::StructDecorationList{}));
ast::type::AccessControl ac{ast::AccessControl::kReadOnly, &A}; ast::type::AccessControl ac{ast::AccessControl::kReadOnly, &A};
ast::type::Alias B(mod->RegisterSymbol("B"), "B", &ac); ast::type::Alias B(mod->RegisterSymbol("B"), "B", &ac);
@ -643,16 +624,10 @@ TEST_F(BuilderTest, GlobalVar_TwoVarDeclReadOnly) {
// var b : [[access(read)]] A // var b : [[access(read)]] A
// var c : [[access(read_write)]] A // var c : [[access(read_write)]] A
ast::type::I32 i32;
ast::StructMemberDecorationList decos;
ast::StructMemberList members;
members.push_back(create<ast::StructMember>(
Source{}, mod->RegisterSymbol("a"), "a", &i32, decos));
ast::type::Struct A( ast::type::Struct A(
mod->RegisterSymbol("A"), "A", mod->RegisterSymbol("A"), "A",
create<ast::Struct>(Source{}, members, ast::StructDecorationList{})); create<ast::Struct>(ast::StructMemberList{Member("a", ty.i32)},
ast::StructDecorationList{}));
ast::type::AccessControl read{ast::AccessControl::kReadOnly, &A}; ast::type::AccessControl read{ast::AccessControl::kReadOnly, &A};
ast::type::AccessControl rw{ast::AccessControl::kReadWrite, &A}; ast::type::AccessControl rw{ast::AccessControl::kReadWrite, &A};

View File

@ -1332,12 +1332,9 @@ OpFunctionEnd
} }
TEST_F(IntrinsicBuilderTest, Call_ArrayLength) { TEST_F(IntrinsicBuilderTest, Call_ArrayLength) {
ast::StructMemberDecorationList decos; auto* s =
ast::StructMemberList members; create<ast::Struct>(ast::StructMemberList{Member("a", ty.array<f32>())},
members.push_back(create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ast::StructDecorationList{});
ty.array<f32>(), decos));
auto* s = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s_type(mod->RegisterSymbol("my_struct"), "my_struct", s); ast::type::Struct s_type(mod->RegisterSymbol("my_struct"), "my_struct", s);
auto* var = Var("b", ast::StorageClass::kPrivate, &s_type); auto* var = Var("b", ast::StorageClass::kPrivate, &s_type);
@ -1374,14 +1371,10 @@ TEST_F(IntrinsicBuilderTest, Call_ArrayLength) {
} }
TEST_F(IntrinsicBuilderTest, Call_ArrayLength_OtherMembersInStruct) { TEST_F(IntrinsicBuilderTest, Call_ArrayLength_OtherMembersInStruct) {
ast::StructMemberDecorationList decos; auto* s = create<ast::Struct>(
ast::StructMemberList members; ast::StructMemberList{Member("z", ty.f32), Member("a", ty.array<f32>())},
members.push_back( ast::StructDecorationList{});
create<ast::StructMember>(mod->RegisterSymbol("z"), "z", ty.f32, decos));
members.push_back(create<ast::StructMember>(mod->RegisterSymbol("a"), "a",
ty.array<f32>(), decos));
auto* s = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s_type(mod->RegisterSymbol("my_struct"), "my_struct", s); ast::type::Struct s_type(mod->RegisterSymbol("my_struct"), "my_struct", s);
auto* var = Var("b", ast::StorageClass::kPrivate, &s_type); auto* var = Var("b", ast::StorageClass::kPrivate, &s_type);
@ -1420,14 +1413,11 @@ TEST_F(IntrinsicBuilderTest, Call_ArrayLength_OtherMembersInStruct) {
TEST_F(IntrinsicBuilderTest, DISABLED_Call_ArrayLength_Ptr) { TEST_F(IntrinsicBuilderTest, DISABLED_Call_ArrayLength_Ptr) {
ast::type::Pointer ptr(ty.array<f32>(), ast::StorageClass::kStorageBuffer); ast::type::Pointer ptr(ty.array<f32>(), ast::StorageClass::kStorageBuffer);
ast::StructMemberDecorationList decos; auto* s = create<ast::Struct>(
ast::StructMemberList members; ast::StructMemberList{Member("z", ty.f32), Member("a", ty.array<f32>())
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("z"), "z", ty.f32, decos));
members.push_back(create<ast::StructMember>(mod->RegisterSymbol("a"), "a",
ty.array<f32>(), decos));
auto* s = create<ast::Struct>(members, ast::StructDecorationList{}); },
ast::StructDecorationList{});
ast::type::Struct s_type(mod->RegisterSymbol("my_struct"), "my_struct", s); ast::type::Struct s_type(mod->RegisterSymbol("my_struct"), "my_struct", s);
auto* var = Var("b", ast::StorageClass::kPrivate, &s_type); auto* var = Var("b", ast::StorageClass::kPrivate, &s_type);

View File

@ -294,14 +294,8 @@ TEST_F(BuilderTest_Type, GenerateStruct_Empty) {
} }
TEST_F(BuilderTest_Type, GenerateStruct) { TEST_F(BuilderTest_Type, GenerateStruct) {
ast::type::F32 f32; auto* s = create<ast::Struct>(ast::StructMemberList{Member("a", ty.f32)},
ast::StructDecorationList{});
ast::StructMemberDecorationList decos;
ast::StructMemberList members;
members.push_back(create<ast::StructMember>(
Source{}, mod->RegisterSymbol("a"), "a", &f32, decos));
auto* s = create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
ast::type::Struct s_type(mod->RegisterSymbol("my_struct"), "my_struct", s); ast::type::Struct s_type(mod->RegisterSymbol("my_struct"), "my_struct", s);
auto id = b.GenerateTypeIfNeeded(&s_type); auto id = b.GenerateTypeIfNeeded(&s_type);
@ -317,17 +311,11 @@ OpMemberName %1 0 "a"
} }
TEST_F(BuilderTest_Type, GenerateStruct_Decorated) { TEST_F(BuilderTest_Type, GenerateStruct_Decorated) {
ast::type::F32 f32;
ast::StructMemberDecorationList decos;
ast::StructMemberList members;
members.push_back(create<ast::StructMember>(
Source{}, mod->RegisterSymbol("a"), "a", &f32, decos));
ast::StructDecorationList struct_decos; ast::StructDecorationList struct_decos;
struct_decos.push_back(create<ast::StructBlockDecoration>(Source{})); struct_decos.push_back(create<ast::StructBlockDecoration>(Source{}));
auto* s = create<ast::Struct>(Source{}, members, struct_decos); auto* s = create<ast::Struct>(ast::StructMemberList{Member("a", ty.f32)},
struct_decos);
ast::type::Struct s_type(mod->RegisterSymbol("my_struct"), "my_struct", s); ast::type::Struct s_type(mod->RegisterSymbol("my_struct"), "my_struct", s);
auto id = b.GenerateTypeIfNeeded(&s_type); auto id = b.GenerateTypeIfNeeded(&s_type);
@ -345,20 +333,10 @@ OpMemberName %1 0 "a"
} }
TEST_F(BuilderTest_Type, GenerateStruct_DecoratedMembers) { TEST_F(BuilderTest_Type, GenerateStruct_DecoratedMembers) {
ast::type::F32 f32; auto* s = create<ast::Struct>(
ast::StructMemberList{Member("a", ty.f32, {MemberOffset(0)}),
ast::StructMemberDecorationList a_decos; Member("b", ty.f32, {MemberOffset(8)})},
a_decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0)); ast::StructDecorationList{});
ast::StructMemberDecorationList b_decos;
b_decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 8));
ast::StructMemberList members;
members.push_back(create<ast::StructMember>(
Source{}, mod->RegisterSymbol("a"), "a", &f32, a_decos));
members.push_back(create<ast::StructMember>(
Source{}, mod->RegisterSymbol("b"), "b", &f32, b_decos));
auto* s = create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
ast::type::Struct s_type(mod->RegisterSymbol("S"), "S", s); ast::type::Struct s_type(mod->RegisterSymbol("S"), "S", s);
auto id = b.GenerateTypeIfNeeded(&s_type); auto id = b.GenerateTypeIfNeeded(&s_type);
@ -378,24 +356,11 @@ OpMemberDecorate %1 1 Offset 8
} }
TEST_F(BuilderTest_Type, GenerateStruct_NonLayout_Matrix) { TEST_F(BuilderTest_Type, GenerateStruct_NonLayout_Matrix) {
// Don't infer layout for matrix when there is no offset. auto* s =
ast::type::F32 f32; create<ast::Struct>(ast::StructMemberList{Member("a", ty.mat2x2<f32>()),
ast::type::Matrix glsl_mat2x2(&f32, 2, 2); Member("b", ty.mat2x3<f32>()),
ast::type::Matrix glsl_mat2x3(&f32, 3, 2); // 2 columns, 3 rows Member("c", ty.mat4x4<f32>())},
ast::type::Matrix glsl_mat4x4(&f32, 4, 4); ast::StructDecorationList{});
ast::StructMemberDecorationList empty_a;
ast::StructMemberDecorationList empty_b;
ast::StructMemberDecorationList empty_c;
ast::StructMemberList members;
members.push_back(create<ast::StructMember>(
Source{}, mod->RegisterSymbol("a"), "a", &glsl_mat2x2, empty_a));
members.push_back(create<ast::StructMember>(
Source{}, mod->RegisterSymbol("b"), "b", &glsl_mat2x3, empty_b));
members.push_back(create<ast::StructMember>(
Source{}, mod->RegisterSymbol("c"), "c", &glsl_mat4x4, empty_c));
auto* s = create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
ast::type::Struct s_type(mod->RegisterSymbol("S"), "S", s); ast::type::Struct s_type(mod->RegisterSymbol("S"), "S", s);
auto id = b.GenerateTypeIfNeeded(&s_type); auto id = b.GenerateTypeIfNeeded(&s_type);
@ -421,27 +386,11 @@ OpMemberName %1 2 "c"
TEST_F(BuilderTest_Type, GenerateStruct_DecoratedMembers_LayoutMatrix) { TEST_F(BuilderTest_Type, GenerateStruct_DecoratedMembers_LayoutMatrix) {
// We have to infer layout for matrix when it also has an offset. // We have to infer layout for matrix when it also has an offset.
ast::type::F32 f32; auto* s = create<ast::Struct>(
ast::type::Matrix glsl_mat2x2(&f32, 2, 2); ast::StructMemberList{Member("a", ty.mat2x2<f32>(), {MemberOffset(0)}),
ast::type::Matrix glsl_mat2x3(&f32, 3, 2); // 2 columns, 3 rows Member("b", ty.mat2x3<f32>(), {MemberOffset(16)}),
ast::type::Matrix glsl_mat4x4(&f32, 4, 4); Member("c", ty.mat4x4<f32>(), {MemberOffset(48)})},
ast::StructDecorationList{});
ast::StructMemberDecorationList a_decos;
a_decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0));
ast::StructMemberDecorationList b_decos;
b_decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 16));
ast::StructMemberDecorationList c_decos;
c_decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 48));
ast::StructMemberList members;
members.push_back(create<ast::StructMember>(
Source{}, mod->RegisterSymbol("a"), "a", &glsl_mat2x2, a_decos));
members.push_back(create<ast::StructMember>(
Source{}, mod->RegisterSymbol("b"), "b", &glsl_mat2x3, b_decos));
members.push_back(create<ast::StructMember>(
Source{}, mod->RegisterSymbol("c"), "c", &glsl_mat4x4, c_decos));
auto* s = create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
ast::type::Struct s_type(mod->RegisterSymbol("S"), "S", s); ast::type::Struct s_type(mod->RegisterSymbol("S"), "S", s);
auto id = b.GenerateTypeIfNeeded(&s_type); auto id = b.GenerateTypeIfNeeded(&s_type);
@ -478,51 +427,40 @@ TEST_F(BuilderTest_Type, GenerateStruct_DecoratedMembers_LayoutArraysOfMatrix) {
// We have to infer layout for matrix when it also has an offset. // We have to infer layout for matrix when it also has an offset.
// The decoration goes on the struct member, even if the matrix is buried // The decoration goes on the struct member, even if the matrix is buried
// in levels of arrays. // in levels of arrays.
ast::type::F32 f32;
ast::type::Matrix glsl_mat2x2(&f32, 2, 2);
ast::type::Array arr_mat2x2( ast::type::Array arr_mat2x2(
&glsl_mat2x2, 1, ast::ArrayDecorationList{}); // Singly nested array ty.mat2x2<f32>(), 1, ast::ArrayDecorationList{}); // Singly nested array
ast::type::Matrix glsl_mat2x3(&f32, 3, 2); // 2 columns, 3 rows ast::type::Array arr_mat2x3(ty.mat2x3<f32>(), 1, ast::ArrayDecorationList{});
ast::type::Array arr_mat2x3(&glsl_mat2x3, 1, ast::ArrayDecorationList{}); ast::type::Array arr_arr_mat2x3(
ast::type::Array arr_arr_mat2x2( ty.mat2x3<f32>(), 1, ast::ArrayDecorationList{}); // Doubly nested array
&arr_mat2x3, 1, ast::ArrayDecorationList{}); // Doubly nested array
ast::type::Matrix glsl_mat4x4(&f32, 4, 4); ast::type::Array rtarr_mat4x4(ty.mat4x4<f32>(), 0,
ast::type::Array rtarr_mat4x4(&glsl_mat4x4, 0,
ast::ArrayDecorationList{}); // Runtime array ast::ArrayDecorationList{}); // Runtime array
ast::StructMemberDecorationList a_decos; auto* s = create<ast::Struct>(
a_decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 0)); ast::StructMemberList{Member("a", &arr_mat2x2, {MemberOffset(0)}),
ast::StructMemberDecorationList b_decos; Member("b", &arr_arr_mat2x3, {MemberOffset(16)}),
b_decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 16)); Member("c", &rtarr_mat4x4, {MemberOffset(48)})},
ast::StructMemberDecorationList c_decos; ast::StructDecorationList{});
c_decos.push_back(create<ast::StructMemberOffsetDecoration>(Source{}, 48));
ast::StructMemberList members;
members.push_back(create<ast::StructMember>(
Source{}, mod->RegisterSymbol("a"), "a", &glsl_mat2x2, a_decos));
members.push_back(create<ast::StructMember>(
Source{}, mod->RegisterSymbol("b"), "b", &glsl_mat2x3, b_decos));
members.push_back(create<ast::StructMember>(
Source{}, mod->RegisterSymbol("c"), "c", &glsl_mat4x4, c_decos));
auto* s = create<ast::Struct>(Source{}, members, ast::StructDecorationList{});
ast::type::Struct s_type(mod->RegisterSymbol("S"), "S", s); ast::type::Struct s_type(mod->RegisterSymbol("S"), "S", s);
auto id = b.GenerateTypeIfNeeded(&s_type); auto id = b.GenerateTypeIfNeeded(&s_type);
ASSERT_FALSE(b.has_error()) << b.error(); ASSERT_FALSE(b.has_error()) << b.error();
EXPECT_EQ(id, 1u); EXPECT_EQ(id, 1u);
EXPECT_EQ(DumpInstructions(b.types()), R"(%4 = OpTypeFloat 32 EXPECT_EQ(DumpInstructions(b.types()), R"(%5 = OpTypeFloat 32
%3 = OpTypeVector %4 2 %4 = OpTypeVector %5 2
%2 = OpTypeMatrix %3 2 %3 = OpTypeMatrix %4 2
%6 = OpTypeVector %4 3 %6 = OpTypeInt 32 0
%5 = OpTypeMatrix %6 2 %7 = OpConstant %6 1
%8 = OpTypeVector %4 4 %2 = OpTypeArray %3 %7
%7 = OpTypeMatrix %8 4 %10 = OpTypeVector %5 3
%1 = OpTypeStruct %2 %5 %7 %9 = OpTypeMatrix %10 2
%8 = OpTypeArray %9 %7
%13 = OpTypeVector %5 4
%12 = OpTypeMatrix %13 4
%11 = OpTypeRuntimeArray %12
%1 = OpTypeStruct %2 %8 %11
)"); )");
EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "S" EXPECT_EQ(DumpInstructions(b.debug()), R"(OpName %1 "S"
OpMemberName %1 0 "a" OpMemberName %1 0 "a"

View File

@ -16,9 +16,6 @@
#include "src/ast/struct.h" #include "src/ast/struct.h"
#include "src/ast/struct_member.h" #include "src/ast/struct_member.h"
#include "src/ast/struct_member_decoration.h" #include "src/ast/struct_member_decoration.h"
#include "src/ast/struct_member_offset_decoration.h"
#include "src/ast/type/f32_type.h"
#include "src/ast/type/i32_type.h"
#include "src/ast/type/struct_type.h" #include "src/ast/type/struct_type.h"
#include "src/writer/wgsl/generator_impl.h" #include "src/writer/wgsl/generator_impl.h"
#include "src/writer/wgsl/test_helper.h" #include "src/writer/wgsl/test_helper.h"
@ -39,17 +36,10 @@ TEST_F(WgslGeneratorImplTest, EmitAlias_F32) {
} }
TEST_F(WgslGeneratorImplTest, EmitConstructedType_Struct) { TEST_F(WgslGeneratorImplTest, EmitConstructedType_Struct) {
ast::StructMemberList members; auto* str = create<ast::Struct>(
members.push_back( ast::StructMemberList{Member("a", ty.f32),
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.f32, Member("b", ty.i32, {MemberOffset(4)})},
ast::StructMemberDecorationList{})); ast::StructDecorationList{});
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4));
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("b"), "b", ty.i32, b_deco));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("A"), "A", str); ast::type::Struct s(mod->RegisterSymbol("A"), "A", str);
ast::type::Alias alias(mod->RegisterSymbol("B"), "B", &s); ast::type::Alias alias(mod->RegisterSymbol("B"), "B", &s);
@ -66,17 +56,10 @@ type B = A;
} }
TEST_F(WgslGeneratorImplTest, EmitAlias_ToStruct) { TEST_F(WgslGeneratorImplTest, EmitAlias_ToStruct) {
ast::StructMemberList members; auto* str = create<ast::Struct>(
members.push_back( ast::StructMemberList{Member("a", ty.f32),
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.f32, Member("b", ty.i32, {MemberOffset(4)})},
ast::StructMemberDecorationList{})); ast::StructDecorationList{});
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4));
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("b"), "b", ty.i32, b_deco));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("A"), "A", str); ast::type::Struct s(mod->RegisterSymbol("A"), "A", str);
ast::type::Alias alias(mod->RegisterSymbol("B"), "B", &s); ast::type::Alias alias(mod->RegisterSymbol("B"), "B", &s);

View File

@ -176,16 +176,11 @@ TEST_F(WgslGeneratorImplTest,
// return; // return;
// } // }
ast::StructMemberList members;
ast::StructMemberDecorationList a_deco;
a_deco.push_back(create<ast::StructMemberOffsetDecoration>(0));
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("d"), "d", ty.f32, a_deco));
ast::StructDecorationList s_decos; ast::StructDecorationList s_decos;
s_decos.push_back(create<ast::StructBlockDecoration>()); s_decos.push_back(create<ast::StructBlockDecoration>());
auto* str = create<ast::Struct>(members, s_decos); auto* str = create<ast::Struct>(
ast::StructMemberList{Member("d", ty.f32, {MemberOffset(0)})}, s_decos);
ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str); ast::type::Struct s(mod->RegisterSymbol("Data"), "Data", str);
ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s); ast::type::AccessControl ac(ast::AccessControl::kReadWrite, &s);

View File

@ -60,16 +60,12 @@ TEST_F(WgslGeneratorImplTest, EmitType_Array) {
} }
TEST_F(WgslGeneratorImplTest, EmitType_AccessControl_Read) { TEST_F(WgslGeneratorImplTest, EmitType_AccessControl_Read) {
auto* mem = create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.i32,
ast::StructMemberDecorationList{});
ast::StructMemberList members;
members.push_back(mem);
auto* block_deco = create<ast::StructBlockDecoration>(); auto* block_deco = create<ast::StructBlockDecoration>();
ast::StructDecorationList decos; ast::StructDecorationList decos;
decos.push_back(block_deco); decos.push_back(block_deco);
auto* str = create<ast::Struct>(members, decos); auto* str =
create<ast::Struct>(ast::StructMemberList{Member("a", ty.i32)}, decos);
auto* s = create<ast::type::Struct>(mod->RegisterSymbol("S"), "S", str); auto* s = create<ast::type::Struct>(mod->RegisterSymbol("S"), "S", str);
ast::type::AccessControl a(ast::AccessControl::kReadOnly, s); ast::type::AccessControl a(ast::AccessControl::kReadOnly, s);
@ -79,16 +75,12 @@ TEST_F(WgslGeneratorImplTest, EmitType_AccessControl_Read) {
} }
TEST_F(WgslGeneratorImplTest, EmitType_AccessControl_ReadWrite) { TEST_F(WgslGeneratorImplTest, EmitType_AccessControl_ReadWrite) {
auto* mem = create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.i32,
ast::StructMemberDecorationList{});
ast::StructMemberList members;
members.push_back(mem);
auto* block_deco = create<ast::StructBlockDecoration>(); auto* block_deco = create<ast::StructBlockDecoration>();
ast::StructDecorationList decos; ast::StructDecorationList decos;
decos.push_back(block_deco); decos.push_back(block_deco);
auto* str = create<ast::Struct>(members, decos); auto* str =
create<ast::Struct>(ast::StructMemberList{Member("a", ty.i32)}, decos);
auto* s = create<ast::type::Struct>(mod->RegisterSymbol("S"), "S", str); auto* s = create<ast::type::Struct>(mod->RegisterSymbol("S"), "S", str);
ast::type::AccessControl a(ast::AccessControl::kReadWrite, s); ast::type::AccessControl a(ast::AccessControl::kReadWrite, s);
@ -153,17 +145,10 @@ TEST_F(WgslGeneratorImplTest, EmitType_Pointer) {
} }
TEST_F(WgslGeneratorImplTest, EmitType_Struct) { TEST_F(WgslGeneratorImplTest, EmitType_Struct) {
ast::StructMemberList members; auto* str = create<ast::Struct>(
members.push_back( ast::StructMemberList{Member("a", ty.i32),
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.i32, Member("b", ty.f32, {MemberOffset(4)})},
ast::StructMemberDecorationList{})); ast::StructDecorationList{});
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4));
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("b"), "b", ty.f32, b_deco));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("S"), "S", str); ast::type::Struct s(mod->RegisterSymbol("S"), "S", str);
@ -172,17 +157,10 @@ TEST_F(WgslGeneratorImplTest, EmitType_Struct) {
} }
TEST_F(WgslGeneratorImplTest, EmitType_StructDecl) { TEST_F(WgslGeneratorImplTest, EmitType_StructDecl) {
ast::StructMemberList members; auto* str = create<ast::Struct>(
members.push_back( ast::StructMemberList{Member("a", ty.i32),
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.i32, Member("b", ty.f32, {MemberOffset(4)})},
ast::StructMemberDecorationList{})); ast::StructDecorationList{});
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4));
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("b"), "b", ty.f32, b_deco));
auto* str = create<ast::Struct>(members, ast::StructDecorationList{});
ast::type::Struct s(mod->RegisterSymbol("S"), "S", str); ast::type::Struct s(mod->RegisterSymbol("S"), "S", str);
@ -196,20 +174,13 @@ TEST_F(WgslGeneratorImplTest, EmitType_StructDecl) {
} }
TEST_F(WgslGeneratorImplTest, EmitType_Struct_WithDecoration) { TEST_F(WgslGeneratorImplTest, EmitType_Struct_WithDecoration) {
ast::StructMemberList members;
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("a"), "a", ty.i32,
ast::StructMemberDecorationList{}));
ast::StructMemberDecorationList b_deco;
b_deco.push_back(create<ast::StructMemberOffsetDecoration>(4));
members.push_back(
create<ast::StructMember>(mod->RegisterSymbol("b"), "b", ty.f32, b_deco));
ast::StructDecorationList decos; ast::StructDecorationList decos;
decos.push_back(create<ast::StructBlockDecoration>()); decos.push_back(create<ast::StructBlockDecoration>());
auto* str = create<ast::Struct>(members, decos); auto* str = create<ast::Struct>(
ast::StructMemberList{Member("a", ty.i32),
Member("b", ty.f32, {MemberOffset(4)})},
decos);
ast::type::Struct s(mod->RegisterSymbol("S"), "S", str); ast::type::Struct s(mod->RegisterSymbol("S"), "S", str);