# Copyright 2023 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.

################################################################################
# File generated by 'tools/src/cmd/gen' using the template:
#   tools/src/cmd/gen/build/BUILD.bazel.tmpl
#
# To regenerate run: './tools/run gen'
#
#                       Do not modify this file directly
################################################################################

load("//src/tint:flags.bzl", "COPTS")
load("@bazel_skylib//lib:selects.bzl", "selects")
cc_library(
  name = "transform",
  srcs = [
    "add_block_attribute.cc",
    "add_empty_entry_point.cc",
    "array_length_from_uniform.cc",
    "binding_remapper.cc",
    "builtin_polyfill.cc",
    "canonicalize_entry_point_io.cc",
    "data.cc",
    "demote_to_helper.cc",
    "direct_variable_access.cc",
    "disable_uniformity_analysis.cc",
    "expand_compound_assignment.cc",
    "first_index_offset.cc",
    "get_insertion_point.cc",
    "hoist_to_decl_before.cc",
    "manager.cc",
    "multiplanar_external_texture.cc",
    "preserve_padding.cc",
    "promote_initializers_to_let.cc",
    "promote_side_effects_to_decl.cc",
    "remove_phonies.cc",
    "remove_unreachable_statements.cc",
    "renamer.cc",
    "robustness.cc",
    "simplify_pointers.cc",
    "single_entry_point.cc",
    "std140.cc",
    "substitute_override.cc",
    "transform.cc",
    "unshadow.cc",
    "vectorize_scalar_matrix_initializers.cc",
    "vertex_pulling.cc",
    "zero_init_workgroup_memory.cc",
  ],
  hdrs = [
    "add_block_attribute.h",
    "add_empty_entry_point.h",
    "array_length_from_uniform.h",
    "binding_remapper.h",
    "builtin_polyfill.h",
    "canonicalize_entry_point_io.h",
    "data.h",
    "demote_to_helper.h",
    "direct_variable_access.h",
    "disable_uniformity_analysis.h",
    "expand_compound_assignment.h",
    "first_index_offset.h",
    "get_insertion_point.h",
    "hoist_to_decl_before.h",
    "manager.h",
    "multiplanar_external_texture.h",
    "preserve_padding.h",
    "promote_initializers_to_let.h",
    "promote_side_effects_to_decl.h",
    "remove_phonies.h",
    "remove_unreachable_statements.h",
    "renamer.h",
    "robustness.h",
    "simplify_pointers.h",
    "single_entry_point.h",
    "std140.h",
    "substitute_override.h",
    "transform.h",
    "unshadow.h",
    "vectorize_scalar_matrix_initializers.h",
    "vertex_pulling.h",
    "zero_init_workgroup_memory.h",
  ],
  deps = [
    "//src/tint/api/common",
    "//src/tint/api/options",
    "//src/tint/lang/core",
    "//src/tint/lang/core/constant",
    "//src/tint/lang/core/type",
    "//src/tint/lang/wgsl/ast",
    "//src/tint/lang/wgsl/program",
    "//src/tint/lang/wgsl/resolver",
    "//src/tint/lang/wgsl/sem",
    "//src/tint/utils/containers",
    "//src/tint/utils/diagnostic",
    "//src/tint/utils/ice",
    "//src/tint/utils/id",
    "//src/tint/utils/macros",
    "//src/tint/utils/math",
    "//src/tint/utils/memory",
    "//src/tint/utils/reflection",
    "//src/tint/utils/result",
    "//src/tint/utils/rtti",
    "//src/tint/utils/symbol",
    "//src/tint/utils/text",
    "//src/tint/utils/traits",
  ],
  copts = COPTS,
  visibility = ["//visibility:public"],
)
cc_library(
  name = "test",
  alwayslink = True,
  srcs = [
    "add_block_attribute_test.cc",
    "add_empty_entry_point_test.cc",
    "array_length_from_uniform_test.cc",
    "binding_remapper_test.cc",
    "builtin_polyfill_test.cc",
    "canonicalize_entry_point_io_test.cc",
    "demote_to_helper_test.cc",
    "direct_variable_access_test.cc",
    "disable_uniformity_analysis_test.cc",
    "expand_compound_assignment_test.cc",
    "first_index_offset_test.cc",
    "get_insertion_point_test.cc",
    "helper_test.h",
    "hoist_to_decl_before_test.cc",
    "manager_test.cc",
    "multiplanar_external_texture_test.cc",
    "preserve_padding_test.cc",
    "promote_initializers_to_let_test.cc",
    "promote_side_effects_to_decl_test.cc",
    "remove_phonies_test.cc",
    "remove_unreachable_statements_test.cc",
    "renamer_test.cc",
    "robustness_test.cc",
    "simplify_pointers_test.cc",
    "single_entry_point_test.cc",
    "std140_exhaustive_test.cc",
    "std140_f16_test.cc",
    "std140_f32_test.cc",
    "std140_test.cc",
    "substitute_override_test.cc",
    "transform_test.cc",
    "unshadow_test.cc",
    "vectorize_scalar_matrix_initializers_test.cc",
    "vertex_pulling_test.cc",
    "zero_init_workgroup_memory_test.cc",
  ],
  deps = [
    "//src/tint/api/common",
    "//src/tint/api/options",
    "//src/tint/lang/core",
    "//src/tint/lang/core/constant",
    "//src/tint/lang/core/type",
    "//src/tint/lang/wgsl/ast",
    "//src/tint/lang/wgsl/ast/transform",
    "//src/tint/lang/wgsl/ast:test",
    "//src/tint/lang/wgsl/program",
    "//src/tint/lang/wgsl/reader",
    "//src/tint/lang/wgsl/resolver",
    "//src/tint/lang/wgsl/sem",
    "//src/tint/lang/wgsl/writer",
    "//src/tint/utils/containers",
    "//src/tint/utils/diagnostic",
    "//src/tint/utils/ice",
    "//src/tint/utils/id",
    "//src/tint/utils/macros",
    "//src/tint/utils/math",
    "//src/tint/utils/memory",
    "//src/tint/utils/reflection",
    "//src/tint/utils/result",
    "//src/tint/utils/rtti",
    "//src/tint/utils/symbol",
    "//src/tint/utils/text",
    "//src/tint/utils/traits",
    "@gtest",
  ],
  copts = COPTS,
  visibility = ["//visibility:public"],
)

