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

import("//build/config/fuchsia/sdk.gni")
import("//build/dart/dart.gni")
import("//build/dart/toolchain.gni")
import("//build/sdk/sdk_atom.gni")
import("//third_party/flutter/lib/ui/dart_ui.gni")
import("//topaz/public/dart-pkg/fuchsia/sdk_ext.gni")
import("//topaz/public/dart-pkg/zircon/sdk_ext.gni")

declare_args() {
  # Enable all dart analysis
  enable_dart_analysis = true
}

# Defines a Dart library
#
# Parameters
#
#   sources
#     The list of all sources in this library.
#     These sources must be within source_dir.
#
#   sources_required (optional)
#     Whether complete source files are required by the rule. If true, all
#     files under the source_dir must be included in sources.
#     Defaults to true.
#
#   package_root (optional)
#     Path to the directory hosting the library.
#     This is useful for generated content, and can be ignored otherwise.
#     Defaults to ".".
#
#   package_name (optional)
#     Name of the Dart package. This is used as an identifier in code that
#     depends on this library.
#
#   infer_package_name (optional)
#     Infer the package name based on the path to the package.
#
#     NOTE: Exactly one of package_name or infer_package_name must be set.
#
#   source_dir (optional)
#     Path to the directory containing the package sources, relative to
#     package_root.
#     Defaults to "lib".
#
#   deps (optional)
#     List of labels for Dart libraries this library depends on.
#
#   non_dart_deps (optional)
#     List of labels this library depends on that are not Dart libraries. This
#     includes things like actions that generate Dart code. It typically doesn't
#     need to be set.
#     Note that these labels *must* have an explicit toolchain attached.
#
#   disable_analysis (optional)
#     Prevents analysis from being run on this target.
#
#   sdk_category (optional)
#     Publication level of the library in SDKs.
#     See //build/sdk/sdk_atom.gni.
#
#   extra_sources (optional)
#     Additional sources to consider for analysis.
#
# Example of usage:
#
#   dart_library("baz") {
#     package_name = "foo.bar.baz"
#
#     sources = [
#       "blah.dart",
#     ]
#
#     deps = [
#       "//foo/bar/owl",
#     ]
#   }

