// Copyright 2019 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.google.devtools.build.lib.starlarkbuildapi.test;

import com.google.devtools.build.docgen.annot.DocCategory;
import com.google.devtools.build.lib.collect.nestedset.Depset;
import com.google.devtools.build.lib.starlarkbuildapi.core.StructApi;
import net.starlark.java.annot.StarlarkBuiltin;
import net.starlark.java.annot.StarlarkMethod;

/** Contains information about instrumented files sources and instrumentation metadata. */
@StarlarkBuiltin(
    name = "InstrumentedFilesInfo",
    category = DocCategory.PROVIDER,
    doc =
        "Contains information about source files and instrumentation metadata files for rule"
            + " targets matched by <a"
            + " href=\"https://bazel.build/reference/command-line-reference#flag--instrumentation_filter\"><code>--instrumentation_filter</code></a>"
            + " for purposes of <a href=\"https://bazel.build/extending/rules#code_coverage\">code"
            + " coverage data collection</a>. When coverage data collection is enabled, a manifest"
            + " containing the combined paths in <a"
            + " href=\"#instrumented_files\"><code>instrumented_files</code></a> and <a"
            + " href=\"#metadata_files\"><code>metadata_files</code></a> are passed to the test"
            + " action as inputs, with the manifest's path noted in the environment variable"
            + " <code>COVERAGE_MANIFEST</code>. The metadata files, but not the source files, are"
            + " also passed to the test action as inputs. When <code>InstrumentedFilesInfo</code>"
            + " is returned by an <a href=\"https://bazel.build/rules/aspects\">aspect</a>'s"
            + " implementation function, any <code>InstrumentedFilesInfo</code> from the base rule"
            + " target is ignored.")
public interface InstrumentedFilesInfoApi extends StructApi {

  @StarlarkMethod(
      name = "instrumented_files",
      doc =
          "<a href=\"../builtins/depset.html\"><code>depset</code></a> of <a"
              + " href=\"../builtins/File.html\"><code>File</code></a> objects representing"
              + " instrumented source files for this target and its dependencies.",
      structField = true)
  Depset getInstrumentedFilesForStarlark();

  @StarlarkMethod(
      name = "metadata_files",
      doc =
          "<a href=\"../builtins/depset.html\"><code>depset</code></a> of <a"
              + " href=\"../builtins/File.html\"><code>File</code></a> objects representing"
              + " coverage metadata files for this target and its dependencies. These files contain"
              + " additional information required to generate LCOV-format coverage output after the"
              + " code is executed, e.g. the <code>.gcno</code> files generated when"
              + " <code>gcc</code> is run with <code>-ftest-coverage</code>.",
      structField = true)
  Depset getInstrumentationMetadataFilesForStarlark();
}
