# 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
#
# Do not modify this file directly
################################################################################

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

import("${tint_src_dir}/tint.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/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/common" ]
    }
  }
}
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/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",
      ]
    }
  }
}
