# Copyright (c) 2016, the Dart project authors.  Please see the AUTHORS file
# for details. 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/dart/dart_action.gni")
import("../../sdk_args.gni")
import("../../utils/compile_platform.gni")
import("../application_snapshot.gni")
import("../create_timestamp.gni")

patched_sdk_dir = "$target_gen_dir/patched_sdk"
sdk_summary = "$target_gen_dir/ddc_sdk.sum"

# TODO(sigmund): rename to ddc_outline.dill to be consistent with the naming
# convention from other tools.
sdk_outline_dill = "$root_out_dir/ddc_sdk.dill"
sdk_full_dill = "$root_out_dir/ddc_platform.dill"

if (dont_use_nnbd) {
  libraries_specification_path = "sdk/lib/libraries.json"
} else {
  libraries_specification_path = "sdk_nnbd/lib/libraries.json"
}

application_snapshot("dartdevc") {
  main_dart = "../../pkg/dev_compiler/bin/dartdevc.dart"

  training_args = [
    "--dart-sdk",
    rebase_path("../../sdk"),
    "--dart-sdk-summary",
    rebase_path(sdk_outline_dill),
    "-k",
    "-o",
    "dartdevc.js",
  ]

  if (dont_use_nnbd) {
    training_args += [ rebase_path("../../pkg/dev_compiler/bin/dartdevc.dart") ]
  } else {
    training_args += [
      "--enable-experiment=non-nullable",

      # TODO(sigmund): restore training with dartdevc.dart. Currently blocked by
      # some regressions in type-promotion in the CFE when nnbd is enabled.
      # The following test file is pretty simple and has no imports, so it
      # should be easier to compile while we bootstrap NNBD.
      rebase_path("../../tests/language_2/abstract/equal_test.dart"),
    ]
  }

  deps = [
    ":dartdevc_kernel_sdk",
    ":dartdevc_platform",
  ]

  inputs = [ sdk_outline_dill ]
}

# TODO(#38701) Cleanup after merging the forked SDK into mainline.
if (dont_use_nnbd) {
  sdk_root = "../../sdk"
  libraries_specification_path = "sdk/lib/libraries.json"
} else {
  sdk_root = "../../sdk_nnbd"
  libraries_specification_path = "sdk_nnbd/lib/libraries.json"
}

sdk_lib_files = exec_script("../../tools/list_dart_files.py",
                            [
                              "absolute",
                              rebase_path("$sdk_root/lib"),
                            ],
                            "list lines")

compiler_files = exec_script("../../tools/list_dart_files.py",
                             [
                               "absolute",
                               rebase_path("../../pkg/compiler"),
                             ],
                             "list lines")

dev_compiler_files = exec_script("../../tools/list_dart_files.py",
                                 [
                                   "absolute",
                                   rebase_path("../../pkg/dev_compiler"),
                                 ],
                                 "list lines")

template("dart2js_compile") {
  assert(defined(invoker.main), "Must specify the main file")
  main = invoker.main
  assert(defined(invoker.out), "Must specify the out file")
  out = invoker.out
  abs_main = rebase_path(main)
  abs_output = rebase_path(out)

  prebuilt_dart_action(target_name) {
    deps = [ "../compiler:compile_dart2js_platform" ]

    inputs = sdk_lib_files + compiler_files + dev_compiler_files + [
               "$root_out_dir/dart2js_platform.dill",
               "$root_out_dir/dart2js_outline.dill",
             ]
    outputs = [ out ]

    script = "../../pkg/compiler/lib/src/dart2js.dart"

    packages = "../../.packages"

    args = [
      "$abs_main",
      "-m",
      "-o$abs_output",
      "--no-source-maps",
      "--platform-binaries=" + rebase_path("$root_out_dir"),
    ]
  }
}

dart2js_compile("stack_trace_mapper") {
  main = rebase_path("../../pkg/dev_compiler/web/stack_trace_mapper.dart")
  out = "$root_out_dir/dev_compiler/build/web/dart_stack_trace_mapper.js"
}