if (current_toolchain == dart_toolchain) {
  template("dart_library") {
    forward_variables_from(invoker, [ "testonly" ])

    if (defined(invoker.package_name)) {
      package_name = invoker.package_name
    } else if (defined(invoker.infer_package_name) &&
               invoker.infer_package_name) {
      # Compute a package name from the label:
      #   //foo/bar --> foo.bar
      #   //foo/bar:blah --> foo.bar._blah
      #   //garnet/public/foo/bar --> foo.bar
      # Strip public directories.
      full_dir = get_label_info(":$target_name", "dir")
      foreach(sdk_dir, sdk_dirs) {
        full_dir = string_replace(full_dir, "$sdk_dir/", "")
      }
      package_name = full_dir
      package_name = string_replace(package_name, "//", "")
      package_name = string_replace(package_name, "/", ".")

      # If the last directory name does not match the target name, add the
      # target name to the resulting package name.
      name = get_label_info(":$target_name", "name")
      last_dir = get_path_info(full_dir, "name")
      if (last_dir != name) {
        package_name = "$package_name._$name"
      }
    } 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") ]
      }
    }

    package_root = "."
    if (defined(invoker.package_root)) {
      package_root = invoker.package_root
    }

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

    assert(defined(invoker.sources), "Sources must be defined")
    source_file = "$target_gen_dir/$target_name.sources"
    rebased_sources = []
    foreach(source, invoker.sources) {
      rebased_source_dir = rebase_path(source_dir)
      rebased_sources += [ "$rebased_source_dir/$source" ]
    }
    if (defined(invoker.extra_sources)) {
      foreach(source, invoker.extra_sources) {
        rebased_sources += [ rebase_path(source) ]
      }
    }
    write_file(source_file, rebased_sources, "list lines")

    # Dependencies of the umbrella group for the targets in this file.
    group_deps = []

    dot_packages_file = "$target_gen_dir/$target_name.packages"
    dot_packages_target_name = "${target_name}_dot_packages"
    group_deps += [ ":$dot_packages_target_name" ]

    # Creates a .packages file listing dependencies of this library.
    action(dot_packages_target_name) {
      script = "//build/dart/gen_dot_packages.py"

      deps = []
      package_files = []
      foreach(dep, dart_deps) {
        deps += [ "${dep}_dot_packages" ]
        dep_gen_dir = get_label_info(dep, "target_gen_dir")
        dep_name = get_label_info(dep, "name")
        package_files += [ "$dep_gen_dir/$dep_name.packages" ]
      }
      if (defined(invoker.non_dart_deps)) {
        public_deps = invoker.non_dart_deps
      }

      sources = package_files + [
                  # Require a manifest file, allowing the analysis service to
                  # identify the package.
                  "$package_root/pubspec.yaml",
                ]

      outputs = [
        dot_packages_file,
      ]

      args = [
               "--out",
               rebase_path(dot_packages_file),
               "--source-dir",
               rebase_path(source_dir),
               "--package-name",
               package_name,
               "--deps",
             ] + rebase_path(package_files)
    }

    ################################
    # Dart source "verification"
    # Warn if there are dart sources included in the build directory that are
    # not explicitly part of sources. This may cause a failure when syncing to
    # another repository, as they will be excluded from the resulting BUILD
    # file.
    sources_required = true
    if (defined(invoker.sources_required)) {
      sources_required = invoker.sources_required
    }

    if (sources_required) {
      source_verification_target_name = "${target_name}_source_verification"
      output_file = "$target_gen_dir/$target_name.missing"

      action(source_verification_target_name) {
        script = "//build/dart/verify_sources.py"

        outputs = [
          output_file,
        ]

        args = [
          "--package_root",
          rebase_path(package_root),
          "--source_dir",
          source_dir,
          "--stamp",
          rebase_path(output_file),
        ]

        foreach(source, invoker.sources) {
          args += [ source ]
        }
      }
      group_deps += [ ":$source_verification_target_name" ]
    }

    ################################

    # Don't run the analyzer if it is explicitly disabled or if we are using
    # a custom-built Dart SDK in a cross-build.
    with_analysis =
        (!defined(invoker.disable_analysis) || !invoker.disable_analysis) &&
        (use_prebuilt_dart_sdk || host_cpu == target_cpu)
    with_analysis = enable_dart_analysis && with_analysis
    if (with_analysis) {
      options_file = "$package_root/analysis_options.yaml"
      invocation_file = "$target_gen_dir/$target_name.analyzer.sh"
      invocation_target_name = "${target_name}_analysis_runner"
      group_deps += [ ":$invocation_target_name" ]

      dart_analyzer_binary = "$dart_sdk/bin/dartanalyzer"

      # Creates a script which can be used to manually perform analysis.
      # TODO(BLD-256): remove this target.
      action(invocation_target_name) {
        script = "//build/dart/gen_analyzer_invocation.py"

        deps = dart_sdk_deps + [ ":$dot_packages_target_name" ]

        inputs = [
          dart_analyzer_binary,
          dot_packages_file,
          options_file,
          source_file,
        ]

        outputs = [
          invocation_file,
        ]

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

      analysis_target_name = "${target_name}_analysis"
      group_deps += [ ":$analysis_target_name" ]

      # Runs analysis on the sources.
      action(analysis_target_name) {
        script = "//build/dart/run_analysis.py"

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

        output_file = "$target_gen_dir/$target_name.analyzed"

        pool = "//build/dart:dart_pool($dart_toolchain)"

        inputs = [
                   dart_analyzer_binary,
                   dot_packages_file,
                   options_file,
                   source_file,
                 ] + rebased_sources

        outputs = [
          output_file,
        ]

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

        deps = dart_sdk_deps + [ ":$dot_packages_target_name" ]
      }
    }

    group(target_name) {
      # dart_deps are added here to ensure they are fully built.
      # Up to this point, only the targets generating .packages had been
      # depended on.
      deps = dart_deps

      public_deps = group_deps
    }

    ################################################
    # SDK support
    #

    if (defined(invoker.sdk_category) && invoker.sdk_category != "excluded") {
      assert(
          defined(invoker.package_name),
          "Dart libraries published in SDKs must have an explicit package name")

      assert(
          !defined(invoker.extra_sources),
          "Extra sources can not be included in SDKs: put them in source_dir")

      # Dependencies that should normally be included in any SDK containing this
      # target.
      sdk_deps = []

      # Path to SDK metadata files for first-party dependencies.
      sdk_metas = []

      # Path to Dart manifest files for third-party dependencies.
      third_party_pubspecs = []
      if (defined(invoker.deps)) {
        sorted_deps =
            exec_script("//build/dart/sdk/sort_deps.py", invoker.deps, "scope")
        foreach(dep, sorted_deps.local) {
          full_label = get_label_info(dep, "label_no_toolchain")
          sdk_dep = "${full_label}_sdk"
          sdk_deps += [ sdk_dep ]

          gen_dir = get_label_info(sdk_dep, "target_gen_dir")
          name = get_label_info(sdk_dep, "name")
          sdk_metas += [ rebase_path("$gen_dir/$name.meta.json") ]
        }
        foreach(dep, sorted_deps.third_party) {
          path = get_label_info(dep, "dir")
          third_party_pubspecs += [ rebase_path("$path/pubspec.yaml") ]
        }
      }

      file_base = "dart/${invoker.package_name}"

      sdk_sources = []
      sdk_source_mappings = []
      foreach(source, rebased_sources) {
        relative_source = rebase_path(source, source_dir)
        dest = "$file_base/lib/$relative_source"
        sdk_sources += [ dest ]
        sdk_source_mappings += [
          {
            source = source
            dest = dest
          },
        ]
      }

      metadata_target_name = "${target_name}_sdk_metadata"
      metadata_file = "$target_gen_dir/$target_name.sdk_meta.json"
      action(metadata_target_name) {
        script = "//build/dart/sdk/gen_meta_file.py"

        inputs = sdk_metas + third_party_pubspecs

        outputs = [
          metadata_file,
        ]

        args = [
          "--out",
          rebase_path(metadata_file),
          "--name",
          package_name,
          "--root",
          file_base,
        ]
        args += [ "--specs" ] + sdk_metas
        args += [ "--sources" ] + sdk_sources
        args += [ "--third-party-specs" ] + third_party_pubspecs

        deps = sdk_deps
      }

      sdk_atom("${target_name}_sdk") {
        id = "sdk://dart/${invoker.package_name}"

        category = invoker.sdk_category

        meta = {
          source = metadata_file
          dest = "$file_base/meta.json"
          schema = "dart_library"
        }

        deps = sdk_deps

        non_sdk_deps = [ ":$metadata_target_name" ]
        if (defined(invoker.non_dart_deps)) {
          non_sdk_deps += invoker.non_dart_deps
        }

        files = sdk_source_mappings
      }
    }
  }
} else {  # Not the Dart toolchain.
  template("dart_library") {
    group(target_name) {
      not_needed(invoker, "*")

      public_deps = [
        ":$target_name($dart_toolchain)",
      ]
    }
  }
}
