Rework all transforms to transform-on-copy
instead of transform-in-place.
This is a public API breaking change, so I've added the `DAWN_USE_NEW_TINT_TRANSFORM_API` define which is used by Dawn to know which API to use.
As we're going to have to go through the effort of an API breaking change, use this as an opportunity to rename Transformer to Transform, and remove 'Transform' from each of the transforms themselves (they're already in the transform namespace).
Bug: tint:390
Bug: tint:389
Change-Id: I1017507524b76bb4ffd26b95e550ef53ddc891c9
Reviewed-on: https://dawn-review.googlesource.com/c/tint/+/34800
Reviewed-by: dan sinclair <dsinclair@chromium.org>
Commit-Queue: Ben Clayton <bclayton@google.com>
diff --git a/src/transform/bound_array_accessors.h b/src/transform/bound_array_accessors.h
new file mode 100644
index 0000000..b781b4d
--- /dev/null
+++ b/src/transform/bound_array_accessors.h
@@ -0,0 +1,59 @@
+// Copyright 2020 The Tint Authors.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#ifndef SRC_TRANSFORM_BOUND_ARRAY_ACCESSORS_H_
+#define SRC_TRANSFORM_BOUND_ARRAY_ACCESSORS_H_
+
+#include <string>
+
+#include "src/ast/array_accessor_expression.h"
+#include "src/ast/expression.h"
+#include "src/ast/module.h"
+#include "src/ast/statement.h"
+#include "src/context.h"
+#include "src/scope_stack.h"
+#include "src/transform/transform.h"
+
+namespace tint {
+namespace transform {
+
+/// This transform is responsible for clamping all array accesses to be within
+/// the bounds of the array. Any access before the start of the array will clamp
+/// to zero and any access past the end of the array will clamp to
+/// (array length - 1).
+class BoundArrayAccessors : public Transform {
+ public:
+ /// Constructor
+ BoundArrayAccessors();
+ /// Destructor
+ ~BoundArrayAccessors() override;
+
+ /// Runs the transform on `module`, returning the transformation result.
+ /// @note Users of Tint should register the transform with transform manager
+ /// and invoke its Run(), instead of directly calling the transform's Run().
+ /// Calling Run() directly does not perform module state cleanup operations.
+ /// @param module the source module to transform
+ /// @returns the transformation result
+ Output Run(ast::Module* module) override;
+
+ private:
+ ast::ArrayAccessorExpression* Transform(ast::ArrayAccessorExpression* expr,
+ ast::CloneContext* ctx,
+ diag::List* diags);
+};
+
+} // namespace transform
+} // namespace tint
+
+#endif // SRC_TRANSFORM_BOUND_ARRAY_ACCESSORS_H_