diff --git a/src/tint/BUILD.gn b/src/tint/BUILD.gn index 4f17ae2ee3..1ecb7ae081 100644 --- a/src/tint/BUILD.gn +++ b/src/tint/BUILD.gn @@ -213,6 +213,8 @@ libtint_source_set("libtint_core_all_src") { "ast/case_statement.h", "ast/compound_assignment_statement.cc", "ast/compound_assignment_statement.h", + "ast/const.cc", + "ast/const.h", "ast/continue_statement.cc", "ast/continue_statement.h", "ast/depth_multisampled_texture.cc", diff --git a/src/tint/CMakeLists.txt b/src/tint/CMakeLists.txt index f7fb14a8fc..3734367569 100644 --- a/src/tint/CMakeLists.txt +++ b/src/tint/CMakeLists.txt @@ -99,6 +99,8 @@ set(TINT_LIB_SRCS ast/case_statement.h ast/compound_assignment_statement.cc ast/compound_assignment_statement.h + ast/const.cc + ast/const.h ast/continue_statement.cc ast/continue_statement.h ast/depth_multisampled_texture.cc diff --git a/src/tint/ast/const.cc b/src/tint/ast/const.cc new file mode 100644 index 0000000000..6ae8e8cfa2 --- /dev/null +++ b/src/tint/ast/const.cc @@ -0,0 +1,46 @@ +// Copyright 2022 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. + +#include "src/tint/ast/const.h" + +#include "src/tint/program_builder.h" + +TINT_INSTANTIATE_TYPEINFO(tint::ast::Const); + +namespace tint::ast { + +Const::Const(ProgramID pid, + const Source& src, + const Symbol& sym, + const ast::Type* ty, + const Expression* ctor, + AttributeList attrs) + : Base(pid, src, sym, ty, ctor, attrs) { + TINT_ASSERT(AST, ctor != nullptr); +} + +Const::Const(Const&&) = default; + +Const::~Const() = default; + +const Const* Const::Clone(CloneContext* ctx) const { + auto src = ctx->Clone(source); + auto sym = ctx->Clone(symbol); + auto* ty = ctx->Clone(type); + auto* ctor = ctx->Clone(constructor); + auto attrs = ctx->Clone(attributes); + return ctx->dst->create(src, sym, ty, ctor, attrs); +} + +} // namespace tint::ast diff --git a/src/tint/ast/const.h b/src/tint/ast/const.h new file mode 100644 index 0000000000..39ac6c3ca2 --- /dev/null +++ b/src/tint/ast/const.h @@ -0,0 +1,64 @@ +// Copyright 2022 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_TINT_AST_CONST_H_ +#define SRC_TINT_AST_CONST_H_ + +#include "src/tint/ast/variable.h" + +namespace tint::ast { + +/// A "const" declaration is a name for a module-scoped or function-scoped creation-time value. +/// const must have a constructor expression. +/// +/// Examples: +/// +/// ``` +/// const n = 123; // Abstract-integer typed constant +/// const pi = 3.14159265359; // Abstract-float typed constant +/// const max_f32 : f32 = 0x1.fffffep+127; // f32 typed constant +/// ``` +/// @see https://www.w3.org/TR/WGSL/#creation-time-consts +class Const final : public Castable { + public: + /// Create a 'const' creation-time value variable. + /// @param program_id the identifier of the program that owns this node + /// @param source the variable source + /// @param sym the variable symbol + /// @param type the declared variable type + /// @param constructor the constructor expression. Must not be nullptr. + /// @param attributes the variable attributes + Const(ProgramID program_id, + const Source& source, + const Symbol& sym, + const ast::Type* type, + const Expression* constructor, + AttributeList attributes); + + /// Move constructor + Const(Const&&); + + /// Destructor + ~Const() override; + + /// Clones this node and all transitive child nodes using the `CloneContext` + /// `ctx`. + /// @param ctx the clone context + /// @return the newly cloned node + const Const* Clone(CloneContext* ctx) const override; +}; + +} // namespace tint::ast + +#endif // SRC_TINT_AST_CONST_H_