Migrate InstrumentedFilesProvider to Starlark provider pattern

Progress toward #6241

RELNOTES: None.
PiperOrigin-RevId: 222463226
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
index d0dbde1..ae8875e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java
@@ -39,7 +39,7 @@
 import com.google.devtools.build.lib.analysis.constraints.TopLevelConstraintSemantics;
 import com.google.devtools.build.lib.analysis.test.CoverageReportActionFactory;
 import com.google.devtools.build.lib.analysis.test.CoverageReportActionFactory.CoverageReportActionsWrapper;
-import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProvider;
+import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -528,7 +528,7 @@
       ArtifactsToOwnerLabels.Builder topLevelArtifactsToOwnerLabels) {
     NestedSetBuilder<Artifact> baselineCoverageArtifacts = NestedSetBuilder.stableOrder();
     for (ConfiguredTarget target : configuredTargets) {
-      InstrumentedFilesProvider provider = target.getProvider(InstrumentedFilesProvider.class);
+      InstrumentedFilesInfo provider = target.get(InstrumentedFilesInfo.SKYLARK_CONSTRUCTOR);
       if (provider != null) {
         TopLevelArtifactHelper.addArtifactsWithOwnerLabel(
             provider.getBaselineCoverageArtifacts(),
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
index 181f6d5..74d51a8 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java
@@ -34,7 +34,7 @@
 import com.google.devtools.build.lib.analysis.test.AnalysisTestActionBuilder;
 import com.google.devtools.build.lib.analysis.test.AnalysisTestResultInfo;
 import com.google.devtools.build.lib.analysis.test.ExecutionInfo;
-import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProvider;
+import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo;
 import com.google.devtools.build.lib.analysis.test.TestActionBuilder;
 import com.google.devtools.build.lib.analysis.test.TestEnvironmentInfo;
 import com.google.devtools.build.lib.analysis.test.TestProvider;
@@ -269,7 +269,10 @@
     }
     TestActionBuilder testActionBuilder =
         new TestActionBuilder(ruleContext)
-            .setInstrumentedFiles(providersBuilder.getProvider(InstrumentedFilesProvider.class));
+            .setInstrumentedFiles(
+                (InstrumentedFilesInfo)
+                    providersBuilder.getProvider(
+                        InstrumentedFilesInfo.SKYLARK_CONSTRUCTOR.getKey()));
 
     TestEnvironmentInfo environmentProvider =
         (TestEnvironmentInfo)
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java b/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java
index a4c793b..cf72a5a 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java
@@ -26,7 +26,7 @@
 import com.google.devtools.build.lib.analysis.TopLevelArtifactHelper.ArtifactsInOutputGroup;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
-import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProvider;
+import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo;
 import com.google.devtools.build.lib.analysis.test.TestConfiguration;
 import com.google.devtools.build.lib.analysis.test.TestProvider;
 import com.google.devtools.build.lib.buildeventstream.ArtifactGroupNamer;
@@ -152,8 +152,8 @@
         isTest
             ? targetAndData.getConfiguredTarget().getProvider(TestProvider.class).getTestParams()
             : null;
-    InstrumentedFilesProvider instrumentedFilesProvider =
-        targetAndData.getConfiguredTarget().getProvider(InstrumentedFilesProvider.class);
+    InstrumentedFilesInfo instrumentedFilesProvider =
+        targetAndData.getConfiguredTarget().get(InstrumentedFilesInfo.SKYLARK_CONSTRUCTOR);
     if (instrumentedFilesProvider == null) {
       this.baselineCoverageArtifacts = null;
     } else {
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/FileConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/FileConfiguredTarget.java
index 1082572..a19914c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/FileConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/FileConfiguredTarget.java
@@ -23,7 +23,7 @@
 import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap;
 import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMapBuilder;
 import com.google.devtools.build.lib.analysis.VisibilityProvider;
-import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProvider;
+import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -33,6 +33,7 @@
 import com.google.devtools.build.lib.packages.Provider;
 import com.google.devtools.build.lib.skyframe.BuildConfigurationValue;
 import com.google.devtools.build.lib.util.FileType;
+import javax.annotation.Nullable;
 
 /**
  * A ConfiguredTarget for a source FileTarget. (Generated files use a subclass,
@@ -47,7 +48,8 @@
       Label label,
       BuildConfigurationValue.Key configurationKey,
       NestedSet<PackageGroupContents> visibility,
-      Artifact artifact) {
+      Artifact artifact,
+      @Nullable InstrumentedFilesInfo instrumentedFilesInfo) {
     super(label, configurationKey, visibility);
     NestedSet<Artifact> filesToBuild = NestedSetBuilder.create(Order.STABLE_ORDER, artifact);
     FileProvider fileProvider = new FileProvider(filesToBuild);
@@ -59,8 +61,9 @@
             .put(LicensesProvider.class, this)
             .add(fileProvider)
             .add(filesToRunProvider);
-    if (this instanceof InstrumentedFilesProvider) {
-      builder.put(InstrumentedFilesProvider.class, this);
+
+    if (instrumentedFilesInfo != null) {
+      builder.put(instrumentedFilesInfo);
     }
     this.providers = builder.build();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/InputFileConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/InputFileConfiguredTarget.java
index 16eca3a..79d839d 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/InputFileConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/InputFileConfiguredTarget.java
@@ -49,7 +49,7 @@
       NestedSet<PackageGroupContents> visibility,
       SourceArtifact artifact,
       NestedSet<TargetLicense> licenses) {
-    super(label, null, visibility, artifact);
+    super(label, null, visibility, artifact, null);
     this.artifact = artifact;
     this.licenses = licenses;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/OutputFileConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/OutputFileConfiguredTarget.java
index ab170a5..bbe02d5 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/OutputFileConfiguredTarget.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/OutputFileConfiguredTarget.java
@@ -21,8 +21,7 @@
 import com.google.devtools.build.lib.analysis.TargetContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
-import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProvider;
-import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProviderImpl;
+import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.packages.OutputFile;
@@ -32,12 +31,10 @@
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.Instantiator;
 import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
-import com.google.devtools.build.lib.util.Pair;
 
 /** A ConfiguredTarget for an OutputFile. */
 @AutoCodec
-public class OutputFileConfiguredTarget extends FileConfiguredTarget
-    implements InstrumentedFilesProvider {
+public class OutputFileConfiguredTarget extends FileConfiguredTarget {
 
   private final Artifact artifact;
   private final TransitiveInfoCollection generatingRule;
@@ -62,11 +59,18 @@
       NestedSet<PackageGroupContents> visibility,
       Artifact artifact,
       TransitiveInfoCollection generatingRule) {
-    super(label, configurationKey, visibility, artifact);
+    super(label, configurationKey, visibility, artifact, instrumentedFilesInfo(generatingRule));
     this.artifact = artifact;
     this.generatingRule = Preconditions.checkNotNull(generatingRule);
   }
 
+  private static InstrumentedFilesInfo instrumentedFilesInfo(
+      TransitiveInfoCollection generatingRule) {
+    Preconditions.checkNotNull(generatingRule);
+    InstrumentedFilesInfo provider = generatingRule.get(InstrumentedFilesInfo.SKYLARK_CONSTRUCTOR);
+    return provider == null ? InstrumentedFilesInfo.EMPTY : provider;
+  }
+
   public TransitiveInfoCollection getGeneratingRule() {
     return generatingRule;
   }
@@ -94,49 +98,6 @@
         .hasOutputLicenses();
   }
 
-
-  @Override
-  public NestedSet<Artifact> getInstrumentedFiles() {
-    return getProvider(InstrumentedFilesProvider.class, InstrumentedFilesProviderImpl.EMPTY)
-        .getInstrumentedFiles();
-  }
-
-  @Override
-  public NestedSet<Artifact> getInstrumentationMetadataFiles() {
-    return getProvider(InstrumentedFilesProvider.class, InstrumentedFilesProviderImpl.EMPTY)
-        .getInstrumentationMetadataFiles();
-  }
-
-  @Override
-  public NestedSet<Artifact> getBaselineCoverageInstrumentedFiles() {
-    return getProvider(InstrumentedFilesProvider.class, InstrumentedFilesProviderImpl.EMPTY)
-        .getBaselineCoverageInstrumentedFiles();
-  }
-
-  @Override
-  public NestedSet<Artifact> getBaselineCoverageArtifacts() {
-    return getProvider(InstrumentedFilesProvider.class, InstrumentedFilesProviderImpl.EMPTY)
-        .getBaselineCoverageArtifacts();
-  }
-
-  @Override
-  public NestedSet<Artifact> getCoverageSupportFiles() {
-    return getProvider(InstrumentedFilesProvider.class, InstrumentedFilesProviderImpl.EMPTY)
-        .getCoverageSupportFiles();
-  }
-
-  @Override
-  public NestedSet<Pair<String, String>> getCoverageEnvironment() {
-    return getProvider(InstrumentedFilesProvider.class, InstrumentedFilesProviderImpl.EMPTY)
-        .getCoverageEnvironment();
-  }
-
-  @Override
-  public NestedSet<Pair<String, String>> getReportedToActualSources() {
-    return getProvider(InstrumentedFilesProvider.class, InstrumentedFilesProviderImpl.EMPTY)
-        .getReportedToActualSources();
-  }
-
   /**
    * Returns the corresponding provider from the generating rule, if it is non-null, or {@code
    * defaultValue} otherwise.
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java
index c0d611a..64247f0 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java
@@ -31,7 +31,7 @@
 import com.google.devtools.build.lib.analysis.Whitelist;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector.InstrumentationSpec;
-import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProvider;
+import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
@@ -260,14 +260,14 @@
         new InstrumentationSpec(fileTypeSet)
             .withSourceAttributes(sourceAttributes.toArray(new String[0]))
             .withDependencyAttributes(dependencyAttributes.toArray(new String[0]));
-    InstrumentedFilesProvider instrumentedFilesProvider =
+    InstrumentedFilesInfo instrumentedFilesProvider =
         InstrumentedFilesCollector.collect(
             ruleContext,
             instrumentationSpec,
             InstrumentedFilesCollector.NO_METADATA_COLLECTOR,
             /* rootFiles= */ Collections.emptySet(),
             /* reportedToActualSources= */ NestedSetBuilder.create(Order.STABLE_ORDER));
-    builder.addProvider(InstrumentedFilesProvider.class, instrumentedFilesProvider);
+    builder.addNativeDeclaredProvider(instrumentedFilesProvider);
   }
 
   public static NestedSet<Artifact> convertToOutputGroupValue(Location loc, String outputGroup,
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java
index 136ab55..72ac8b0 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java
@@ -50,7 +50,7 @@
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
 import com.google.devtools.build.lib.analysis.stringtemplate.ExpansionException;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector;
-import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProvider;
+import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.events.Location;
 import com.google.devtools.build.lib.packages.Aspect;
@@ -611,7 +611,7 @@
       return InstrumentedFilesCollector.shouldIncludeLocalSources(ruleContext);
     }
     TransitiveInfoCollection target = (TransitiveInfoCollection) targetUnchecked;
-    return (target.getProvider(InstrumentedFilesProvider.class) != null)
+    return (target.get(InstrumentedFilesInfo.SKYLARK_CONSTRUCTOR) != null)
         && InstrumentedFilesCollector.shouldIncludeLocalSources(config, target);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/test/InstrumentedFilesCollector.java b/src/main/java/com/google/devtools/build/lib/analysis/test/InstrumentedFilesCollector.java
index 2f1ae0e..e10f4fc 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/test/InstrumentedFilesCollector.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/test/InstrumentedFilesCollector.java
@@ -42,13 +42,13 @@
 public final class InstrumentedFilesCollector {
 
   /**
-   * Forwards any instrumented files from the given target's dependencies (as defined in
-   * {@code dependencyAttributes}) for further export. No files from this target are considered
+   * Forwards any instrumented files from the given target's dependencies (as defined in {@code
+   * dependencyAttributes}) for further export. No files from this target are considered
    * instrumented.
    *
    * @return instrumented file provider of all dependencies in {@code dependencyAttributes}
    */
-  public static InstrumentedFilesProvider forward(
+  public static InstrumentedFilesInfo forward(
       RuleContext ruleContext, String... dependencyAttributes) {
     return collect(
         ruleContext,
@@ -58,7 +58,7 @@
         /* reportedToActualSources= */ NestedSetBuilder.create(Order.STABLE_ORDER));
   }
 
-  public static InstrumentedFilesProvider collect(
+  public static InstrumentedFilesInfo collect(
       RuleContext ruleContext,
       InstrumentationSpec spec,
       LocalMetadataCollector localMetadataCollector,
@@ -71,7 +71,7 @@
         /* reportedToActualSources= */ NestedSetBuilder.create(Order.STABLE_ORDER));
   }
 
-  public static InstrumentedFilesProvider collect(
+  public static InstrumentedFilesInfo collect(
       RuleContext ruleContext,
       InstrumentationSpec spec,
       LocalMetadataCollector localMetadataCollector,
@@ -95,7 +95,7 @@
    * coverage actions for the transitive closure of source files (if <code>withBaselineCoverage
    * </code> is true).
    */
-  public static InstrumentedFilesProvider collect(
+  public static InstrumentedFilesInfo collect(
       RuleContext ruleContext,
       InstrumentationSpec spec,
       LocalMetadataCollector localMetadataCollector,
@@ -114,7 +114,7 @@
         /* reportedToActualSources= */ NestedSetBuilder.create(Order.STABLE_ORDER));
   }
 
-  public static InstrumentedFilesProvider collect(
+  public static InstrumentedFilesInfo collect(
       RuleContext ruleContext,
       InstrumentationSpec spec,
       LocalMetadataCollector localMetadataCollector,
@@ -127,7 +127,7 @@
     Preconditions.checkNotNull(spec);
 
     if (!ruleContext.getConfiguration().isCodeCoverageEnabled()) {
-      return InstrumentedFilesProviderImpl.EMPTY;
+      return InstrumentedFilesInfo.EMPTY;
     }
 
     NestedSetBuilder<Artifact> instrumentedFilesBuilder = NestedSetBuilder.stableOrder();
@@ -145,7 +145,7 @@
     // Transitive instrumentation data.
     for (TransitiveInfoCollection dep :
         getAllPrerequisites(ruleContext, spec.dependencyAttributes)) {
-      InstrumentedFilesProvider provider = dep.getProvider(InstrumentedFilesProvider.class);
+      InstrumentedFilesInfo provider = dep.get(InstrumentedFilesInfo.SKYLARK_CONSTRUCTOR);
       if (provider != null) {
         instrumentedFilesBuilder.addTransitive(provider.getInstrumentedFiles());
         metadataFilesBuilder.addTransitive(provider.getInstrumentationMetadataFiles());
@@ -162,7 +162,7 @@
       NestedSetBuilder<Artifact> localSourcesBuilder = NestedSetBuilder.stableOrder();
       for (TransitiveInfoCollection dep :
           getAllPrerequisites(ruleContext, spec.sourceAttributes)) {
-        if (!spec.splitLists && dep.getProvider(InstrumentedFilesProvider.class) != null) {
+        if (!spec.splitLists && dep.get(InstrumentedFilesInfo.SKYLARK_CONSTRUCTOR) != null) {
           continue;
         }
         for (Artifact artifact : dep.getProvider(FileProvider.class).getFilesToBuild()) {
@@ -194,7 +194,7 @@
     // Create one baseline coverage action per target, but for the transitive closure of files.
     NestedSet<Artifact> baselineCoverageArtifacts =
         BaselineCoverageAction.create(ruleContext, baselineCoverageFiles);
-    return new InstrumentedFilesProviderImpl(
+    return new InstrumentedFilesInfo(
         instrumentedFilesBuilder.build(),
         metadataFilesBuilder.build(),
         baselineCoverageFiles,
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/test/InstrumentedFilesInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/test/InstrumentedFilesInfo.java
new file mode 100644
index 0000000..cf59445
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/test/InstrumentedFilesInfo.java
@@ -0,0 +1,136 @@
+// Copyright 2014 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.analysis.test;
+
+import com.google.devtools.build.lib.actions.Artifact;
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
+import com.google.devtools.build.lib.collect.nestedset.Order;
+import com.google.devtools.build.lib.events.Location;
+import com.google.devtools.build.lib.packages.BuiltinProvider;
+import com.google.devtools.build.lib.packages.Info;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
+import com.google.devtools.build.lib.util.Pair;
+
+/** An implementation class for the InstrumentedFilesProvider interface. */
+@AutoCodec
+public final class InstrumentedFilesInfo extends Info {
+  /** Singleton provider instance for {@link InstrumentedFilesInfo}. */
+  public static final InstrumentedFilesProvider SKYLARK_CONSTRUCTOR =
+      new InstrumentedFilesProvider();
+
+  public static final InstrumentedFilesInfo EMPTY =
+      new InstrumentedFilesInfo(
+          NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
+          NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
+          NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
+          NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
+          NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
+          NestedSetBuilder.<Pair<String, String>>emptySet(Order.COMPILE_ORDER),
+          NestedSetBuilder.emptySet(Order.STABLE_ORDER));
+
+  private final NestedSet<Artifact> instrumentedFiles;
+  private final NestedSet<Artifact> instrumentationMetadataFiles;
+  private final NestedSet<Artifact> baselineCoverageFiles;
+  private final NestedSet<Artifact> baselineCoverageArtifacts;
+  private final NestedSet<Artifact> coverageSupportFiles;
+  private final NestedSet<Pair<String, String>> coverageEnvironment;
+  private final NestedSet<Pair<String, String>> reportedToActualSources;
+
+  public InstrumentedFilesInfo(
+      NestedSet<Artifact> instrumentedFiles,
+      NestedSet<Artifact> instrumentationMetadataFiles,
+      NestedSet<Artifact> baselineCoverageFiles,
+      NestedSet<Artifact> baselineCoverageArtifacts,
+      NestedSet<Artifact> coverageSupportFiles,
+      NestedSet<Pair<String, String>> coverageEnvironment,
+      NestedSet<Pair<String, String>> reportedToActualSources) {
+    super(SKYLARK_CONSTRUCTOR, Location.BUILTIN);
+    this.instrumentedFiles = instrumentedFiles;
+    this.instrumentationMetadataFiles = instrumentationMetadataFiles;
+    this.baselineCoverageFiles = baselineCoverageFiles;
+    this.baselineCoverageArtifacts = baselineCoverageArtifacts;
+    this.coverageSupportFiles = coverageSupportFiles;
+    this.coverageEnvironment = coverageEnvironment;
+    this.reportedToActualSources = reportedToActualSources;
+  }
+
+  /** The transitive closure of instrumented source files. */
+  public NestedSet<Artifact> getInstrumentedFiles() {
+    return instrumentedFiles;
+  }
+
+  /** Returns a collection of instrumentation metadata files. */
+  public NestedSet<Artifact> getInstrumentationMetadataFiles() {
+    return instrumentationMetadataFiles;
+  }
+
+  /**
+   * 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.
+   */
+  // 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.
+  public NestedSet<Artifact> getBaselineCoverageInstrumentedFiles() {
+    return baselineCoverageFiles;
+  }
+
+  /**
+   * 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.
+   */
+  public NestedSet<Artifact> getBaselineCoverageArtifacts() {
+    return baselineCoverageArtifacts;
+  }
+
+  /**
+   * Extra files that are needed on the inputs of test actions for coverage collection to happen,
+   * for example, {@code gcov}.
+   *
+   * <p>They aren't mentioned in the instrumented files manifest.
+   */
+  public NestedSet<Artifact> getCoverageSupportFiles() {
+    return coverageSupportFiles;
+  }
+
+  /** Environment variables that need to be set for tests collecting code coverage. */
+  public NestedSet<Pair<String, String>> getCoverageEnvironment() {
+    return coverageEnvironment;
+  }
+
+  /**
+   * A set of pairs of reported source file path and the actual source file path, relative to the
+   * workspace directory, if the two values are different. If the reported source file is the same
+   * as the actual source path it will not be included in this set.
+   *
+   * <p>This is useful for virtual include paths in C++, which get reported at the include location
+   * and not the real source path. For example, the reported include source file can be
+   * "bazel-out/k8-fastbuild/bin/include/common/_virtual_includes/strategy/strategy.h", but its
+   * actual source path is "include/common/strategy.h".
+   */
+  public NestedSet<Pair<String, String>> getReportedToActualSources() {
+    return reportedToActualSources;
+  }
+
+  /** Provider implementation for {@link InstrumentedFilesInfo}. */
+  public static class InstrumentedFilesProvider extends BuiltinProvider<InstrumentedFilesInfo> {
+
+    public InstrumentedFilesProvider() {
+      super("InstrumentedFilesInfo", InstrumentedFilesInfo.class);
+    }
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/test/InstrumentedFilesProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/test/InstrumentedFilesProvider.java
deleted file mode 100644
index 5fc7efc..0000000
--- a/src/main/java/com/google/devtools/build/lib/analysis/test/InstrumentedFilesProvider.java
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright 2014 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.analysis.test;
-
-import com.google.devtools.build.lib.actions.Artifact;
-import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
-import com.google.devtools.build.lib.util.Pair;
-
-/** A provider of instrumented file sources and instrumentation metadata. */
-public interface InstrumentedFilesProvider extends TransitiveInfoProvider {
-  /**
-   * The transitive closure of instrumented source files.
-   */
-  NestedSet<Artifact> getInstrumentedFiles();
-
-  /**
-   * Returns a collection of instrumentation metadata files.
-   */
-  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();
-
-  /**
-   * Extra files that are needed on the inputs of test actions for coverage collection to happen,
-   * for example, {@code gcov}.
-   *
-   * <p>They aren't mentioned in the instrumented files manifest.
-   */
-  NestedSet<Artifact> getCoverageSupportFiles();
-
-  /**
-   * Environment variables that need to be set for tests collecting code coverage.
-   */
-  NestedSet<Pair<String, String>> getCoverageEnvironment();
-
-  /**
-   * A set of pairs of reported source file path and the actual source file path, relative to the
-   * workspace directory, if the two values are different. If the reported source file is the same
-   * as the actual source path it will not be included in this set.
-   *
-   * <p>This is useful for virtual include paths in C++, which get reported at the include location
-   * and not the real source path. For example, the reported include source file can be
-   * "bazel-out/k8-fastbuild/bin/include/common/_virtual_includes/strategy/strategy.h", but its
-   * actual source path is "include/common/strategy.h".
-   */
-  NestedSet<Pair<String, String>> getReportedToActualSources();
-}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/test/InstrumentedFilesProviderImpl.java b/src/main/java/com/google/devtools/build/lib/analysis/test/InstrumentedFilesProviderImpl.java
deleted file mode 100644
index 19219d5..0000000
--- a/src/main/java/com/google/devtools/build/lib/analysis/test/InstrumentedFilesProviderImpl.java
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright 2014 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.analysis.test;
-
-import com.google.devtools.build.lib.actions.Artifact;
-import com.google.devtools.build.lib.collect.nestedset.NestedSet;
-import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
-import com.google.devtools.build.lib.collect.nestedset.Order;
-import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
-import com.google.devtools.build.lib.util.Pair;
-
-/** An implementation class for the InstrumentedFilesProvider interface. */
-@AutoCodec
-public final class InstrumentedFilesProviderImpl implements InstrumentedFilesProvider {
-  public static final InstrumentedFilesProvider EMPTY =
-      new InstrumentedFilesProviderImpl(
-          NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-          NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-          NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-          NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-          NestedSetBuilder.<Artifact>emptySet(Order.STABLE_ORDER),
-          NestedSetBuilder.<Pair<String, String>>emptySet(Order.COMPILE_ORDER),
-          NestedSetBuilder.emptySet(Order.STABLE_ORDER));
-
-  private final NestedSet<Artifact> instrumentedFiles;
-  private final NestedSet<Artifact> instrumentationMetadataFiles;
-  private final NestedSet<Artifact> baselineCoverageFiles;
-  private final NestedSet<Artifact> baselineCoverageArtifacts;
-  private final NestedSet<Artifact> coverageSupportFiles;
-  private final NestedSet<Pair<String, String>> coverageEnvironment;
-  private final NestedSet<Pair<String, String>> reportedToActualSources;
-
-  public InstrumentedFilesProviderImpl(
-      NestedSet<Artifact> instrumentedFiles,
-      NestedSet<Artifact> instrumentationMetadataFiles,
-      NestedSet<Artifact> baselineCoverageFiles,
-      NestedSet<Artifact> baselineCoverageArtifacts,
-      NestedSet<Artifact> coverageSupportFiles,
-      NestedSet<Pair<String, String>> coverageEnvironment,
-      NestedSet<Pair<String, String>> reportedToActualSources) {
-    this.instrumentedFiles = instrumentedFiles;
-    this.instrumentationMetadataFiles = instrumentationMetadataFiles;
-    this.baselineCoverageFiles = baselineCoverageFiles;
-    this.baselineCoverageArtifacts = baselineCoverageArtifacts;
-    this.coverageSupportFiles = coverageSupportFiles;
-    this.coverageEnvironment = coverageEnvironment;
-    this.reportedToActualSources = reportedToActualSources;
-  }
-
-  @Override
-  public NestedSet<Artifact> getInstrumentedFiles() {
-    return instrumentedFiles;
-  }
-
-  @Override
-  public NestedSet<Artifact> getInstrumentationMetadataFiles() {
-    return instrumentationMetadataFiles;
-  }
-
-  @Override
-  public NestedSet<Artifact> getBaselineCoverageInstrumentedFiles() {
-    return baselineCoverageFiles;
-  }
-
-  @Override
-  public NestedSet<Artifact> getBaselineCoverageArtifacts() {
-    return baselineCoverageArtifacts;
-  }
-
-  @Override
-  public NestedSet<Artifact> getCoverageSupportFiles() {
-    return coverageSupportFiles;
-  }
-
-  @Override
-  public NestedSet<Pair<String, String>> getCoverageEnvironment() {
-    return coverageEnvironment;
-  }
-
-  @Override
-  public NestedSet<Pair<String, String>> getReportedToActualSources() {
-    return reportedToActualSources;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/test/TestActionBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/test/TestActionBuilder.java
index 9947beb..d2d1df4 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/test/TestActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/test/TestActionBuilder.java
@@ -75,7 +75,7 @@
   private RunfilesSupport runfilesSupport;
   private Artifact executable;
   private ExecutionInfo executionRequirements;
-  private InstrumentedFilesProvider instrumentedFiles;
+  private InstrumentedFilesInfo instrumentedFiles;
   private int explicitShardCount;
   private Map<String, String> extraEnv;
 
@@ -125,8 +125,7 @@
     return this;
   }
 
-  public TestActionBuilder setInstrumentedFiles(
-      @Nullable InstrumentedFilesProvider instrumentedFiles) {
+  public TestActionBuilder setInstrumentedFiles(@Nullable InstrumentedFilesInfo instrumentedFiles) {
     this.instrumentedFiles = instrumentedFiles;
     return this;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/sh/ShBinary.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/sh/ShBinary.java
index 91432d0..9541d05 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/sh/ShBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/sh/ShBinary.java
@@ -33,7 +33,6 @@
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector.InstrumentationSpec;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector.LocalMetadataCollector;
-import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProvider;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
@@ -99,8 +98,7 @@
         .setFilesToBuild(filesToBuild)
         .setRunfilesSupport(runfilesSupport, mainExecutable)
         .addProvider(RunfilesProvider.class, RunfilesProvider.simple(runfiles))
-        .addProvider(
-            InstrumentedFilesProvider.class,
+        .addNativeDeclaredProvider(
             InstrumentedFilesCollector.collect(
                 ruleContext,
                 new InstrumentationSpec(FileTypeSet.ANY_FILE, "srcs", "deps", "data"),
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
index 66e8e9f..9c8fd59 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java
@@ -45,7 +45,7 @@
 import com.google.devtools.build.lib.analysis.actions.SymlinkAction;
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
 import com.google.devtools.build.lib.analysis.test.ExecutionInfo;
-import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProvider;
+import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
@@ -913,7 +913,7 @@
     List<Artifact> instrumentedObjectFiles = new ArrayList<>();
     instrumentedObjectFiles.addAll(ccCompilationOutputs.getObjectFiles(false));
     instrumentedObjectFiles.addAll(ccCompilationOutputs.getObjectFiles(true));
-    InstrumentedFilesProvider instrumentedFilesProvider =
+    InstrumentedFilesInfo instrumentedFilesProvider =
         common.getInstrumentedFilesProvider(
             instrumentedObjectFiles,
             !TargetUtils.isTestRule(ruleContext.getRule()) && !fake,
@@ -934,7 +934,7 @@
             new CcNativeLibraryProvider(
                 collectTransitiveCcNativeLibraries(
                     ruleContext, linkingOutputs.getDynamicLibrariesForLinking())))
-        .addProvider(InstrumentedFilesProvider.class, instrumentedFilesProvider)
+        .addNativeDeclaredProvider(instrumentedFilesProvider)
         .addProvider(
             CppDebugFileProvider.class,
             new CppDebugFileProvider(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
index 3c5318f..02ab81e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCommon.java
@@ -35,7 +35,7 @@
 import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleContext;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector.LocalMetadataCollector;
-import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProvider;
+import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.PackageIdentifier;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
@@ -695,9 +695,8 @@
   }
 
   /** Provides support for instrumentation. */
-  public InstrumentedFilesProvider getInstrumentedFilesProvider(
-      Iterable<Artifact> files,
-      boolean withBaselineCoverage) {
+  public InstrumentedFilesInfo getInstrumentedFilesProvider(
+      Iterable<Artifact> files, boolean withBaselineCoverage) {
     return getInstrumentedFilesProvider(
         files,
         withBaselineCoverage,
@@ -705,7 +704,7 @@
         );
   }
 
-  public InstrumentedFilesProvider getInstrumentedFilesProvider(
+  public InstrumentedFilesInfo getInstrumentedFilesProvider(
       Iterable<Artifact> files,
       boolean withBaselineCoverage,
       NestedSet<Pair<String, String>> virtualToOriginalHeaders) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
index f6b8b97..efcb726 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java
@@ -39,7 +39,7 @@
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
-import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProvider;
+import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -406,7 +406,7 @@
     List<Artifact> instrumentedObjectFiles = new ArrayList<>();
     instrumentedObjectFiles.addAll(compilationInfo.getCcCompilationOutputs().getObjectFiles(false));
     instrumentedObjectFiles.addAll(compilationInfo.getCcCompilationOutputs().getObjectFiles(true));
-    InstrumentedFilesProvider instrumentedFilesProvider =
+    InstrumentedFilesInfo instrumentedFilesProvider =
         common.getInstrumentedFilesProvider(
             instrumentedObjectFiles,
             /* withBaselineCoverage= */ true,
@@ -444,7 +444,7 @@
         .addOutputGroups(
             CcCommon.mergeOutputGroups(
                 ImmutableList.of(compilationInfo.getOutputGroups(), outputGroups.build())))
-        .addProvider(InstrumentedFilesProvider.class, instrumentedFilesProvider)
+        .addNativeDeclaredProvider(instrumentedFilesProvider)
         .addProvider(RunfilesProvider.withData(defaultRunfiles.build(), dataRunfiles.build()))
         .addOutputGroup(
             OutputGroupInfo.HIDDEN_TOP_LEVEL,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/filegroup/Filegroup.java b/src/main/java/com/google/devtools/build/lib/rules/filegroup/Filegroup.java
index e33d2cf..cff4525 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/filegroup/Filegroup.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/filegroup/Filegroup.java
@@ -33,7 +33,7 @@
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector.InstrumentationSpec;
-import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProvider;
+import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
@@ -72,7 +72,7 @@
         CompilationHelper.getAggregatingMiddleman(
             ruleContext, Actions.escapeLabel(ruleContext.getLabel()), filesToBuild);
 
-    InstrumentedFilesProvider instrumentedFilesProvider =
+    InstrumentedFilesInfo instrumentedFilesProvider =
         InstrumentedFilesCollector.collect(
             ruleContext,
             // what do *we* know about whether this is a source file or not
@@ -98,10 +98,9 @@
         .add(RunfilesProvider.class, runfilesProvider)
         .setFilesToBuild(filesToBuild)
         .setRunfilesSupport(null, getExecutable(filesToBuild))
-        .add(InstrumentedFilesProvider.class, instrumentedFilesProvider)
+        .addNativeDeclaredProvider(instrumentedFilesProvider)
         .add(MiddlemanProvider.class, new MiddlemanProvider(middleman))
-        .add(FilegroupPathProvider.class,
-            new FilegroupPathProvider(getFilegroupPath(ruleContext)))
+        .add(FilegroupPathProvider.class, new FilegroupPathProvider(getFilegroupPath(ruleContext)))
         .build();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
index 10d9dd9..82d6f0b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCommon.java
@@ -37,7 +37,7 @@
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector.InstrumentationSpec;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector.LocalMetadataCollector;
-import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProvider;
+import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -687,8 +687,7 @@
     JavaExportsProvider exportsProvider = collectTransitiveExports();
 
     builder
-        .add(
-            InstrumentedFilesProvider.class,
+        .addNativeDeclaredProvider(
             getInstrumentationFilesProvider(ruleContext, filesToBuild, instrumentationSpec))
         .addOutputGroup(OutputGroupInfo.FILES_TO_COMPILE, getFilesToCompile(classJar));
 
@@ -696,7 +695,7 @@
     javaInfoBuilder.addProvider(JavaCompilationInfoProvider.class, compilationInfoProvider);
   }
 
-  private static InstrumentedFilesProvider getInstrumentationFilesProvider(
+  private static InstrumentedFilesInfo getInstrumentationFilesProvider(
       RuleContext ruleContext,
       NestedSet<Artifact> filesToBuild,
       InstrumentationSpec instrumentationSpec) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java
index 1235226..6092f97 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java
@@ -36,7 +36,7 @@
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector;
-import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProvider;
+import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.packages.NativeInfo;
@@ -344,15 +344,15 @@
       targetBuilder.addNativeDeclaredProvider(objcProvider);
     }
 
-    InstrumentedFilesProvider instrumentedFilesProvider =
+    InstrumentedFilesInfo instrumentedFilesProvider =
         InstrumentedFilesCollector.forward(ruleContext, "deps", "bundle_loader");
 
-    return targetBuilder.addProvider(InstrumentedFilesProvider.class, instrumentedFilesProvider)
+    return targetBuilder
+        .addNativeDeclaredProvider(instrumentedFilesProvider)
         .addNativeDeclaredProvider(nativeInfo)
         .addNativeDeclaredProvider(appleBinaryOutput.getDebugOutputsProvider())
         .addOutputGroups(appleBinaryOutput.getOutputGroups())
         .build();
-
   }
 
   /**
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
index 87f3608..15a0441 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java
@@ -75,7 +75,7 @@
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector.InstrumentationSpec;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector.LocalMetadataCollector;
-import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProvider;
+import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.collect.nestedset.Order;
@@ -255,15 +255,12 @@
 
   /**
    * Files which can be instrumented along with the attributes in which they may occur and the
-   * attributes along which they are propagated from dependencies (via
-   * {@link InstrumentedFilesProvider}).
+   * attributes along which they are propagated from dependencies (via {@link
+   * InstrumentedFilesInfo}).
    */
   private static final InstrumentationSpec INSTRUMENTATION_SPEC =
       new InstrumentationSpec(
-              FileTypeSet.of(
-                  ObjcRuleClasses.NON_CPP_SOURCES,
-                  ObjcRuleClasses.CPP_SOURCES,
-                  HEADERS))
+              FileTypeSet.of(ObjcRuleClasses.NON_CPP_SOURCES, ObjcRuleClasses.CPP_SOURCES, HEADERS))
           .withSourceAttributes("srcs", "non_arc_srcs", "hdrs")
           .withDependencyAttributes("deps", "data", "binary", "xctest_app");
 
@@ -877,8 +874,7 @@
    * @param objectFiles the object files generated by this target
    * @return an instrumented files provider
    */
-  public InstrumentedFilesProvider getInstrumentedFilesProvider(
-      ImmutableList<Artifact> objectFiles) {
+  public InstrumentedFilesInfo getInstrumentedFilesProvider(ImmutableList<Artifact> objectFiles) {
     return InstrumentedFilesCollector.collect(
         ruleContext,
         INSTRUMENTATION_SPEC,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
index ee393ff..76e81f6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
@@ -22,7 +22,6 @@
 import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
-import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProvider;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.rules.cpp.ArtifactCategory;
@@ -120,8 +119,7 @@
         .addNativeDeclaredProvider(common.getObjcProvider())
         .addProvider(J2ObjcEntryClassProvider.class, j2ObjcEntryClassProvider)
         .addProvider(J2ObjcMappingFileProvider.class, j2ObjcMappingFileProvider)
-        .addProvider(
-            InstrumentedFilesProvider.class,
+        .addNativeDeclaredProvider(
             compilationSupport.getInstrumentedFilesProvider(objectFilesCollector.build()))
         .addNativeDeclaredProvider(
             CcInfo.builder()
diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyCommon.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyCommon.java
index 314404f..cd83ea1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/python/PyCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyCommon.java
@@ -34,7 +34,6 @@
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector;
 import com.google.devtools.build.lib.analysis.test.InstrumentedFilesCollector.LocalMetadataCollector;
-import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProvider;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
@@ -163,8 +162,7 @@
       NestedSet<String> imports) {
 
     builder
-        .add(
-            InstrumentedFilesProvider.class,
+        .addNativeDeclaredProvider(
             InstrumentedFilesCollector.collect(
                 ruleContext,
                 semantics.getCoverageInstrumentationSpec(),
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
index 22d3093..2edf89d 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewTestCase.java
@@ -92,7 +92,7 @@
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
 import com.google.devtools.build.lib.analysis.extra.ExtraAction;
 import com.google.devtools.build.lib.analysis.test.BaselineCoverageAction;
-import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProvider;
+import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo;
 import com.google.devtools.build.lib.buildtool.BuildRequestOptions;
 import com.google.devtools.build.lib.clock.BlazeClock;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -2018,9 +2018,8 @@
   protected Iterable<String> baselineCoverageArtifactBasenames(ConfiguredTarget target)
       throws Exception {
     ImmutableList.Builder<String> basenames = ImmutableList.builder();
-    for (Artifact baselineCoverage : target
-        .getProvider(InstrumentedFilesProvider.class)
-        .getBaselineCoverageArtifacts()) {
+    for (Artifact baselineCoverage :
+        target.get(InstrumentedFilesInfo.SKYLARK_CONSTRUCTOR).getBaselineCoverageArtifacts()) {
       BaselineCoverageAction baselineAction =
           (BaselineCoverageAction) getGeneratingAction(baselineCoverage);
       ByteArrayOutputStream bytes = new ByteArrayOutputStream();
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java
index eca984f..6a2dc70 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/CcLibraryConfiguredTargetTest.java
@@ -32,7 +32,7 @@
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
 import com.google.devtools.build.lib.analysis.OutputGroupInfo;
 import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
-import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProvider;
+import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo;
 import com.google.devtools.build.lib.analysis.util.AnalysisMock;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.packages.ImplicitOutputsFunction;
@@ -613,7 +613,7 @@
             "cc_library(name = 'x', srcs = ['x.cc'])");
     assertThat(
             ActionsTestUtil.baseArtifactNames(
-                x.getProvider(InstrumentedFilesProvider.class).getInstrumentationMetadataFiles()))
+                x.get(InstrumentedFilesInfo.SKYLARK_CONSTRUCTOR).getInstrumentationMetadataFiles()))
         .containsExactly("x.pic.gcno");
   }
 
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java
index 9813e64..597579a 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java
@@ -28,7 +28,7 @@
 import com.google.devtools.build.lib.analysis.actions.SpawnAction;
 import com.google.devtools.build.lib.analysis.actions.SymlinkAction;
 import com.google.devtools.build.lib.analysis.config.CompilationMode;
-import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProvider;
+import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo;
 import com.google.devtools.build.lib.cmdline.RepositoryName;
 import com.google.devtools.build.lib.rules.apple.AppleConfiguration.ConfigurationDistinguisher;
 import com.google.devtools.build.lib.rules.apple.ApplePlatform;
@@ -1301,8 +1301,8 @@
         ")");
 
     ConfiguredTarget bundleTarget = getConfiguredTarget("//examples:bundle");
-    InstrumentedFilesProvider instrumentedFilesProvider =
-        bundleTarget.getProvider(InstrumentedFilesProvider.class);
+    InstrumentedFilesInfo instrumentedFilesProvider =
+        bundleTarget.get(InstrumentedFilesInfo.SKYLARK_CONSTRUCTOR);
     assertThat(instrumentedFilesProvider).isNotNull();
 
     assertThat(Artifact.toRootRelativePaths(instrumentedFilesProvider.getInstrumentedFiles()))
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
index 18d9593..88c6e28 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkIntegrationTest.java
@@ -32,7 +32,7 @@
 import com.google.devtools.build.lib.analysis.test.AnalysisFailure;
 import com.google.devtools.build.lib.analysis.test.AnalysisFailureInfo;
 import com.google.devtools.build.lib.analysis.test.AnalysisTestResultInfo;
-import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProvider;
+import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
@@ -675,7 +675,7 @@
     ConfiguredTarget target = getConfiguredTarget("//test/skylark:cr");
 
     assertThat(target.getLabel().toString()).isEqualTo("//test/skylark:cr");
-    InstrumentedFilesProvider provider = target.getProvider(InstrumentedFilesProvider.class);
+    InstrumentedFilesInfo provider = target.get(InstrumentedFilesInfo.SKYLARK_CONSTRUCTOR);
     assertWithMessage("InstrumentedFilesProvider should be set.").that(provider).isNotNull();
     assertThat(ActionsTestUtil.baseArtifactNames(provider.getInstrumentedFiles())).isEmpty();
   }
@@ -707,7 +707,7 @@
     ConfiguredTarget target = getConfiguredTarget("//test/skylark:cr");
 
     assertThat(target.getLabel().toString()).isEqualTo("//test/skylark:cr");
-    InstrumentedFilesProvider provider = target.getProvider(InstrumentedFilesProvider.class);
+    InstrumentedFilesInfo provider = target.get(InstrumentedFilesInfo.SKYLARK_CONSTRUCTOR);
     assertWithMessage("InstrumentedFilesProvider should be set.").that(provider).isNotNull();
     assertThat(ActionsTestUtil.baseArtifactNames(provider.getInstrumentedFiles()))
         .containsExactly("a.txt", "A.java");