ast: Move [Set]IsSwizzle() from IdentifierExpression to MemberAccessorExpression

This is more a property of a MemberAccessorExpression than the identifier itself.

Change-Id: Icb17df1fe43a959332d73df026e77ca4e07d23ed
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/40140
Commit-Queue: Ben Clayton <bclayton@google.com>
Reviewed-by: David Neto <dneto@google.com>
diff --git a/src/ast/identifier_expression.h b/src/ast/identifier_expression.h
index 54cfdba..cc53273 100644
--- a/src/ast/identifier_expression.h
+++ b/src/ast/identifier_expression.h
@@ -39,12 +39,6 @@
   /// @returns the symbol for the identifier
   Symbol symbol() const { return sym_; }
 
-  /// Sets the identifier as a swizzle
-  void SetIsSwizzle() { is_swizzle_ = true; }
-
-  /// @returns true if this is a swizzle identifier
-  bool IsSwizzle() const { return is_swizzle_; }
-
   /// Clones this node and all transitive child nodes using the `CloneContext`
   /// `ctx`.
   /// @note Semantic information such as resolved expression type and intrinsic
@@ -68,8 +62,6 @@
   IdentifierExpression(const IdentifierExpression&) = delete;
 
   Symbol const sym_;
-
-  bool is_swizzle_ = false;  // Semantic info
 };
 
 }  // namespace ast
diff --git a/src/ast/member_accessor_expression.h b/src/ast/member_accessor_expression.h
index 3e6fd9b..5657e09 100644
--- a/src/ast/member_accessor_expression.h
+++ b/src/ast/member_accessor_expression.h
@@ -45,6 +45,12 @@
   /// @returns the member expression
   IdentifierExpression* member() const { return member_; }
 
+  /// Sets the identifier as a swizzle
+  void SetIsSwizzle() { is_swizzle_ = true; }
+
+  /// @returns true if this is a swizzle identifier
+  bool IsSwizzle() const { return is_swizzle_; }
+
   /// Clones this node and all transitive child nodes using the `CloneContext`
   /// `ctx`.
   /// @note Semantic information such as resolved expression type and intrinsic
@@ -69,6 +75,8 @@
 
   Expression* const struct_;
   IdentifierExpression* const member_;
+
+  bool is_swizzle_ = false;  // Semantic info
 };
 
 }  // namespace ast
diff --git a/src/type_determiner.cc b/src/type_determiner.cc
index df933c6..bcc55fc 100644
--- a/src/type_determiner.cc
+++ b/src/type_determiner.cc
@@ -1029,7 +1029,7 @@
       ret = builder_->create<type::Pointer>(ret, ptr->storage_class());
     }
   } else if (auto* vec = data_type->As<type::Vector>()) {
-    expr->member()->SetIsSwizzle();
+    expr->SetIsSwizzle();
 
     auto size = builder_->Symbols().NameFor(expr->member()->symbol()).size();
     if (size == 1) {
diff --git a/src/writer/hlsl/generator_impl.cc b/src/writer/hlsl/generator_impl.cc
index fa6548d..f78a12e 100644
--- a/src/writer/hlsl/generator_impl.cc
+++ b/src/writer/hlsl/generator_impl.cc
@@ -1165,12 +1165,7 @@
     }
   }
 
-  // Swizzles output the name directly
-  if (ident->IsSwizzle()) {
-    out << builder_.Symbols().NameFor(ident->symbol());
-  } else {
-    out << namer_.NameFor(builder_.Symbols().NameFor(ident->symbol()));
-  }
+  out << namer_.NameFor(builder_.Symbols().NameFor(ident->symbol()));
 
   return true;
 }
@@ -2107,7 +2102,15 @@
     return false;
   }
   out << ".";
-  return EmitExpression(pre, out, expr->member());
+
+  // Swizzles output the name directly
+  if (expr->IsSwizzle()) {
+    out << builder_.Symbols().NameFor(expr->member()->symbol());
+  } else if (!EmitExpression(pre, out, expr->member())) {
+    return false;
+  }
+
+  return true;
 }
 
 bool GeneratorImpl::EmitReturn(std::ostream& out, ast::ReturnStatement* stmt) {
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index 77678d8..b1ff19e 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -1593,12 +1593,7 @@
     }
   }
 
-  // Swizzles get written out directly
-  if (ident->IsSwizzle()) {
-    out_ << program_->Symbols().NameFor(ident->symbol());
-  } else {
-    out_ << namer_.NameFor(program_->Symbols().NameFor(ident->symbol()));
-  }
+  out_ << namer_.NameFor(program_->Symbols().NameFor(ident->symbol()));
 
   return true;
 }
@@ -1742,7 +1737,14 @@
 
   out_ << ".";
 
-  return EmitExpression(expr->member());
+  // Swizzles get written out directly
+  if (expr->IsSwizzle()) {
+    out_ << program_->Symbols().NameFor(expr->member()->symbol());
+  } else if (!EmitExpression(expr->member())) {
+    return false;
+  }
+
+  return true;
 }
 
 bool GeneratorImpl::EmitReturn(ast::ReturnStatement* stmt) {