# 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.gn.tmpl
#
# To regenerate run: './tools/run gen'
#
#                       Do not modify this file directly
################################################################################

import("../../../../../../scripts/tint_overrides_with_defaults.gni")

import("${tint_src_dir}/tint.gni")

if (tint_build_unittests) {
  import("//testing/test.gni")
}
if (tint_build_glsl_writer) {
  libtint_source_set("ast_printer") {
    sources = [
      "ast_printer.cc",
      "ast_printer.h",
    ]
    deps = [
      "${tint_src_dir}/api/common",
      "${tint_src_dir}/api/options",
      "${tint_src_dir}/lang/core",
      "${tint_src_dir}/lang/core/constant",
      "${tint_src_dir}/lang/core/type",
      "${tint_src_dir}/lang/wgsl",
      "${tint_src_dir}/lang/wgsl/ast",
      "${tint_src_dir}/lang/wgsl/ast/transform",
      "${tint_src_dir}/lang/wgsl/helpers",
      "${tint_src_dir}/lang/wgsl/program",
      "${tint_src_dir}/lang/wgsl/sem",
      "${tint_src_dir}/utils/containers",
      "${tint_src_dir}/utils/diagnostic",
      "${tint_src_dir}/utils/generator",
      "${tint_src_dir}/utils/ice",
      "${tint_src_dir}/utils/id",
      "${tint_src_dir}/utils/macros",
      "${tint_src_dir}/utils/math",
      "${tint_src_dir}/utils/memory",
      "${tint_src_dir}/utils/reflection",
      "${tint_src_dir}/utils/result",
      "${tint_src_dir}/utils/rtti",
      "${tint_src_dir}/utils/strconv",
      "${tint_src_dir}/utils/symbol",
      "${tint_src_dir}/utils/text",
      "${tint_src_dir}/utils/traits",
    ]

    if (tint_build_glsl_writer) {
      deps += [
        "${tint_src_dir}/lang/glsl/writer/ast_raise",
        "${tint_src_dir}/lang/glsl/writer/common",
      ]
    }

    if (tint_build_hlsl_writer) {
      deps += [ "${tint_src_dir}/lang/hlsl/writer/ast_raise" ]
    }
  }
}
if (tint_build_unittests) {
  if (tint_build_glsl_writer) {
    tint_unittests_source_set("unittests") {
      testonly = true
      sources = [
        "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 = [
        "${tint_src_dir}:gmock_and_gtest",
        "${tint_src_dir}/api/common",
        "${tint_src_dir}/api/options",
        "${tint_src_dir}/lang/core",
        "${tint_src_dir}/lang/core/constant",
        "${tint_src_dir}/lang/core/type",
        "${tint_src_dir}/lang/wgsl",
        "${tint_src_dir}/lang/wgsl/ast",
        "${tint_src_dir}/lang/wgsl/ast:unittests",
        "${tint_src_dir}/lang/wgsl/ast/transform",
        "${tint_src_dir}/lang/wgsl/program",
        "${tint_src_dir}/lang/wgsl/resolver",
        "${tint_src_dir}/lang/wgsl/sem",
        "${tint_src_dir}/utils/containers",
        "${tint_src_dir}/utils/diagnostic",
        "${tint_src_dir}/utils/generator",
        "${tint_src_dir}/utils/ice",
        "${tint_src_dir}/utils/id",
        "${tint_src_dir}/utils/macros",
        "${tint_src_dir}/utils/math",
        "${tint_src_dir}/utils/memory",
        "${tint_src_dir}/utils/reflection",
        "${tint_src_dir}/utils/result",
        "${tint_src_dir}/utils/rtti",
        "${tint_src_dir}/utils/symbol",
        "${tint_src_dir}/utils/text",
        "${tint_src_dir}/utils/traits",
      ]

      if (tint_build_glsl_writer) {
        deps += [
          "${tint_src_dir}/lang/glsl/writer",
          "${tint_src_dir}/lang/glsl/writer/ast_printer",
          "${tint_src_dir}/lang/glsl/writer/common",
        ]
      }
    }
  }
}
