Replace ConstructorExpression::(Is|As)* with Castable
Change-Id: I18e9768fef36b79cb0e65c6eb79fd147013c54f0
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/34317
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/ast/builder.h b/src/ast/builder.h
index 1080ead..f80a4f6 100644
--- a/src/ast/builder.h
+++ b/src/ast/builder.h
@@ -35,6 +35,7 @@
#include "src/ast/type/u32_type.h"
#include "src/ast/type/vector_type.h"
#include "src/ast/type/void_type.h"
+#include "src/ast/type_constructor_expression.h"
#include "src/ast/uint_literal.h"
#include "src/ast/variable.h"
#include "src/context.h"
diff --git a/src/ast/constructor_expression.cc b/src/ast/constructor_expression.cc
index 1f19ed8..3326656 100644
--- a/src/ast/constructor_expression.cc
+++ b/src/ast/constructor_expression.cc
@@ -16,9 +16,6 @@
#include <assert.h>
-#include "src/ast/scalar_constructor_expression.h"
-#include "src/ast/type_constructor_expression.h"
-
namespace tint {
namespace ast {
@@ -31,23 +28,5 @@
ConstructorExpression::ConstructorExpression(const Source& source)
: Base(source) {}
-bool ConstructorExpression::IsScalarConstructor() const {
- return false;
-}
-
-bool ConstructorExpression::IsTypeConstructor() const {
- return false;
-}
-
-ScalarConstructorExpression* ConstructorExpression::AsScalarConstructor() {
- assert(IsScalarConstructor());
- return static_cast<ScalarConstructorExpression*>(this);
-}
-
-TypeConstructorExpression* ConstructorExpression::AsTypeConstructor() {
- assert(IsTypeConstructor());
- return static_cast<TypeConstructorExpression*>(this);
-}
-
} // namespace ast
} // namespace tint
diff --git a/src/ast/constructor_expression.h b/src/ast/constructor_expression.h
index 3c9e375..9e3e9f2 100644
--- a/src/ast/constructor_expression.h
+++ b/src/ast/constructor_expression.h
@@ -20,25 +20,12 @@
namespace tint {
namespace ast {
-class ScalarConstructorExpression;
-class TypeConstructorExpression;
-
/// Base class for constructor style expressions
class ConstructorExpression
: public Castable<ConstructorExpression, Expression> {
public:
~ConstructorExpression() override;
- /// @returns true if this is a scalar constructor
- virtual bool IsScalarConstructor() const;
- /// @returns true if this is a type constructor
- virtual bool IsTypeConstructor() const;
-
- /// @returns this as a scalar constructor expression
- ScalarConstructorExpression* AsScalarConstructor();
- /// @returns this as a type constructor expression
- TypeConstructorExpression* AsTypeConstructor();
-
protected:
/// Constructor
ConstructorExpression();
diff --git a/src/ast/scalar_constructor_expression.cc b/src/ast/scalar_constructor_expression.cc
index 02fee32..2c05b4d 100644
--- a/src/ast/scalar_constructor_expression.cc
+++ b/src/ast/scalar_constructor_expression.cc
@@ -31,10 +31,6 @@
ScalarConstructorExpression::~ScalarConstructorExpression() = default;
-bool ScalarConstructorExpression::IsScalarConstructor() const {
- return true;
-}
-
bool ScalarConstructorExpression::IsValid() const {
return literal_ != nullptr;
}
diff --git a/src/ast/scalar_constructor_expression.h b/src/ast/scalar_constructor_expression.h
index d780fef..273f7bc 100644
--- a/src/ast/scalar_constructor_expression.h
+++ b/src/ast/scalar_constructor_expression.h
@@ -41,9 +41,6 @@
ScalarConstructorExpression(ScalarConstructorExpression&&);
~ScalarConstructorExpression() override;
- /// @returns true if this is a scalar constructor
- bool IsScalarConstructor() const override;
-
/// Set the literal value
/// @param literal the literal
void set_literal(Literal* literal) { literal_ = literal; }
diff --git a/src/ast/type_constructor_expression.cc b/src/ast/type_constructor_expression.cc
index 8f1d8a8..b0f111f 100644
--- a/src/ast/type_constructor_expression.cc
+++ b/src/ast/type_constructor_expression.cc
@@ -33,10 +33,6 @@
TypeConstructorExpression::~TypeConstructorExpression() = default;
-bool TypeConstructorExpression::IsTypeConstructor() const {
- return true;
-}
-
bool TypeConstructorExpression::IsValid() const {
if (values_.empty()) {
return true;
diff --git a/src/ast/type_constructor_expression.h b/src/ast/type_constructor_expression.h
index ae911e8..4ed73ee 100644
--- a/src/ast/type_constructor_expression.h
+++ b/src/ast/type_constructor_expression.h
@@ -44,9 +44,6 @@
TypeConstructorExpression(TypeConstructorExpression&&);
~TypeConstructorExpression() override;
- /// @returns true if this is a type constructor
- bool IsTypeConstructor() const override;
-
/// Set the type
/// @param type the type
void set_type(type::Type* type) { type_ = type; }
diff --git a/src/ast/type_constructor_expression_test.cc b/src/ast/type_constructor_expression_test.cc
index c576fed..24eb0e6 100644
--- a/src/ast/type_constructor_expression_test.cc
+++ b/src/ast/type_constructor_expression_test.cc
@@ -53,7 +53,7 @@
TEST_F(TypeConstructorExpressionTest, IsTypeConstructor) {
TypeConstructorExpression t;
- EXPECT_TRUE(t.IsTypeConstructor());
+ EXPECT_TRUE(t.Is<ast::TypeConstructorExpression>());
}
TEST_F(TypeConstructorExpressionTest, IsValid) {
diff --git a/src/inspector/inspector.cc b/src/inspector/inspector.cc
index 655ed3a..a9401a4 100644
--- a/src/inspector/inspector.cc
+++ b/src/inspector/inspector.cc
@@ -131,13 +131,14 @@
}
auto* constructor = expression->As<ast::ConstructorExpression>();
- if (!constructor->IsScalarConstructor()) {
+ if (!constructor->Is<ast::ScalarConstructorExpression>()) {
// This is invalid WGSL, but handling gracefully.
result[constant_id] = Scalar();
continue;
}
- auto* literal = constructor->AsScalarConstructor()->literal();
+ auto* literal =
+ constructor->As<ast::ScalarConstructorExpression>()->literal();
if (!literal) {
// This is invalid WGSL, but handling gracefully.
result[constant_id] = Scalar();
diff --git a/src/transform/bound_array_accessors_transform.cc b/src/transform/bound_array_accessors_transform.cc
index 135518e..a1ea02d 100644
--- a/src/transform/bound_array_accessors_transform.cc
+++ b/src/transform/bound_array_accessors_transform.cc
@@ -150,9 +150,9 @@
}
} else if (expr->Is<ast::IdentifierExpression>()) {
/* nop */
- } else if (auto* c = expr->As<ast::ConstructorExpression>()) {
- if (c->IsTypeConstructor()) {
- for (auto* e : c->AsTypeConstructor()->values()) {
+ } else if (expr->Is<ast::ConstructorExpression>()) {
+ if (auto* c = expr->As<ast::TypeConstructorExpression>()) {
+ for (auto* e : c->values()) {
if (!ProcessExpression(e)) {
return false;
}
diff --git a/src/type_determiner.cc b/src/type_determiner.cc
index 6d3a38e..b0eaa9a 100644
--- a/src/type_determiner.cc
+++ b/src/type_determiner.cc
@@ -831,8 +831,7 @@
}
bool TypeDeterminer::DetermineConstructor(ast::ConstructorExpression* expr) {
- if (expr->IsTypeConstructor()) {
- auto* ty = expr->AsTypeConstructor();
+ if (auto* ty = expr->As<ast::TypeConstructorExpression>()) {
for (auto* value : ty->values()) {
if (!DetermineResultType(value)) {
return false;
@@ -840,7 +839,8 @@
}
expr->set_result_type(ty->type());
} else {
- expr->set_result_type(expr->AsScalarConstructor()->literal()->type());
+ expr->set_result_type(
+ expr->As<ast::ScalarConstructorExpression>()->literal()->type());
}
return true;
}
diff --git a/src/writer/hlsl/generator_impl.cc b/src/writer/hlsl/generator_impl.cc
index 62b46e5..c5c61b5 100644
--- a/src/writer/hlsl/generator_impl.cc
+++ b/src/writer/hlsl/generator_impl.cc
@@ -904,10 +904,11 @@
bool GeneratorImpl::EmitConstructor(std::ostream& pre,
std::ostream& out,
ast::ConstructorExpression* expr) {
- if (expr->IsScalarConstructor()) {
- return EmitScalarConstructor(pre, out, expr->AsScalarConstructor());
+ if (auto* scalar = expr->As<ast::ScalarConstructorExpression>()) {
+ return EmitScalarConstructor(pre, out, scalar);
}
- return EmitTypeConstructor(pre, out, expr->AsTypeConstructor());
+ return EmitTypeConstructor(pre, out,
+ expr->As<ast::TypeConstructorExpression>());
}
bool GeneratorImpl::EmitScalarConstructor(
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index 92e4433..a1a9d0d 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -882,10 +882,10 @@
}
bool GeneratorImpl::EmitConstructor(ast::ConstructorExpression* expr) {
- if (expr->IsScalarConstructor()) {
- return EmitScalarConstructor(expr->AsScalarConstructor());
+ if (auto* scalar = expr->As<ast::ScalarConstructorExpression>()) {
+ return EmitScalarConstructor(scalar);
}
- return EmitTypeConstructor(expr->AsTypeConstructor());
+ return EmitTypeConstructor(expr->As<ast::TypeConstructorExpression>());
}
bool GeneratorImpl::EmitContinue(ast::ContinueStatement*) {
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index ef9dc6f..1f2bdc2 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -1157,12 +1157,11 @@
ast::Variable* var,
ast::ConstructorExpression* expr,
bool is_global_init) {
- if (expr->IsScalarConstructor()) {
- return GenerateLiteralIfNeeded(var, expr->AsScalarConstructor()->literal());
+ if (auto* scalar = expr->As<ast::ScalarConstructorExpression>()) {
+ return GenerateLiteralIfNeeded(var, scalar->literal());
}
- if (expr->IsTypeConstructor()) {
- return GenerateTypeConstructorExpression(expr->AsTypeConstructor(),
- is_global_init);
+ if (auto* type = expr->As<ast::TypeConstructorExpression>()) {
+ return GenerateTypeConstructorExpression(type, is_global_init);
}
error_ = "unknown constructor expression";
@@ -1178,7 +1177,7 @@
return true;
}
- auto* tc = constructor->AsTypeConstructor();
+ auto* tc = constructor->As<ast::TypeConstructorExpression>();
auto* result_type = tc->type()->UnwrapAll();
for (size_t i = 0; i < tc->values().size(); ++i) {
auto* e = tc->values()[i];
diff --git a/src/writer/wgsl/generator_impl.cc b/src/writer/wgsl/generator_impl.cc
index 6942a34..0761d80 100644
--- a/src/writer/wgsl/generator_impl.cc
+++ b/src/writer/wgsl/generator_impl.cc
@@ -286,10 +286,10 @@
}
bool GeneratorImpl::EmitConstructor(ast::ConstructorExpression* expr) {
- if (expr->IsScalarConstructor()) {
- return EmitScalarConstructor(expr->AsScalarConstructor());
+ if (auto* scalar = expr->As<ast::ScalarConstructorExpression>()) {
+ return EmitScalarConstructor(scalar);
}
- return EmitTypeConstructor(expr->AsTypeConstructor());
+ return EmitTypeConstructor(expr->As<ast::TypeConstructorExpression>());
}
bool GeneratorImpl::EmitTypeConstructor(ast::TypeConstructorExpression* expr) {