# 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",
                           ])
    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
    }

    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 (clippy_cause_failure) {
      args += [ "--fail" ]
    }
    args += [
      "--",
      "env",
    ]
    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}}",
      "-Wwarnings",  # undo -Dwarnings
    ]

    if (clippy_force_warn) {
      args += [ "--force-warn=clippy::all" ]
    } else {
      _level = "A"
      if (clippy_warn) {
        _level = "W"
      }
      args += [
        "-${_level}clippy::all",
        "-Dclippy::correctness",
        "-Dclippy::missing_safety_doc",
      ]
    }
    args += invoker.rustflags

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