# Copyright 2016 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.

declare_args() {
  # Whether to run analysis on packages as part of the build.
  run_dart_analysis = false
}

# Defines a Dart package
#
# Parameters
#
#   package_name (optional)
#     Name of the dart package. This is used as an identifier in code that
#     depends on this package. In general, this should correspond to the path to
#     the package.  I.e. a dart package in //foo/bar/baz should have the package
#     name "foo.bar.baz"
#
#   infer_package_name (optional)
#     Infer the package name based on the path to the package.
#
#     NOTE: Either package_name or infer_package_name must be set.
#
#   source_dir (optional)
#     Directory containing the package sources. Defaults to "lib".
#
#   deps (optional)
#     List of labels for Dart packages this package depends on.
#
#   non_dart_deps (optional)
#     List of labels this package depends on that are not Dart packages. This
#     includes things like actions that generate Dart code. It typically doesn't
#     need to be set.
#
#   analysis_options (optional)
#     By default, a script to run the analyzer on the contents of the package is
#     generated in the output directory. This parameter contains the path to an
#     analysis options file for this target; otherwise a default set of options
#     is used.
#
#   disable_analysis (optional)
#     Prevents the analysis script from being generated.
#
# Example of usage:
#
#   dart_package("baz") {
#     package_name = "foo.bar.baz"
#     deps = [
#       "//foo/bar/owl"
#     ]
#   }
template("dart_package") {
  if (defined(invoker.package_name)) {
    package_name = invoker.package_name
  } else if (defined(invoker.infer_package_name) && invoker.infer_package_name) {
    target_label = get_label_info(":$target_name", "label_no_toolchain")
    package_name = exec_script("//build/dart/label_to_package_name.py",
                               [ target_label ],
                               "trim string")
  } else {
    assert(false, "Must specify either a package_name or infer_package_name")
  }

  dart_deps = []
  if (defined(invoker.deps)) {
    foreach(dep, invoker.deps) {
      dart_deps += [ get_label_info(dep, "label_no_toolchain") ]
    }
  }

  dot_packages_file = "$target_gen_dir/$target_name.packages"

  source_dir = "lib"
  if (defined(invoker.source_dir)) {
    source_dir = invoker.source_dir
  }

  with_analysis = !defined(invoker.disable_analysis) || !invoker.disable_analysis
  if (with_analysis) {
    dot_packages_target_name = "${target_name}_dot_packages"
  } else {
    dot_packages_target_name = target_name
  }

  action(dot_packages_target_name) {
    script = "//build/dart/gen_dot_packages.py"

    deps = dart_deps
    if (defined(invoker.non_dart_deps)) {
      deps += invoker.non_dart_deps
    }

    outputs = [
      dot_packages_file,
    ]
    depfile = "$dot_packages_file.d"

    args = [
      "--out",
      rebase_path(dot_packages_file, root_build_dir),
      "--source-dir",
      rebase_path(source_dir),
      "--root-build-dir",
      rebase_path(root_build_dir),
      "--root-gen-dir",
      rebase_path(root_gen_dir),
      "--package-name",
      package_name,
      "--depfile",
      rebase_path(depfile),
      "--deps",
    ] + dart_deps
  }

  if (with_analysis) {
    invocation_file = "$target_gen_dir/$target_name.analyzer.sh"

    if (run_dart_analysis) {
      invocation_target_name = "${target_name}_invocation"
    } else {
      invocation_target_name = target_name
    }

    options_file = "//build/dart/default_analysis_options"
    if (defined(invoker.analysis_options)) {
      options_file = invoker.analysis_options
    }

    dart_sdk_label = "//dart:create_sdk($host_toolchain)"
    dart_sdk_out_dir = get_label_info(dart_sdk_label, "root_out_dir")
    dart_sdk_dir = "$dart_sdk_out_dir/dart-sdk"
    dart_analyzer_binary = "$dart_sdk_dir/bin/dartanalyzer"

    action(invocation_target_name) {
      script = "//build/dart/gen_analyzer_invocation.py"

      deps = dart_deps + [
        dart_sdk_label,
        ":$dot_packages_target_name",
      ]

      # Technically this is not strictly needed as even if the contents of the
      # options file change the analysis script should remain unchanged.
      # However, this is a sanity check to ensure at build time that this
      # attribute points to a valid file.
      inputs = [
        options_file,
      ]

      outputs = [
        invocation_file,
      ]

      args = [
        "--out",
        rebase_path(invocation_file),
        "--source-dir",
        rebase_path(source_dir),
        "--dot-packages",
        rebase_path(dot_packages_file),
        "--dartanalyzer",
        rebase_path(dart_analyzer_binary),
        "--package-name",
        package_name,
        "--dart-sdk",
        rebase_path(dart_sdk_dir),
        "--options",
        rebase_path(options_file),
      ]
    }

    if (run_dart_analysis) {
      action(target_name) {
        script = "//build/dart/run_analysis.py"

        depfile = "$target_gen_dir/$target_name.analysis.d"

        output_file = "$target_gen_dir/$target_name.analyzed"

        inputs = [
          options_file,
        ]

        outputs = [
          output_file,
        ]

        args = [
          "--source-dir",
          rebase_path(source_dir),
          "--dot-packages",
          rebase_path(dot_packages_file),
          "--dartanalyzer",
          rebase_path(dart_analyzer_binary),
          "--dart-sdk",
          rebase_path(dart_sdk_dir),
          "--options",
          rebase_path(options_file),
          "--stamp",
          rebase_path(output_file),
          "--depname",
          rebase_path(output_file, root_build_dir),
          "--depfile",
          rebase_path(depfile),
        ]

        deps = [
          ":$invocation_target_name",
        ]
      }
    }
  }
}
