# Copyright 2021 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import("//build/rust/config.gni")

# Defines a clippy target corresponding to a given `rustc_{library/binary/test}` target.
# This will emit json lints to the target's gen directory in a `target_name.clippy` file.
template("clippy") {
  _output = "$target_gen_dir/$target_name"

  # These generated files collect the rlibs of this targets direct and transitive dependencies
  generated_file("$target_name.depsfile") {
    forward_variables_from(invoker, [ "testonly" ])
    deps = invoker.deps
    outputs = [ "$_output.deps" ]
    data_keys = [ "rlib" ]
    walk_keys = [ "rust_barrier" ]
  }
  generated_file("$target_name.transdepsfile") {
    forward_variables_from(invoker, [ "testonly" ])
    deps = invoker.deps
    outputs = [ "$_output.transdeps" ]
    data_keys = [ "searchdir" ]
  }

  action(target_name) {
    # Some clippy targets leak the output dir, but these aren't run remotely, nor are they depended
    # on by anything which does. So just opt out all clippy targets.
    no_output_dir_leaks = false
    forward_variables_from(invoker,
                           [
                             "testonly",
                             "configs",
                             "public_deps",
                           ])
    sources = invoker.sources
    deps = invoker.deps
    deps += [
      ":${invoker.target_name}.depsfile",
      ":${invoker.target_name}.transdepsfile",
    ]
    if (defined(invoker.non_rust_deps)) {
      deps += invoker.non_rust_deps
    }
    mnemonic = "CLIPPY"

    inputs = [
      "$_output.deps",
      "$_output.transdeps",
    ]
    script = "//build/rust/clippy_wrapper.sh"
    output = _output
    outputs = [ output ]

    _jq = "//prebuilt/third_party/jq/${host_platform}/bin/jq"

    args = [
      "--output",
      rebase_path(_output, root_build_dir),
      "--jq",
      rebase_path(_jq, root_build_dir),
    ]

    if (invoker.quiet) {
      args += [ "--quiet" ]
    } else if (clippy_cause_failure) {
      # If we're asked to be quiet above don't fail the build.
      args += [ "--fail" ]
    }

    args += [
      "--",
      "env",
      "{{rustenv}}",
    ]
    if (defined(invoker.rustenv)) {
      args += invoker.rustenv
    }
    args += [
      "$rebased_rustc_prefix/bin/clippy-driver",
      rebase_path(invoker.crate_root, root_build_dir),
      "--sysroot=$rebased_rustc_prefix",
      "--crate-type=${invoker.clippy_crate_type}",
      "{{rustflags}}",
    ]

    if (clippy_force_warn_all) {
      args += [ "--force-warn=clippy::all" ]
    } else {
      _level = "A"
      if (clippy_warn_all) {
        _level = "W"
      }
      args += [
        "-${_level}clippy::all",
        "-Dclippy::correctness",
        "-Dclippy::missing_safety_doc",
      ]
    }
    args += [
      "-Wclippy::expect_fun_call",
      "-Wclippy::large_enum_variant",
      "-Wclippy::large_futures",
      "-Wclippy::unnecessary_mut_passed",
    ]
    args += invoker.rustflags

    if (invoker.clippy_crate_type == "proc-macro") {
      args += [ "--extern=proc_macro" ]
    }

    metadata = {
      # Don't allow clippy targets' dependencies to control which libraries get packaged.
      # Clippy targets don't get the same variant of their non-Rust deps as the actual build
      # targets, which causes conflicts without this metadata.
      distribution_entries_barrier = []
    }
  }
}
