# 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("../invoke_dart.gni")

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

analyzer_files = exec_script("../../tools/list_dart_files.py",
                             [ 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",
                          [ rebase_path("../../pkg/analyzer_cli") ],
                          "list lines")
  inputs = cli_files + analyzer_files
}

sdk_lib_files = exec_script("../../tools/list_dart_files.py",
                            [ 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")
  invoke_dart(target_name) {
    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")
    abs_output = rebase_path(output)

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

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

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