# 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 || tint_build_benchmarks) {
  import("//testing/test.gni")
}

libtint_source_set("type") {
  sources = [
    "abstract_float.cc",
    "abstract_float.h",
    "abstract_int.cc",
    "abstract_int.h",
    "abstract_numeric.cc",
    "abstract_numeric.h",
    "array.cc",
    "array.h",
    "array_count.cc",
    "array_count.h",
    "atomic.cc",
    "atomic.h",
    "bool.cc",
    "bool.h",
    "builtin_structs.cc",
    "builtin_structs.h",
    "clone_context.h",
    "depth_multisampled_texture.cc",
    "depth_multisampled_texture.h",
    "depth_texture.cc",
    "depth_texture.h",
    "external_texture.cc",
    "external_texture.h",
    "f16.cc",
    "f16.h",
    "f32.cc",
    "f32.h",
    "i32.cc",
    "i32.h",
    "manager.cc",
    "manager.h",
    "matrix.cc",
    "matrix.h",
    "multisampled_texture.cc",
    "multisampled_texture.h",
    "node.cc",
    "node.h",
    "numeric_scalar.cc",
    "numeric_scalar.h",
    "pointer.cc",
    "pointer.h",
    "reference.cc",
    "reference.h",
    "sampled_texture.cc",
    "sampled_texture.h",
    "sampler.cc",
    "sampler.h",
    "sampler_kind.cc",
    "sampler_kind.h",
    "scalar.cc",
    "scalar.h",
    "storage_texture.cc",
    "storage_texture.h",
    "struct.cc",
    "struct.h",
    "texture.cc",
    "texture.h",
    "texture_dimension.cc",
    "texture_dimension.h",
    "type.cc",
    "type.h",
    "u32.cc",
    "u32.h",
    "unique_node.cc",
    "unique_node.h",
    "vector.cc",
    "vector.h",
    "void.cc",
    "void.h",
  ]
  deps = [
    "${tint_src_dir}/lang/core",
    "${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/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) {
  tint_unittests_source_set("unittests") {
    sources = [
      "array_test.cc",
      "atomic_test.cc",
      "bool_test.cc",
      "builtin_structs_test.cc",
      "depth_multisampled_texture_test.cc",
      "depth_texture_test.cc",
      "external_texture_test.cc",
      "f16_test.cc",
      "f32_test.cc",
      "helper_test.h",
      "i32_test.cc",
      "manager_test.cc",
      "matrix_test.cc",
      "multisampled_texture_test.cc",
      "pointer_test.cc",
      "reference_test.cc",
      "sampled_texture_test.cc",
      "sampler_test.cc",
      "storage_texture_test.cc",
      "struct_test.cc",
      "texture_test.cc",
      "type_test.cc",
      "u32_test.cc",
      "vector_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}/lang/wgsl",
      "${tint_src_dir}/lang/wgsl/ast",
      "${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/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",
    ]
  }
}
