Partially revert change to collect baseline coverage from individual libraries.

We still want to do that, but not like this. Our infrastructure supports
per-target coverage, and so we also need to support per-target baseline
coverage.

I'm working on better documentation (not hard to be better than no docs),
which will cover this. I left a couple of TODOs to explain how we want to do
it in the future.

--
MOS_MIGRATED_REVID=103379710
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/OutputFileConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/OutputFileConfiguredTarget.java
index fea33ae..73519f9 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/OutputFileConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/OutputFileConfiguredTarget.java
@@ -68,6 +68,12 @@
   }
 
   @Override
+  public NestedSet<Artifact> getBaselineCoverageInstrumentedFiles() {
+    return getProvider(InstrumentedFilesProvider.class, InstrumentedFilesProviderImpl.EMPTY)
+        .getBaselineCoverageInstrumentedFiles();
+  }
+
+  @Override
   public NestedSet<Artifact> getBaselineCoverageArtifacts() {
     return getProvider(InstrumentedFilesProvider.class, InstrumentedFilesProviderImpl.EMPTY)
         .getBaselineCoverageArtifacts();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/BaselineCoverageAction.java b/src/main/java/com/google/devtools/build/lib/rules/test/BaselineCoverageAction.java
index a935857..e0a2d20 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/test/BaselineCoverageAction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/test/BaselineCoverageAction.java
@@ -44,7 +44,6 @@
 @VisibleForTesting
 public final class BaselineCoverageAction extends AbstractFileWriteAction
     implements NotifyOnActionCacheHit {
-
   private final Iterable<Artifact> instrumentedFiles;
 
   private BaselineCoverageAction(
@@ -112,15 +111,13 @@
    * Returns collection of baseline coverage artifacts associated with the given target.
    * Will always return 0 or 1 elements.
    */
-  static NestedSet<Artifact> getBaselineCoverageArtifacts(RuleContext ruleContext,
-      Iterable<Artifact> instrumentedFiles) {
+  static NestedSet<Artifact> create(RuleContext ruleContext, Iterable<Artifact> instrumentedFiles) {
     // Baseline coverage artifacts will still go into "testlogs" directory.
     Artifact coverageData = ruleContext.getPackageRelativeArtifact(
         new PathFragment(ruleContext.getTarget().getName()).getChild("baseline_coverage.dat"),
         ruleContext.getConfiguration().getTestLogsDirectory());
     ruleContext.registerAction(new BaselineCoverageAction(
         ruleContext.getActionOwner(), instrumentedFiles, coverageData));
-
     return NestedSetBuilder.create(Order.STABLE_ORDER, coverageData);
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/InstrumentedFilesCollector.java b/src/main/java/com/google/devtools/build/lib/rules/test/InstrumentedFilesCollector.java
index b782869..b6096b3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/test/InstrumentedFilesCollector.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/test/InstrumentedFilesCollector.java
@@ -65,7 +65,8 @@
 
     NestedSetBuilder<Artifact> instrumentedFilesBuilder = NestedSetBuilder.stableOrder();
     NestedSetBuilder<Artifact> metadataFilesBuilder = NestedSetBuilder.stableOrder();
-    NestedSetBuilder<Artifact> baselineCoverageArtifactsBuilder = NestedSetBuilder.stableOrder();
+    NestedSetBuilder<Artifact> baselineCoverageInstrumentedFilesBuilder =
+        NestedSetBuilder.stableOrder();
 
     Iterable<TransitiveInfoCollection> prereqs = getAllPrerequisites(ruleContext, spec);
 
@@ -75,7 +76,8 @@
       if (provider != null) {
         instrumentedFilesBuilder.addTransitive(provider.getInstrumentedFiles());
         metadataFilesBuilder.addTransitive(provider.getInstrumentationMetadataFiles());
-        baselineCoverageArtifactsBuilder.addTransitive(provider.getBaselineCoverageArtifacts());
+        baselineCoverageInstrumentedFilesBuilder.addTransitive(
+            provider.getBaselineCoverageInstrumentedFiles());
       }
     }
 
@@ -84,6 +86,8 @@
     if (shouldIncludeLocalSources(ruleContext)) {
       NestedSetBuilder<Artifact> localSourcesBuilder = NestedSetBuilder.stableOrder();
       for (TransitiveInfoCollection dep : prereqs) {
+        // TODO(ulfjack): Use different sets of attributes to collect transitive instrumentation
+        // data and to collect local sources, and then remove this if-statement.
         if (dep.getProvider(InstrumentedFilesProvider.class) != null) {
           continue;
         }
@@ -97,6 +101,12 @@
       localSources = localSourcesBuilder.build();
     }
     instrumentedFilesBuilder.addTransitive(localSources);
+    if (withBaselineCoverage) {
+      // Also add the local sources to the baseline coverage instrumented sources, if the current
+      // rule supports baseline coverage.
+      // TODO(ulfjack): Generate a local baseline coverage action, and then merge at the leaves.
+      baselineCoverageInstrumentedFilesBuilder.addTransitive(localSources);
+    }
 
     // Local metadata files.
     if (localMetadataCollector != null) {
@@ -105,13 +115,15 @@
     }
 
     // Baseline coverage actions.
-    if (withBaselineCoverage) {
-      baselineCoverageArtifactsBuilder.addTransitive(
-          BaselineCoverageAction.getBaselineCoverageArtifacts(ruleContext, localSources));
-    }
+    NestedSet<Artifact> baselineCoverageFiles = baselineCoverageInstrumentedFilesBuilder.build();
+
+    // Create one baseline coverage action per target, but for the transitive closure of files.
+    NestedSet<Artifact> baselineCoverageArtifacts =
+        BaselineCoverageAction.create(ruleContext, baselineCoverageFiles);
     return new InstrumentedFilesProviderImpl(instrumentedFilesBuilder.build(),
         metadataFilesBuilder.build(),
-        baselineCoverageArtifactsBuilder.build(),
+        baselineCoverageFiles,
+        baselineCoverageArtifacts,
         ImmutableMap.<String, String>of());
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/InstrumentedFilesProvider.java b/src/main/java/com/google/devtools/build/lib/rules/test/InstrumentedFilesProvider.java
index 2d06204..24017da 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/test/InstrumentedFilesProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/test/InstrumentedFilesProvider.java
@@ -26,7 +26,7 @@
 public interface InstrumentedFilesProvider extends TransitiveInfoProvider {
 
   /**
-   * Returns a collection of source files for instrumented binaries.
+   * The transitive closure of instrumented source files.
    */
   NestedSet<Artifact> getInstrumentedFiles();
 
@@ -35,6 +35,21 @@
    */
   NestedSet<Artifact> getInstrumentationMetadataFiles();
 
+  /**
+   * The transitive closure of instrumented source files for which baseline coverage should be
+   * generated. In general, this is a subset of the instrumented source files: it only contains
+   * instrumented source files from rules that support baseline coverage.
+   */
+  NestedSet<Artifact> getBaselineCoverageInstrumentedFiles();
+
+  /**
+   * The output artifact of the baseline coverage action; this is only ever a single artifact, which
+   * contains baseline coverage for the entire transitive closure of source files.
+   */
+  // TODO(ulfjack): Change this to a single Artifact. Also change how it's generated. It's better to
+  // generate actions such that each action only covers the source files of a single rule, in
+  // particular because baseline coverage is language-specific (it requires a parser for the
+  // specific language), and we don't want to depend on all language parsers from any single rule.
   NestedSet<Artifact> getBaselineCoverageArtifacts();
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/InstrumentedFilesProviderImpl.java b/src/main/java/com/google/devtools/build/lib/rules/test/InstrumentedFilesProviderImpl.java
index b25b632..a56e8d8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/test/InstrumentedFilesProviderImpl.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/test/InstrumentedFilesProviderImpl.java
@@ -29,18 +29,22 @@
       NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
       NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
       NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
+      NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
       ImmutableMap.<String, String>of());
 
   private final NestedSet<Artifact> instrumentedFiles;
   private final NestedSet<Artifact> instrumentationMetadataFiles;
+  private final NestedSet<Artifact> baselineCoverageFiles;
   private final NestedSet<Artifact> baselineCoverageArtifacts;
   private final ImmutableMap<String, String> extraEnv;
 
   public InstrumentedFilesProviderImpl(NestedSet<Artifact> instrumentedFiles,
       NestedSet<Artifact> instrumentationMetadataFiles,
+      NestedSet<Artifact> baselineCoverageFiles,
       NestedSet<Artifact> baselineCoverageArtifacts, Map<String, String> extraEnv) {
     this.instrumentedFiles = instrumentedFiles;
     this.instrumentationMetadataFiles = instrumentationMetadataFiles;
+    this.baselineCoverageFiles = baselineCoverageFiles;
     this.baselineCoverageArtifacts = baselineCoverageArtifacts;
     this.extraEnv = ImmutableMap.copyOf(extraEnv);
   }
@@ -48,6 +52,7 @@
   public InstrumentedFilesProviderImpl(NestedSet<Artifact> instrumentedFiles,
       NestedSet<Artifact> instrumentationMetadataFiles, Map<String, String> extraEnv) {
     this(instrumentedFiles, instrumentationMetadataFiles,
+        NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
         NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER), extraEnv);
   }
 
@@ -62,6 +67,11 @@
   }
 
   @Override
+  public NestedSet<Artifact> getBaselineCoverageInstrumentedFiles() {
+    return baselineCoverageFiles;
+  }
+
+  @Override
   public NestedSet<Artifact> getBaselineCoverageArtifacts() {
     return baselineCoverageArtifacts;
   }