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

group("dartanalyzer") {
  deps = [
    ":generate_dartanalyzer_snapshot",
    ":generate_summary_spec",
    ":generate_summary_strong",
  ]
}

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

application_snapshot("generate_dartanalyzer_snapshot") {
  main_dart = "../../pkg/analyzer_cli/bin/analyzer.dart"
  training_args = [
    "--dart-sdk=" + rebase_path("../../sdk"),
    rebase_path("../../tests/language/first_test.dart"),
  ]
  name = "dartanalyzer"
  cli_files = exec_script("../../tools/list_dart_files.py",
                          [
                            "absolute",
                            rebase_path("../../pkg/analyzer_cli"),
                          ],
                          "list lines")
  inputs = cli_files + analyzer_files
}

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

template("generate_summary") {
  assert(defined(invoker.type), "Must specify the summary type")
  type = invoker.type
  assert(type == "spec" || type == "strong")
  compiled_action(target_name) {
    tool = "../../runtime/bin:dart"
    inputs = sdk_lib_files + analyzer_files

    output = "$root_gen_dir/$type.sum"
    outputs = [
      output,
    ]

    dot_packages = rebase_path("../../.packages")
    build_sdk_summaries =
        rebase_path("../../pkg/analyzer/tool/summary/build_sdk_summaries.dart")

    args = [
      "--packages=$dot_packages",
      build_sdk_summaries,
      "build-$type",
      rebase_path(output),
      rebase_path("../../sdk"),
    ]
  }
}

generate_summary("generate_summary_spec") {
  type = "spec"
}

generate_summary("generate_summary_strong") {
  type = "strong"
}
