Replace Variable::(Is|As)* with Castable
Change-Id: I7a49287af079d53cee095fa2243dd21757546b56
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/34318
Reviewed-by: dan sinclair <dsinclair@chromium.org>
diff --git a/src/ast/decorated_variable.cc b/src/ast/decorated_variable.cc
index 5e5694a..4472692 100644
--- a/src/ast/decorated_variable.cc
+++ b/src/ast/decorated_variable.cc
@@ -69,10 +69,6 @@
return 0;
}
-bool DecoratedVariable::IsDecorated() const {
- return true;
-}
-
bool DecoratedVariable::IsValid() const {
return Variable::IsValid();
}
diff --git a/src/ast/decorated_variable.h b/src/ast/decorated_variable.h
index 1eeea8c..b0067b5 100644
--- a/src/ast/decorated_variable.h
+++ b/src/ast/decorated_variable.h
@@ -56,9 +56,6 @@
/// |HasConstantIdDecoration| has been called first.
uint32_t constant_id() const;
- /// @returns true if this is a decorated variable
- bool IsDecorated() const override;
-
/// @returns true if the name and path are both present
bool IsValid() const override;
diff --git a/src/ast/decorated_variable_test.cc b/src/ast/decorated_variable_test.cc
index f133a13..2b41652 100644
--- a/src/ast/decorated_variable_test.cc
+++ b/src/ast/decorated_variable_test.cc
@@ -108,7 +108,7 @@
TEST_F(DecoratedVariableTest, IsDecorated) {
DecoratedVariable dv;
- EXPECT_TRUE(dv.IsDecorated());
+ EXPECT_TRUE(dv.Is<ast::DecoratedVariable>());
}
TEST_F(DecoratedVariableTest, to_str) {
diff --git a/src/ast/function.cc b/src/ast/function.cc
index b636559..8c72209 100644
--- a/src/ast/function.cc
+++ b/src/ast/function.cc
@@ -85,13 +85,12 @@
std::vector<std::pair<Variable*, LocationDecoration*>> ret;
for (auto* var : referenced_module_variables()) {
- if (!var->IsDecorated()) {
- continue;
- }
- for (auto* deco : var->AsDecorated()->decorations()) {
- if (auto* location = deco->As<LocationDecoration>()) {
- ret.push_back({var, location});
- break;
+ if (auto* decos = var->As<ast::DecoratedVariable>()) {
+ for (auto* deco : decos->decorations()) {
+ if (auto* location = deco->As<LocationDecoration>()) {
+ ret.push_back({var, location});
+ break;
+ }
}
}
}
@@ -103,14 +102,14 @@
std::vector<std::pair<Variable*, Function::BindingInfo>> ret;
for (auto* var : referenced_module_variables()) {
- if (!var->IsDecorated() ||
+ if (!var->Is<ast::DecoratedVariable>() ||
var->storage_class() != ast::StorageClass::kUniform) {
continue;
}
BindingDecoration* binding = nullptr;
SetDecoration* set = nullptr;
- for (auto* deco : var->AsDecorated()->decorations()) {
+ for (auto* deco : var->As<ast::DecoratedVariable>()->decorations()) {
if (auto* b = deco->As<ast::BindingDecoration>()) {
binding = b;
} else if (auto* s = deco->As<ast::SetDecoration>()) {
@@ -131,14 +130,14 @@
std::vector<std::pair<Variable*, Function::BindingInfo>> ret;
for (auto* var : referenced_module_variables()) {
- if (!var->IsDecorated() ||
+ if (!var->Is<ast::DecoratedVariable>() ||
var->storage_class() != ast::StorageClass::kStorageBuffer) {
continue;
}
BindingDecoration* binding = nullptr;
SetDecoration* set = nullptr;
- for (auto* deco : var->AsDecorated()->decorations()) {
+ for (auto* deco : var->As<ast::DecoratedVariable>()->decorations()) {
if (auto* b = deco->As<ast::BindingDecoration>()) {
binding = b;
} else if (auto* s = deco->As<ast::SetDecoration>()) {
@@ -159,10 +158,10 @@
std::vector<std::pair<Variable*, BuiltinDecoration*>> ret;
for (auto* var : referenced_module_variables()) {
- if (!var->IsDecorated()) {
+ if (!var->Is<ast::DecoratedVariable>()) {
continue;
}
- for (auto* deco : var->AsDecorated()->decorations()) {
+ for (auto* deco : var->As<ast::DecoratedVariable>()->decorations()) {
if (auto* builtin = deco->As<BuiltinDecoration>()) {
ret.push_back({var, builtin});
break;
@@ -283,14 +282,15 @@
for (auto* var : referenced_module_variables()) {
auto* unwrapped_type = var->type()->UnwrapIfNeeded();
- if (!var->IsDecorated() || !unwrapped_type->Is<ast::type::SamplerType>() ||
+ if (!var->Is<ast::DecoratedVariable>() ||
+ !unwrapped_type->Is<ast::type::SamplerType>() ||
unwrapped_type->As<ast::type::SamplerType>()->kind() != kind) {
continue;
}
BindingDecoration* binding = nullptr;
SetDecoration* set = nullptr;
- for (auto* deco : var->AsDecorated()->decorations()) {
+ for (auto* deco : var->As<ast::DecoratedVariable>()->decorations()) {
if (auto* b = deco->As<ast::BindingDecoration>()) {
binding = b;
} else if (auto* s = deco->As<ast::SetDecoration>()) {
@@ -312,7 +312,8 @@
for (auto* var : referenced_module_variables()) {
auto* unwrapped_type = var->type()->UnwrapIfNeeded();
- if (!var->IsDecorated() || !unwrapped_type->Is<ast::type::TextureType>()) {
+ if (!var->Is<ast::DecoratedVariable>() ||
+ !unwrapped_type->Is<ast::type::TextureType>()) {
continue;
}
@@ -325,7 +326,7 @@
BindingDecoration* binding = nullptr;
SetDecoration* set = nullptr;
- for (auto* deco : var->AsDecorated()->decorations()) {
+ for (auto* deco : var->As<ast::DecoratedVariable>()->decorations()) {
if (auto* b = deco->As<ast::BindingDecoration>()) {
binding = b;
} else if (auto* s = deco->As<ast::SetDecoration>()) {
diff --git a/src/ast/variable.cc b/src/ast/variable.cc
index 67b2ed1..37c1f20 100644
--- a/src/ast/variable.cc
+++ b/src/ast/variable.cc
@@ -36,20 +36,6 @@
Variable::~Variable() = default;
-DecoratedVariable* Variable::AsDecorated() {
- assert(IsDecorated());
- return static_cast<DecoratedVariable*>(this);
-}
-
-const DecoratedVariable* Variable::AsDecorated() const {
- assert(IsDecorated());
- return static_cast<const DecoratedVariable*>(this);
-}
-
-bool Variable::IsDecorated() const {
- return false;
-}
-
bool Variable::IsValid() const {
if (name_.length() == 0) {
return false;
diff --git a/src/ast/variable.h b/src/ast/variable.h
index 6445946..11c95d3 100644
--- a/src/ast/variable.h
+++ b/src/ast/variable.h
@@ -29,8 +29,6 @@
namespace tint {
namespace ast {
-class DecoratedVariable;
-
/// A Variable statement.
///
/// An instance of this class represents one of three constructs in WGSL: "var"
@@ -134,14 +132,6 @@
/// @returns true if this is a constant, false otherwise
bool is_const() const { return is_const_; }
- /// @returns true if this is a decorated variable
- virtual bool IsDecorated() const;
-
- /// @returns the expression as a decorated variable
- DecoratedVariable* AsDecorated();
- /// @returns the expression as a decorated variable
- const DecoratedVariable* AsDecorated() const;
-
/// @returns true if the name and path are both present
bool IsValid() const override;
diff --git a/src/inspector/inspector.cc b/src/inspector/inspector.cc
index a9401a4..9012f73 100644
--- a/src/inspector/inspector.cc
+++ b/src/inspector/inspector.cc
@@ -100,11 +100,11 @@
std::map<uint32_t, Scalar> Inspector::GetConstantIDs() {
std::map<uint32_t, Scalar> result;
for (auto* var : module_.global_variables()) {
- if (!var->IsDecorated()) {
+ auto* decorated = var->As<ast::DecoratedVariable>();
+ if (decorated == nullptr) {
continue;
}
- auto* decorated = var->AsDecorated();
if (!decorated->HasConstantIdDecoration()) {
continue;
}
diff --git a/src/reader/wgsl/parser_impl_global_variable_decl_test.cc b/src/reader/wgsl/parser_impl_global_variable_decl_test.cc
index b03cd79..76f2c29 100644
--- a/src/reader/wgsl/parser_impl_global_variable_decl_test.cc
+++ b/src/reader/wgsl/parser_impl_global_variable_decl_test.cc
@@ -46,7 +46,7 @@
EXPECT_EQ(e->source().range.end.column, 11u);
ASSERT_EQ(e->constructor(), nullptr);
- ASSERT_FALSE(e->IsDecorated());
+ ASSERT_FALSE(e->Is<ast::DecoratedVariable>());
}
TEST_F(ParserImplTest, GlobalVariableDecl_WithConstructor) {
@@ -73,7 +73,7 @@
ASSERT_TRUE(e->constructor()->Is<ast::ConstructorExpression>());
ASSERT_TRUE(e->constructor()->Is<ast::ScalarConstructorExpression>());
- ASSERT_FALSE(e->IsDecorated());
+ ASSERT_FALSE(e->Is<ast::DecoratedVariable>());
}
TEST_F(ParserImplTest, GlobalVariableDecl_WithDecoration) {
@@ -86,7 +86,7 @@
EXPECT_TRUE(e.matched);
EXPECT_FALSE(e.errored);
ASSERT_NE(e.value, nullptr);
- ASSERT_TRUE(e->IsDecorated());
+ ASSERT_TRUE(e->Is<ast::DecoratedVariable>());
EXPECT_EQ(e->name(), "a");
ASSERT_NE(e->type(), nullptr);
@@ -100,8 +100,8 @@
ASSERT_EQ(e->constructor(), nullptr);
- ASSERT_TRUE(e->IsDecorated());
- auto* v = e->AsDecorated();
+ ASSERT_TRUE(e->Is<ast::DecoratedVariable>());
+ auto* v = e->As<ast::DecoratedVariable>();
auto& decorations = v->decorations();
ASSERT_EQ(decorations.size(), 2u);
@@ -120,7 +120,7 @@
EXPECT_TRUE(e.matched);
EXPECT_FALSE(e.errored);
ASSERT_NE(e.value, nullptr);
- ASSERT_TRUE(e->IsDecorated());
+ ASSERT_TRUE(e->Is<ast::DecoratedVariable>());
EXPECT_EQ(e->name(), "a");
ASSERT_NE(e->type(), nullptr);
@@ -134,8 +134,8 @@
ASSERT_EQ(e->constructor(), nullptr);
- ASSERT_TRUE(e->IsDecorated());
- auto* v = e->AsDecorated();
+ ASSERT_TRUE(e->Is<ast::DecoratedVariable>());
+ auto* v = e->As<ast::DecoratedVariable>();
auto& decorations = v->decorations();
ASSERT_EQ(decorations.size(), 2u);
diff --git a/src/transform/vertex_pulling_transform.cc b/src/transform/vertex_pulling_transform.cc
index 11544ca..40cfc4a 100644
--- a/src/transform/vertex_pulling_transform.cc
+++ b/src/transform/vertex_pulling_transform.cc
@@ -122,11 +122,12 @@
// Look for an existing vertex index builtin
for (auto* v : mod_->global_variables()) {
- if (!v->IsDecorated() || v->storage_class() != ast::StorageClass::kInput) {
+ if (!v->Is<ast::DecoratedVariable>() ||
+ v->storage_class() != ast::StorageClass::kInput) {
continue;
}
- for (auto* d : v->AsDecorated()->decorations()) {
+ for (auto* d : v->As<ast::DecoratedVariable>()->decorations()) {
if (d->Is<ast::BuiltinDecoration>() &&
d->As<ast::BuiltinDecoration>()->value() ==
ast::Builtin::kVertexIdx) {
@@ -165,11 +166,12 @@
// Look for an existing instance index builtin
for (auto* v : mod_->global_variables()) {
- if (!v->IsDecorated() || v->storage_class() != ast::StorageClass::kInput) {
+ if (!v->Is<ast::DecoratedVariable>() ||
+ v->storage_class() != ast::StorageClass::kInput) {
continue;
}
- for (auto* d : v->AsDecorated()->decorations()) {
+ for (auto* d : v->As<ast::DecoratedVariable>()->decorations()) {
if (d->Is<ast::BuiltinDecoration>() &&
d->As<ast::BuiltinDecoration>()->value() ==
ast::Builtin::kInstanceIdx) {
@@ -195,11 +197,12 @@
void VertexPullingTransform::ConvertVertexInputVariablesToPrivate() {
for (auto*& v : mod_->global_variables()) {
- if (!v->IsDecorated() || v->storage_class() != ast::StorageClass::kInput) {
+ if (!v->Is<ast::DecoratedVariable>() ||
+ v->storage_class() != ast::StorageClass::kInput) {
continue;
}
- for (auto* d : v->AsDecorated()->decorations()) {
+ for (auto* d : v->As<ast::DecoratedVariable>()->decorations()) {
if (auto* l = d->As<ast::LocationDecoration>()) {
uint32_t location = l->value();
// This is where the replacement happens. Expressions use identifier
diff --git a/src/writer/hlsl/generator_impl.cc b/src/writer/hlsl/generator_impl.cc
index c5c61b5..a84af8c 100644
--- a/src/writer/hlsl/generator_impl.cc
+++ b/src/writer/hlsl/generator_impl.cc
@@ -1005,9 +1005,9 @@
}
bool GeneratorImpl::global_is_in_struct(ast::Variable* var) const {
- return var->IsDecorated() &&
- (var->AsDecorated()->HasLocationDecoration() ||
- var->AsDecorated()->HasBuiltinDecoration()) &&
+ return var->Is<ast::DecoratedVariable>() &&
+ (var->As<ast::DecoratedVariable>()->HasLocationDecoration() ||
+ var->As<ast::DecoratedVariable>()->HasBuiltinDecoration()) &&
(var->storage_class() == ast::StorageClass::kInput ||
var->storage_class() == ast::StorageClass::kOutput);
}
@@ -2219,7 +2219,7 @@
make_indent(out);
// TODO(dsinclair): Handle variable decorations
- if (var->IsDecorated()) {
+ if (var->Is<ast::DecoratedVariable>()) {
error_ = "Variable decorations are not handled yet";
return false;
}
@@ -2253,7 +2253,8 @@
const ast::Variable* var) {
make_indent(out);
- if (var->IsDecorated() && !var->AsDecorated()->HasConstantIdDecoration()) {
+ if (var->Is<ast::DecoratedVariable>() &&
+ !var->As<ast::DecoratedVariable>()->HasConstantIdDecoration()) {
error_ = "Decorated const values not valid";
return false;
}
@@ -2271,8 +2272,9 @@
out << pre.str();
}
- if (var->IsDecorated() && var->AsDecorated()->HasConstantIdDecoration()) {
- auto const_id = var->AsDecorated()->constant_id();
+ if (var->Is<ast::DecoratedVariable>() &&
+ var->As<ast::DecoratedVariable>()->HasConstantIdDecoration()) {
+ auto const_id = var->As<ast::DecoratedVariable>()->constant_id();
out << "#ifndef WGSL_SPEC_CONSTANT_" << const_id << std::endl;
diff --git a/src/writer/msl/generator_impl.cc b/src/writer/msl/generator_impl.cc
index a1a9d0d..d4826e9 100644
--- a/src/writer/msl/generator_impl.cc
+++ b/src/writer/msl/generator_impl.cc
@@ -1492,11 +1492,13 @@
bool GeneratorImpl::global_is_in_struct(ast::Variable* var) const {
bool in_or_out_struct_has_location =
- var->IsDecorated() && var->AsDecorated()->HasLocationDecoration() &&
+ var->Is<ast::DecoratedVariable>() &&
+ var->As<ast::DecoratedVariable>()->HasLocationDecoration() &&
(var->storage_class() == ast::StorageClass::kInput ||
var->storage_class() == ast::StorageClass::kOutput);
bool in_struct_has_builtin =
- var->IsDecorated() && var->AsDecorated()->HasBuiltinDecoration() &&
+ var->Is<ast::DecoratedVariable>() &&
+ var->As<ast::DecoratedVariable>()->HasBuiltinDecoration() &&
var->storage_class() == ast::StorageClass::kOutput;
return in_or_out_struct_has_location || in_struct_has_builtin;
}
@@ -2006,7 +2008,7 @@
make_indent();
// TODO(dsinclair): Handle variable decorations
- if (var->IsDecorated()) {
+ if (var->Is<ast::DecoratedVariable>()) {
error_ = "Variable decorations are not handled yet";
return false;
}
@@ -2044,7 +2046,8 @@
bool GeneratorImpl::EmitProgramConstVariable(const ast::Variable* var) {
make_indent();
- if (var->IsDecorated() && !var->AsDecorated()->HasConstantIdDecoration()) {
+ if (var->Is<ast::DecoratedVariable>() &&
+ !var->As<ast::DecoratedVariable>()->HasConstantIdDecoration()) {
error_ = "Decorated const values not valid";
return false;
}
@@ -2061,9 +2064,10 @@
out_ << " " << var->name();
}
- if (var->IsDecorated() && var->AsDecorated()->HasConstantIdDecoration()) {
- out_ << " [[function_constant(" << var->AsDecorated()->constant_id()
- << ")]]";
+ if (var->Is<ast::DecoratedVariable>() &&
+ var->As<ast::DecoratedVariable>()->HasConstantIdDecoration()) {
+ out_ << " [[function_constant("
+ << var->As<ast::DecoratedVariable>()->constant_id() << ")]]";
} else if (var->constructor() != nullptr) {
out_ << " = ";
if (!EmitExpression(var->constructor())) {
diff --git a/src/writer/spirv/builder.cc b/src/writer/spirv/builder.cc
index 1f2bdc2..042bea5 100644
--- a/src/writer/spirv/builder.cc
+++ b/src/writer/spirv/builder.cc
@@ -747,7 +747,8 @@
// one
// 2- If we don't have a constructor and we're an Output or Private variable
// then WGSL requires an initializer.
- if (var->IsDecorated() && var->AsDecorated()->HasConstantIdDecoration()) {
+ if (var->Is<ast::DecoratedVariable>() &&
+ var->As<ast::DecoratedVariable>()->HasConstantIdDecoration()) {
if (type->Is<ast::type::F32Type>()) {
ast::FloatLiteral l(type, 0.0f);
init_id = GenerateLiteralIfNeeded(var, &l);
@@ -782,8 +783,8 @@
push_type(spv::Op::OpVariable, std::move(ops));
- if (var->IsDecorated()) {
- for (auto* deco : var->AsDecorated()->decorations()) {
+ if (auto* decorated = var->As<ast::DecoratedVariable>()) {
+ for (auto* deco : decorated->decorations()) {
if (auto* builtin = deco->As<ast::BuiltinDecoration>()) {
push_annot(spv::Op::OpDecorate,
{Operand::Int(var_id), Operand::Int(SpvDecorationBuiltIn),
@@ -1468,8 +1469,8 @@
auto name = lit->name();
bool is_spec_constant = false;
- if (var && var->IsDecorated() &&
- var->AsDecorated()->HasConstantIdDecoration()) {
+ if (var && var->Is<ast::DecoratedVariable>() &&
+ var->As<ast::DecoratedVariable>()->HasConstantIdDecoration()) {
name = "__spec" + name;
is_spec_constant = true;
}
@@ -1483,9 +1484,10 @@
auto result_id = result.to_i();
if (is_spec_constant) {
- push_annot(spv::Op::OpDecorate,
- {Operand::Int(result_id), Operand::Int(SpvDecorationSpecId),
- Operand::Int(var->AsDecorated()->constant_id())});
+ push_annot(
+ spv::Op::OpDecorate,
+ {Operand::Int(result_id), Operand::Int(SpvDecorationSpecId),
+ Operand::Int(var->As<ast::DecoratedVariable>()->constant_id())});
}
if (lit->IsBool()) {
@@ -2701,10 +2703,10 @@
bool has_layout = false;
for (auto* deco : member->decorations()) {
if (auto* offset = deco->As<ast::StructMemberOffsetDecoration>()) {
- push_annot(spv::Op::OpMemberDecorate,
- {Operand::Int(struct_id), Operand::Int(idx),
- Operand::Int(SpvDecorationOffset),
- Operand::Int(offset->offset())});
+ push_annot(
+ spv::Op::OpMemberDecorate,
+ {Operand::Int(struct_id), Operand::Int(idx),
+ Operand::Int(SpvDecorationOffset), Operand::Int(offset->offset())});
has_layout = true;
} else {
error_ = "unknown struct member decoration";
diff --git a/src/writer/wgsl/generator_impl.cc b/src/writer/wgsl/generator_impl.cc
index 0761d80..88dfb21 100644
--- a/src/writer/wgsl/generator_impl.cc
+++ b/src/writer/wgsl/generator_impl.cc
@@ -602,8 +602,8 @@
bool GeneratorImpl::EmitVariable(ast::Variable* var) {
make_indent();
- if (var->IsDecorated()) {
- if (!EmitVariableDecorations(var->AsDecorated())) {
+ if (auto* decorated = var->As<ast::DecoratedVariable>()) {
+ if (!EmitVariableDecorations(decorated)) {
return false;
}
}
diff --git a/src/writer/wgsl/generator_impl.h b/src/writer/wgsl/generator_impl.h
index 1de0b9d..4680036 100644
--- a/src/writer/wgsl/generator_impl.h
+++ b/src/writer/wgsl/generator_impl.h
@@ -27,6 +27,7 @@
#include "src/ast/case_statement.h"
#include "src/ast/constructor_expression.h"
#include "src/ast/continue_statement.h"
+#include "src/ast/decorated_variable.h"
#include "src/ast/discard_statement.h"
#include "src/ast/fallthrough_statement.h"
#include "src/ast/identifier_expression.h"