# Apply dev_compiler's patch files to create the Dart version of the dartdevc
# SDK.
prebuilt_dart_action("dartdevc_patch_sdk") {
  deps = [
    ":dartdevc_files_stamp",
    ":dartdevc_sdk_patch_stamp",

    # The patch script uses several packages, including analyzer, so consider
    # it dirty if any of those change.
    "../../pkg:pkg_files_stamp",
  ]

  script = "../../pkg/dev_compiler/tool/patch_sdk.dart"

  inputs = sdk_lib_files

  # Arbitrarily use the version file as a token file to check against to see if
  # the sources have changed.
  # TODO(rnystrom): List the outputs more precisely?
  outputs = [ "$patched_sdk_dir/version" ]

  args = [
    "--libraries",
    rebase_path("$sdk_root/lib/libraries.json"),
    "--target",
    "dartdevc",
    "--out",
    rebase_path("$patched_sdk_dir/"),
  ]

  # TODO(#38701) Cleanup after merging the forked SDK into mainline.
  if (dont_use_nnbd) {
    args += [ "--no-nnbd" ]
  }
}

# Builds everything needed to run dartdevc tests using test.dart.
group("dartdevc_test") {
  deps = [
    ":dartdevc",
    ":dartdevc_kernel_sdk",
    ":dartdevc_test_kernel_pkg",
    "../..:create_sdk",
  ]
}

# Builds everything needed to run dartdevc tests locally using test.dart without
# --use-sdk. This is the same as dartdevc_test, but skips things rely on
# building the Dart VM and create_sdk.
group("dartdevc_test_local") {
  deps = [
    ":dartdevc_kernel_sdk",
    ":dartdevc_test_kernel_pkg",
  ]
}

group("dartdevc_test_kernel_local") {
  deps = [
    ":dartdevc_kernel_sdk",
    ":dartdevc_test_kernel_pkg",
  ]
}

create_timestamp_file("dartdevc_files_stamp") {
  path = rebase_path("../../pkg/dev_compiler/lib")
  output = "$target_gen_dir/dartdevc_files.stamp"
}

create_timestamp_file("dartdevc_sdk_patch_stamp") {
  path = rebase_path("$sdk_root/lib/_internal/js_dev_runtime")
  output = "$target_gen_dir/dartdevc_sdk_patch_stamp.stamp"
}

# Compiles to JavaScript any package used from tests.
# TODO(sigmund): generate a js bundle or a module that load these indirectly so
# we can stop referring to this list of packages explicitly in the test_runner.
group("dartdevc_test_kernel_pkg") {
  deps = [
    ":async_helper_js",
    ":collection_js",
    ":expect_js",
    ":js_js",
    ":matcher_js",
    ":meta_js",
    ":path_js",
    ":stack_trace_js",
  ]
}

template("dartdevc_kernel_compile") {
  assert(defined(invoker.package),
         "Need 'package' in $target_name (the name of the package)")

  # Other optional invoker parameters:
  #   * extra_libraries: entrypoints to include in the module as
  #     "package:package_name/library_name.dart" (the rule implicitly adds
  #     the default import "package:package_name/package_name.dart").
  #   * package_dependencies: the name of other packages this package depends
  #     on. When providing `name`, a separate `dartdevc_kernel_compile` target
  #     named `${name}_js` must exist.
  #   * args: additional args to pass to dartdevc

  prebuilt_dart_action(target_name) {
    script = "../../pkg/dev_compiler/bin/dartdevc.dart"
    module = invoker.package
    outdir = rebase_path("$target_gen_dir")
    sdk_path = rebase_path(sdk_outline_dill)

    deps = [
      ":dartdevc_files_stamp",
      ":dartdevc_platform",

      # TODO(sigmund): depend only on the compiler and the actual files in the
      # package
      "../../pkg:pkg_files_stamp",
    ]

    inputs = [
      sdk_outline_dill,
      "$target_gen_dir/dartdevc_files.stamp",
      "$root_gen_dir/pkg_files.stamp",
    ]

    outputs = [
      "$target_gen_dir/pkg_kernel/$module.dill",
      "$target_gen_dir/pkg_kernel/$module.js",
    ]

    args = [
      "-k",
      "--dart-sdk-summary=$sdk_path",
      "-o$outdir/pkg_kernel/$module.js",
      "package:$module/$module.dart",
    ]

    if (defined(invoker.extra_libraries)) {
      foreach(lib, invoker.extra_libraries) {
        args += [ "package:$module/$lib.dart" ]
      }
    }

    if (defined(invoker.package_dependencies)) {
      foreach(dep, invoker.package_dependencies) {
        deps += [ ":${dep}_js" ]
        args += [ "-s$outdir/pkg_kernel/$dep.dill" ]
      }
    }

    if (defined(invoker.args)) {
      args += invoker.args
    }

    # TODO(38701): Cleanup after merging the forked SDK into mainline.
    if (!dont_use_nnbd) {
      args += [ "--enable-experiment=non-nullable" ]
    }
  }
}

