# 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("../application_snapshot.gni")
import("../create_timestamp.gni")

patched_sdk_dir = "$target_gen_dir/patched_sdk"
sdk_summary = "$target_gen_dir/ddc_sdk.sum"
sdk_dill = "$target_gen_dir/kernel/ddc_sdk.dill"
sdk_libraries_json = "$target_gen_dir/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_dill),
    "-k",
    "-o",
    "dartdevc.js",
    rebase_path("../../pkg/dev_compiler/bin/dartdevc.dart"),
  ]

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

  inputs = [
    sdk_dill,
  ]
}

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

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") {
  # TODO(rnystrom): Unfork DDC's patch_sdk.dart script with the
  # tools/patch_sdk.dart and then change this to use generate_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"

  # The main SDK library sources.
  inputs = sdk_lib_files

  # dev_compiler's additional sources and patch files.
  inputs += exec_script("../../tools/list_dart_files.py",
                        [
                          "absolute",
                          rebase_path("$sdk_root/lib/_internal/js_dev_runtime"),
                        ],
                        "list lines")

  # 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 = [
    rebase_path("../../"),
    rebase_path("$sdk_root/lib/_internal/js_dev_runtime"),
    rebase_path(patched_sdk_dir),
  ]

  # TODO(#38701) Cleanup after merging the forked SDK into mainline.
  if (use_nnbd) {
    args += [ "sdk_nnbd" ]
  }
}

# Compiles the Dart core libraries and DDC runtime to an analyzer summary and
# JS.
prebuilt_dart_action("dartdevc_sdk") {
  deps = [
    ":dartdevc_files_stamp",
    ":dartdevc_patch_sdk",
    "../../pkg:pkg_files_stamp",
  ]

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

  inputs = [
    "../../pkg/dev_compiler/tool/build_sdk.dart",

    # Since the entire patched SDK is built in one step, if any file changes,
    # they all will. Instead of listing them all as outputs of
    # dartdevc_patch_sdk (which would require something like a depfile), just
    # use version as the token file whose timestamp we track.
    # TODO(rnystrom): Do something better?
    "$patched_sdk_dir/version",

    # If dev_compiler itself changes, it can affect the generated SDK.
    "$target_gen_dir/dartdevc_files.stamp",

    # Likewise, the packages dev_compiler depends on may affect its output.
    "$root_gen_dir/pkg_files.stamp",
  ]

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

  args = [
    "--dart-sdk",
    rebase_path(patched_sdk_dir),
    "--dart-sdk-summary=build",
    "--summary-out",
    rebase_path(sdk_summary),
    "--source-map",
    "--source-map-comment",
    "--modules=amd",
    "-o",
    rebase_path("$target_gen_dir/js/amd/dart_sdk.js"),
    "--modules=es6",
    "-o",
    rebase_path("$target_gen_dir/js/es6/dart_sdk.js"),
    "--modules=common",
    "-o",
    rebase_path("$target_gen_dir/js/common/dart_sdk.js"),
    "--modules=legacy",
    "-o",
    rebase_path("$target_gen_dir/js/legacy/dart_sdk.js"),
  ]

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

      # TODO(38813): Ignore incorrect analyzer errors.
      "--unsafe-force-compile",
    ]
  }
}

