# 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 = "ast_printer",
  srcs = [
    "ast_printer.cc",
  ],
  hdrs = [
    "ast_printer.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",
    "//src/tint/lang/wgsl/ast",
    "//src/tint/lang/wgsl/ast/transform",
    "//src/tint/lang/wgsl/helpers",
    "//src/tint/lang/wgsl/program",
    "//src/tint/lang/wgsl/sem",
    "//src/tint/utils/containers",
    "//src/tint/utils/diagnostic",
    "//src/tint/utils/generator",
    "//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/strconv",
    "//src/tint/utils/symbol",
    "//src/tint/utils/text",
    "//src/tint/utils/traits",
  ] + select({
    ":tint_build_glsl_writer": [
      "//src/tint/lang/glsl/writer/ast_raise",
      "//src/tint/lang/glsl/writer/common",
    ],
    "//conditions:default": [],
  }) + select({
    ":tint_build_hlsl_writer": [
      "//src/tint/lang/hlsl/writer/ast_raise",
    ],
    "//conditions:default": [],
  }),
  copts = COPTS,
  visibility = ["//visibility:public"],
)
cc_library(
  name = "test",
  alwayslink = True,
  srcs = [
    "array_accessor_test.cc",
    "assign_test.cc",
    "ast_printer_test.cc",
    "binary_test.cc",
    "bitcast_test.cc",
    "block_test.cc",
    "break_test.cc",
    "builtin_test.cc",
    "builtin_texture_test.cc",
    "call_test.cc",
    "case_test.cc",
    "cast_test.cc",
    "constructor_test.cc",
    "continue_test.cc",
    "discard_test.cc",
    "function_test.cc",
    "helper_test.h",
    "identifier_test.cc",
    "if_test.cc",
    "import_test.cc",
    "loop_test.cc",
    "member_accessor_test.cc",
    "module_constant_test.cc",
    "return_test.cc",
    "sanitizer_test.cc",
    "storage_buffer_test.cc",
    "switch_test.cc",
    "type_test.cc",
    "unary_op_test.cc",
    "uniform_buffer_test.cc",
    "variable_decl_statement_test.cc",
    "workgroup_var_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",
    "//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/resolver",
    "//src/tint/lang/wgsl/sem",
    "//src/tint/utils/containers",
    "//src/tint/utils/diagnostic",
    "//src/tint/utils/generator",
    "//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",
  ] + select({
    ":tint_build_glsl_writer": [
      "//src/tint/lang/glsl/writer",
      "//src/tint/lang/glsl/writer/ast_printer",
      "//src/tint/lang/glsl/writer/common",
    ],
    "//conditions:default": [],
  }),
  copts = COPTS,
  visibility = ["//visibility:public"],
)

alias(
  name = "tint_build_glsl_writer",
  actual = "//src/tint:tint_build_glsl_writer_true",
)

alias(
  name = "tint_build_hlsl_writer",
  actual = "//src/tint:tint_build_hlsl_writer_true",
)

