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) {