# Builds everything needed to run dartdevc tests using test.dart.
group("dartdevc_test") {
  deps = [
    ":dartdevc",
    ":dartdevc_kernel_sdk",
    ":dartdevc_sdk",
    ":dartdevc_test_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_sdk",
    ":dartdevc_test_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 the packages used by the tests to JS with dartdevc so that they are
# available for loading by the tests.
prebuilt_dart_action("dartdevc_test_pkg") {
  deps = [
    ":dartdevc_files_stamp",
    ":dartdevc_kernel_sdk",
    ":dartdevc_kernel_sdk_libraries_json",
    ":dartdevc_kernel_sdk_outline",
    ":dartdevc_sdk",
    "../../pkg:pkg_files_stamp",
  ]

  inputs = [
    sdk_dill,
    sdk_libraries_json,
    sdk_summary,
    "$target_gen_dir/dartdevc_files.stamp",
    "$root_gen_dir/pkg_files.stamp",
  ]

  outputs = [
    "$target_gen_dir/pkg/async_helper.js",
    "$target_gen_dir/pkg/async_helper.sum",
    "$target_gen_dir/pkg/collection.js",
    "$target_gen_dir/pkg/collection.sum",
    "$target_gen_dir/pkg/expect.js",
    "$target_gen_dir/pkg/expect.sum",
    "$target_gen_dir/pkg/js.js",
    "$target_gen_dir/pkg/js.sum",
    "$target_gen_dir/pkg/matcher.js",
    "$target_gen_dir/pkg/matcher.sum",
    "$target_gen_dir/pkg/meta.js",
    "$target_gen_dir/pkg/meta.sum",
    "$target_gen_dir/pkg/path.js",
    "$target_gen_dir/pkg/path.sum",
    "$target_gen_dir/pkg/stack_trace.js",
    "$target_gen_dir/pkg/stack_trace.sum",

    # TODO(rnystrom): Remove this when unittest is no longer used. Also remove
    # any of the above packages that are only here because unittest uses them.
    "$target_gen_dir/pkg/unittest.js",
    "$target_gen_dir/pkg/unittest.sum",

    "$target_gen_dir/pkg_kernel/async_helper.dill",
    "$target_gen_dir/pkg_kernel/async_helper.js",
    "$target_gen_dir/pkg_kernel/collection.dill",
    "$target_gen_dir/pkg_kernel/collection.js",
    "$target_gen_dir/pkg_kernel/expect.dill",
    "$target_gen_dir/pkg_kernel/expect.js",
    "$target_gen_dir/pkg_kernel/js.dill",
    "$target_gen_dir/pkg_kernel/js.js",
    "$target_gen_dir/pkg_kernel/matcher.dill",
    "$target_gen_dir/pkg_kernel/matcher.js",
    "$target_gen_dir/pkg_kernel/meta.dill",
    "$target_gen_dir/pkg_kernel/meta.js",
    "$target_gen_dir/pkg_kernel/path.dill",
    "$target_gen_dir/pkg_kernel/path.js",
    "$target_gen_dir/pkg_kernel/stack_trace.dill",
    "$target_gen_dir/pkg_kernel/stack_trace.js",

    # TODO(rnystrom): Remove this when unittest is no longer used. Also remove
    # any of the above packages that are only here because unittest uses them.
    "$target_gen_dir/pkg_kernel/unittest.dill",
    "$target_gen_dir/pkg_kernel/unittest.js",
  ]

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

  args = [
    "--analyzer-sdk",
    rebase_path(sdk_summary),
    "--kernel-sdk",
    rebase_path(sdk_dill),
    "--output",
    rebase_path("$target_gen_dir"),
  ]

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

      # TODO(rnystrom): Most of the packages used by tests can be cleanly
      # compiled as opted-in libraries, but js.dart has an optional parameter
      # of type String with no default value. Changing that would be a breaking
      # API change. For now, ignore the error.
      "--unsafe-force-compile",
    ]
  }
}

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

  inputs = [
    "../../utils/bazel/kernel_worker.dart",
    "$target_gen_dir/dartdevc_files.stamp",
    "$root_gen_dir/pkg_files.stamp",
  ]

  outputs = [
    sdk_dill,
  ]

  script = "../../utils/bazel/kernel_worker.dart"

  args = [
    "--summary-only",
    "--target",
    "ddc",
    "--multi-root-scheme",
    "org-dartlang-sdk",
    "--multi-root",
    "file:///" + rebase_path(sdk_root),
    "--libraries-file",
    "org-dartlang-sdk:///lib/libraries.json",
    "--output",
    rebase_path(sdk_dill),
    "--source",
    "dart:core",
  ]

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

copy("dartdevc_kernel_sdk_libraries_json") {
  sources = [
    rebase_path("$sdk_root/lib/libraries.json"),
  ]
  outputs = [
    sdk_libraries_json,
  ]
}

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

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

  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/bin/dartdevc.dart"

  args = [
    "-k",
    "--compile-sdk",
    "dart:core",
    "--no-summarize",
    "--multi-root-scheme",
    "org-dartlang-sdk",
    "--multi-root",
    "file:///" + rebase_path(sdk_root),
    "--multi-root-output-path",
    rebase_path("$target_gen_dir/../../"),
    "--libraries-file",
    "org-dartlang-sdk:///lib/libraries.json",
    "--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"),
  ]

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