Add semantic::MemberAccessorExpression, use it.
Pull the mutable 'is_swizzled' semantic field from ast::MemberAccessorExpression and into a new semantic::MemberAccessorExpression node.
Have the TypeDeterminer create these semantic::MemberAccessorExpression nodes.
Bug: tint:390
Change-Id: I8fc6e36dabb417190528536a94d027af54059222
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/40142
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/type_determiner.cc b/src/type_determiner.cc
index bcc55fc..d876ebb 100644
--- a/src/type_determiner.cc
+++ b/src/type_determiner.cc
@@ -46,6 +46,7 @@
#include "src/semantic/expression.h"
#include "src/semantic/function.h"
#include "src/semantic/intrinsic.h"
+#include "src/semantic/member_accessor_expression.h"
#include "src/semantic/variable.h"
#include "src/type/array_type.h"
#include "src/type/bool_type.h"
@@ -1006,6 +1007,8 @@
auto* data_type = res->UnwrapPtrIfNeeded()->UnwrapIfNeeded();
type::Type* ret = nullptr;
+ bool is_swizzle = false;
+
if (auto* ty = data_type->As<type::Struct>()) {
auto* strct = ty->impl();
auto symbol = expr->member()->symbol();
@@ -1029,7 +1032,7 @@
ret = builder_->create<type::Pointer>(ret, ptr->storage_class());
}
} else if (auto* vec = data_type->As<type::Vector>()) {
- expr->SetIsSwizzle();
+ is_swizzle = true;
auto size = builder_->Symbols().NameFor(expr->member()->symbol()).size();
if (size == 1) {
@@ -1054,7 +1057,9 @@
return false;
}
- SetType(expr, ret);
+ builder_->Sem().Add(
+ expr,
+ builder_->create<semantic::MemberAccessorExpression>(ret, is_swizzle));
return true;
}