Add BlockStatement insert and non-const global_variables
Insert will be used for adding code at the beginning of a function, and
non-const global_variables to edit decorations.
Bug: dawn:480
Change-Id: I9fbb0210a95b8488c9ce6d9a536a68f169b0cc33
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/25850
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Reviewed-by: Corentin Wallez <cwallez@chromium.org>
diff --git a/src/ast/block_statement.h b/src/ast/block_statement.h
index 4ee0806..3c2a268 100644
--- a/src/ast/block_statement.h
+++ b/src/ast/block_statement.h
@@ -42,6 +42,13 @@
statements_.push_back(std::move(stmt));
}
+ /// Insert a statement to the block
+ /// @param index the index to insert at
+ /// @param stmt the statement to insert
+ void insert(size_t index, std::unique_ptr<ast::Statement> stmt) {
+ statements_.insert(statements_.begin() + index, std::move(stmt));
+ }
+
/// @returns true if the block is empty
bool empty() const { return statements_.empty(); }
/// @returns the number of statements directly in the block
diff --git a/src/ast/block_statement_test.cc b/src/ast/block_statement_test.cc
index f0a6cbd..2d040d3 100644
--- a/src/ast/block_statement_test.cc
+++ b/src/ast/block_statement_test.cc
@@ -38,6 +38,27 @@
EXPECT_EQ(b[0], ptr);
}
+TEST_F(BlockStatementTest, Creation_WithInsert) {
+ auto s1 = std::make_unique<DiscardStatement>();
+ auto s2 = std::make_unique<DiscardStatement>();
+ auto s3 = std::make_unique<DiscardStatement>();
+ auto* p1 = s1.get();
+ auto* p2 = s2.get();
+ auto* p3 = s3.get();
+
+ BlockStatement b;
+ b.insert(0, std::move(s1));
+ b.insert(0, std::move(s2));
+ b.insert(1, std::move(s3));
+
+ // |b| should contain s2, s3, s1
+
+ ASSERT_EQ(b.size(), 3u);
+ EXPECT_EQ(b[0], p2);
+ EXPECT_EQ(b[1], p3);
+ EXPECT_EQ(b[2], p1);
+}
+
TEST_F(BlockStatementTest, Creation_WithSource) {
BlockStatement b(Source{20, 2});
auto src = b.source();
diff --git a/src/ast/module.h b/src/ast/module.h
index d17a0cb..7734026 100644
--- a/src/ast/module.h
+++ b/src/ast/module.h
@@ -57,6 +57,9 @@
/// @returns the global variables for the module
const VariableList& global_variables() const { return global_variables_; }
+ /// @returns the global variables for the module
+ VariableList& global_variables() { return global_variables_; }
+
/// Adds an entry point to the module
/// @param ep the entry point to add
void AddEntryPoint(std::unique_ptr<EntryPoint> ep) {