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;
 }