dartdevc_kernel_compile("async_helper_js") {
  package = "async_helper"
}

dartdevc_kernel_compile("collection_js") {
  package = "collection"
}

dartdevc_kernel_compile("expect_js") {
  package = "expect"
  extra_libraries = [ "minitest" ]
}

dartdevc_kernel_compile("js_js") {
  package = "js"
  extra_libraries = [ "js_util" ]
}

dartdevc_kernel_compile("matcher_js") {
  package = "matcher"
  package_dependencies = [ "stack_trace" ]
}

dartdevc_kernel_compile("meta_js") {
  package = "meta"
}

dartdevc_kernel_compile("path_js") {
  package = "path"
}

dartdevc_kernel_compile("stack_trace_js") {
  package = "stack_trace"
  package_dependencies = [ "path" ]
}

compile_platform("dartdevc_platform") {
  single_root_scheme = "org-dartlang-sdk"
  single_root_base = rebase_path("../../")
  libraries_specification_uri =
      "org-dartlang-sdk:///$libraries_specification_path"

  outputs = [
    sdk_full_dill,
    sdk_outline_dill,
  ]

  args = [
    "--target=dartdevc",
    "dart:core",
  ]

  # TODO(38701): Cleanup after merging the forked SDK into mainline.
  if (!dont_use_nnbd) {
    args += [ "--enable-experiment=non-nullable" ]
  }
}

# Compiles the DDC SDK's kernel summary and JS code.
prebuilt_dart_action("dartdevc_kernel_sdk") {
  deps = [
    ":dartdevc_files_stamp",
    ":dartdevc_platform",
    "../../pkg:pkg_files_stamp",
  ]

  inputs = [
    "$target_gen_dir/dartdevc_files.stamp",
    "$root_gen_dir/pkg_files.stamp",
    sdk_full_dill,
  ]

  outputs = [
    "$target_gen_dir/kernel/amd/dart_sdk.js",
    "$target_gen_dir/kernel/amd/dart_sdk.js.map",
    "$target_gen_dir/kernel/common/dart_sdk.js",
    "$target_gen_dir/kernel/common/dart_sdk.js.map",
    "$target_gen_dir/kernel/es6/dart_sdk.js",
    "$target_gen_dir/kernel/es6/dart_sdk.js.map",
    "$target_gen_dir/kernel/legacy/dart_sdk.js",
    "$target_gen_dir/kernel/legacy/dart_sdk.js.map",
  ]

  script = "../../pkg/dev_compiler/tool/compile_dartdevc_sdk.dart"

  args = [
    "--multi-root-scheme",
    "org-dartlang-sdk",
    "--multi-root-output-path",
    rebase_path("$target_gen_dir/../../../"),
    "--modules",
    "amd",
    "-o",
    rebase_path("$target_gen_dir/kernel/amd/dart_sdk.js"),
    "--modules",
    "common",
    "-o",
    rebase_path("$target_gen_dir/kernel/common/dart_sdk.js"),
    "--modules",
    "es6",
    "-o",
    rebase_path("$target_gen_dir/kernel/es6/dart_sdk.js"),
    "--modules",
    "legacy",
    "-o",
    rebase_path("$target_gen_dir/kernel/legacy/dart_sdk.js"),
    rebase_path("$sdk_full_dill"),
  ]

  # TODO(38701): Cleanup after merging the forked SDK into mainline.
  if (!dont_use_nnbd) {
    args += [ "--enable-experiment=non-nullable" ]
  }
}
