# 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_ir) {
  libtint_source_set("ir") {
    sources = [
      "access.cc",
      "access.h",
      "binary.cc",
      "binary.h",
      "bitcast.cc",
      "bitcast.h",
      "block.cc",
      "block.h",
      "block_param.cc",
      "block_param.h",
      "break_if.cc",
      "break_if.h",
      "builder.cc",
      "builder.h",
      "builtin_call.cc",
      "builtin_call.h",
      "call.cc",
      "call.h",
      "constant.cc",
      "constant.h",
      "construct.cc",
      "construct.h",
      "continue.cc",
      "continue.h",
      "control_instruction.cc",
      "control_instruction.h",
      "convert.cc",
      "convert.h",
      "core_builtin_call.cc",
      "core_builtin_call.h",
      "disassembler.cc",
      "disassembler.h",
      "discard.cc",
      "discard.h",
      "exit.cc",
      "exit.h",
      "exit_if.cc",
      "exit_if.h",
      "exit_loop.cc",
      "exit_loop.h",
      "exit_switch.cc",
      "exit_switch.h",
      "function.cc",
      "function.h",
      "function_param.cc",
      "function_param.h",
      "if.cc",
      "if.h",
      "instruction.cc",
      "instruction.h",
      "instruction_result.cc",
      "instruction_result.h",
      "intrinsic_call.cc",
      "intrinsic_call.h",
      "let.cc",
      "let.h",
      "load.cc",
      "load.h",
      "load_vector_element.cc",
      "load_vector_element.h",
      "location.h",
      "loop.cc",
      "loop.h",
      "module.cc",
      "module.h",
      "multi_in_block.cc",
      "multi_in_block.h",
      "next_iteration.cc",
      "next_iteration.h",
      "operand_instruction.cc",
      "operand_instruction.h",
      "return.cc",
      "return.h",
      "store.cc",
      "store.h",
      "store_vector_element.cc",
      "store_vector_element.h",
      "switch.cc",
      "switch.h",
      "swizzle.cc",
      "swizzle.h",
      "terminate_invocation.cc",
      "terminate_invocation.h",
      "terminator.cc",
      "terminator.h",
      "unary.cc",
      "unary.h",
      "unreachable.cc",
      "unreachable.h",
      "user_call.cc",
      "user_call.h",
      "validator.cc",
      "validator.h",
      "value.cc",
      "value.h",
      "var.cc",
      "var.h",
    ]
    deps = [
      "${tint_src_dir}/api/common",
      "${tint_src_dir}/lang/core",
      "${tint_src_dir}/lang/core/constant",
      "${tint_src_dir}/lang/core/type",
      "${tint_src_dir}/utils/containers",
      "${tint_src_dir}/utils/diagnostic",
      "${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_unittests) {
  if (tint_build_ir) {
    tint_unittests_source_set("unittests") {
      testonly = true
      sources = [
        "access_test.cc",
        "binary_test.cc",
        "bitcast_test.cc",
        "block_param_test.cc",
        "block_test.cc",
        "break_if_test.cc",
        "constant_test.cc",
        "construct_test.cc",
        "continue_test.cc",
        "convert_test.cc",
        "core_builtin_call_test.cc",
        "discard_test.cc",
        "exit_if_test.cc",
        "exit_loop_test.cc",
        "exit_switch_test.cc",
        "function_param_test.cc",
        "function_test.cc",
        "if_test.cc",
        "instruction_result_test.cc",
        "instruction_test.cc",
        "intrinsic_call_test.cc",
        "ir_helper_test.h",
        "let_test.cc",
        "load_test.cc",
        "load_vector_element_test.cc",
        "loop_test.cc",
        "module_test.cc",
        "multi_in_block_test.cc",
        "next_iteration_test.cc",
        "operand_instruction_test.cc",
        "return_test.cc",
        "store_test.cc",
        "store_vector_element_test.cc",
        "switch_test.cc",
        "swizzle_test.cc",
        "unary_test.cc",
        "user_call_test.cc",
        "validator_test.cc",
        "value_test.cc",
        "var_test.cc",
      ]
      deps = [
        "${tint_src_dir}:gmock_and_gtest",
        "${tint_src_dir}/api/common",
        "${tint_src_dir}/lang/core",
        "${tint_src_dir}/lang/core/constant",
        "${tint_src_dir}/lang/core/type",
        "${tint_src_dir}/utils/containers",
        "${tint_src_dir}/utils/diagnostic",
        "${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_ir) {
        deps += [ "${tint_src_dir}/lang/core/ir" ]
      }
    }
  }
}
