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

sdk_outline_dill = "$root_out_dir/ddc_outline.dill"
sdk_full_dill = "$root_out_dir/ddc_platform.dill"
sdk_outline_sound_dill = "$root_out_dir/ddc_outline_sound.dill"
sdk_full_sound_dill = "$root_out_dir/ddc_platform_sound.dill"

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",
    rebase_path("../../pkg/dev_compiler/bin/dartdevc.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"
} else {
  sdk_root = "../../sdk_nnbd"
}

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_sound_sdk",
    ":dartdevc_test_kernel_pkg",
    "../..:create_sdk",
  ]

  # TODO(nshahan) Temporarily here until we decide if we are going to include
  # in the create_sdk target.
  if (!dont_use_nnbd) {
    deps += [ "../../sdk_nnbd:copy_dev_compiler_outline_sound" ]
  }
}

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

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",
    ":async_helper_sound_js",
    ":expect_js",
    ":expect_sound_js",
    ":js_js",
    ":js_sound_js",
    ":meta_js",
    ":meta_sound_js",
  ]
}

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

  if (invoker.sound_null_safety) {
    platform_dep = ":dartdevc_platform_sound"
    sdk_outline = sdk_outline_sound_dill
    js_gen_dir = "$target_gen_dir/pkg_sound"
  } else {
    platform_dep = ":dartdevc_platform"
    sdk_outline = sdk_outline_dill
    js_gen_dir = "$target_gen_dir/pkg_kernel"
  }

  # 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
    out_dir = rebase_path("$js_gen_dir")
    sdk_path = rebase_path(sdk_outline)

    deps = [
      ":dartdevc_files_stamp",
      platform_dep,

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

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

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

    args = [
      "-k",
      "--dart-sdk-summary=$sdk_path",
      "-o$out_dir/$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$out_dir/$dep.dill" ]
      }
    }

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

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

    if (invoker.sound_null_safety) {
      args += [ "--sound-null-safety" ]
    }
  }
}

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

dartdevc_kernel_compile("async_helper_sound_js") {
  package = "async_helper"
  sound_null_safety = true
}

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

dartdevc_kernel_compile("expect_sound_js") {
  package = "expect"
  extra_libraries = [ "minitest" ]
  sound_null_safety = true
}

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

dartdevc_kernel_compile("js_sound_js") {
  package = "js"
  extra_libraries = [ "js_util" ]
  sound_null_safety = true
}

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

dartdevc_kernel_compile("meta_sound_js") {
  package = "meta"
  sound_null_safety = true
}

template("compile_dartdevc_platform") {
  assert(defined(invoker.sound_null_safety),
         "Need 'sound_null_safety' in $target_name.")

  compile_platform(target_name) {
    single_root_scheme = "org-dartlang-sdk"
    single_root_base = rebase_path("$sdk_root/")
    libraries_specification_uri = "org-dartlang-sdk:///lib/libraries.json"

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

    if (invoker.sound_null_safety) {
      args += [
        "--enable-experiment=non-nullable",
        "--nnbd-strong",
      ]

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

      outputs = [
        sdk_full_dill,
        sdk_outline_dill,
      ]
    }
  }
}

compile_dartdevc_platform("dartdevc_platform") {
  sound_null_safety = false
}

compile_dartdevc_platform("dartdevc_platform_sound") {
  sound_null_safety = true
}

# Compiles the DDC SDK's JS code from the platform .dill.
template("dartdevc_sdk_js") {
  assert(defined(invoker.sound_null_safety),
         "Need 'sound_null_safety' in $target_name.")

  if (invoker.sound_null_safety) {
    platform_dep = ":dartdevc_platform_sound"
    platform_input = sdk_full_sound_dill
    js_gen_dir = "$target_gen_dir/sound"
  } else {
    platform_dep = ":dartdevc_platform"
    platform_input = sdk_full_dill
    js_gen_dir = "$target_gen_dir/kernel"
  }

  prebuilt_dart_action(target_name) {
    deps = [
      ":dartdevc_files_stamp",
      "../../pkg:pkg_files_stamp",
      platform_dep,
    ]

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

    outputs = [
      "$js_gen_dir/amd/dart_sdk.js",
      "$js_gen_dir/amd/dart_sdk.js.map",
      "$js_gen_dir/common/dart_sdk.js",
      "$js_gen_dir/common/dart_sdk.js.map",
      "$js_gen_dir/es6/dart_sdk.js",
      "$js_gen_dir/es6/dart_sdk.js.map",
      "$js_gen_dir/legacy/dart_sdk.js",
      "$js_gen_dir/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("$js_gen_dir/amd/dart_sdk.js"),
      "--modules",
      "common",
      "-o",
      rebase_path("$js_gen_dir/common/dart_sdk.js"),
      "--modules",
      "es6",
      "-o",
      rebase_path("$js_gen_dir/es6/dart_sdk.js"),
      "--modules",
      "legacy",
      "-o",
      rebase_path("$js_gen_dir/legacy/dart_sdk.js"),
      rebase_path("$platform_input"),
    ]

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

    if (invoker.sound_null_safety) {
      args += [ "--sound-null-safety" ]
    }
  }
}

dartdevc_sdk_js("dartdevc_kernel_sdk") {
  sound_null_safety = false
}

dartdevc_sdk_js("dartdevc_sound_sdk") {
  sound_null_safety = true
}
