Automated rollback of commit 2f39c04ea4b93788bfef5c475b7dd40a8a289aef.

*** Reason for rollback ***

breaks coverage builds: b/265134564

*** Original change description ***

Use coverage_common.instrumented_files_info in objc_library.bzl.

PiperOrigin-RevId: 501371490
Change-Id: I326c91e64a6be88826b1a3877c83e1d1d3f11c38
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 71c5780..b4ef46b 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
@@ -44,10 +44,12 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Sets;
+import com.google.devtools.build.lib.actions.ActionAnalysisMetadata;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.actions.CommandLine;
 import com.google.devtools.build.lib.actions.ParamFileInfo;
 import com.google.devtools.build.lib.actions.ParameterFile;
+import com.google.devtools.build.lib.analysis.AnalysisEnvironment;
 import com.google.devtools.build.lib.analysis.FilesToRunProvider;
 import com.google.devtools.build.lib.analysis.PrerequisiteArtifacts;
 import com.google.devtools.build.lib.analysis.RuleContext;
@@ -55,6 +57,10 @@
 import com.google.devtools.build.lib.analysis.actions.CustomCommandLine.VectorArg;
 import com.google.devtools.build.lib.analysis.actions.ParameterFileWriteAction;
 import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
+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.InstrumentedFilesInfo;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
@@ -87,6 +93,7 @@
 import com.google.devtools.build.lib.rules.cpp.Link.LinkTargetType;
 import com.google.devtools.build.lib.rules.cpp.Link.LinkingMode;
 import com.google.devtools.build.lib.rules.objc.ObjcVariablesExtension.VariableCategory;
+import com.google.devtools.build.lib.util.FileTypeSet;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.errorprone.annotations.CanIgnoreReturnValue;
@@ -152,6 +159,17 @@
     return ruleContext.getExecutablePrerequisite("$xcrunwrapper");
   }
 
+  /**
+   * 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
+   * InstrumentedFilesInfo}).
+   */
+  private static final InstrumentationSpec INSTRUMENTATION_SPEC =
+      new InstrumentationSpec(
+              FileTypeSet.of(ObjcRuleClasses.NON_CPP_SOURCES, ObjcRuleClasses.CPP_SOURCES, HEADERS))
+          .withSourceAttributes("srcs", "non_arc_srcs", "hdrs")
+          .withDependencyAttributes("deps", "data", "binary", "xctest_app");
+
   /** Iterable wrapper providing strong type safety for arguments to binary linking. */
   static final class ExtraLinkArgs extends IterableWrapper<String> {
     ExtraLinkArgs(String... args) {
@@ -356,6 +374,34 @@
   }
 
   /**
+   * Returns a provider that collects this target's instrumented sources as well as those of its
+   * dependencies.
+   *
+   * @param ruleContext the rule context of the target
+   * @param toolchain the toolchain used by the target
+   * @param buildConfiguration the build configuration of the target
+   * @param objectFiles the object files generated by the target
+   * @return an instrumented files provider
+   */
+  protected static InstrumentedFilesInfo getInstrumentedFilesProvider(
+      RuleContext ruleContext,
+      CcToolchainProvider toolchain,
+      BuildConfigurationValue buildConfiguration,
+      ImmutableList<Artifact> objectFiles)
+      throws RuleErrorException {
+    CppConfiguration cppConfiguration = buildConfiguration.getFragment(CppConfiguration.class);
+    return InstrumentedFilesCollector.collect(
+        ruleContext,
+        INSTRUMENTATION_SPEC,
+        OBJC_METADATA_COLLECTOR,
+        objectFiles,
+        CppHelper.getGcovFilesIfNeeded(ruleContext, toolchain),
+        CppHelper.getCoverageEnvironmentIfNeeded(ruleContext, cppConfiguration, toolchain),
+        /* withBaselineCoverage= */ true,
+        /* reportedToActualSources= */ NestedSetBuilder.create(Order.STABLE_ORDER));
+  }
+
+  /**
    * Validates compilation-related attributes on this rule.
    *
    * @return this compilation support
@@ -1031,6 +1077,27 @@
             .build(ruleContext));
   }
 
+  /**
+   * Collector that, given a list of output artifacts, finds and registers coverage notes metadata
+   * for any compilation action.
+   */
+  private static final LocalMetadataCollector OBJC_METADATA_COLLECTOR =
+      new LocalMetadataCollector() {
+        @Override
+        public void collectMetadataArtifacts(
+            Iterable<Artifact> artifacts,
+            AnalysisEnvironment analysisEnvironment,
+            NestedSetBuilder<Artifact> metadataFilesBuilder) {
+          for (Artifact artifact : artifacts) {
+            ActionAnalysisMetadata action = analysisEnvironment.getLocalGeneratingAction(artifact);
+            if (action.getMnemonic().equals("ObjcCompile")
+                || action.getMnemonic().equals("ObjcCompileHeader")) {
+              addOutputs(metadataFilesBuilder, action, ObjcRuleClasses.COVERAGE_NOTES);
+            }
+          }
+        }
+      };
+
   public static Optional<Artifact> getCustomModuleMap(RuleContext ruleContext) {
     if (ruleContext.attributes().has("module_map", BuildType.LABEL)) {
       return Optional.fromNullable(ruleContext.getPrerequisiteArtifact("module_map"));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcStarlarkInternal.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcStarlarkInternal.java
index 1683b47..92d73c8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcStarlarkInternal.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcStarlarkInternal.java
@@ -24,11 +24,15 @@
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.LocationExpander;
 import com.google.devtools.build.lib.analysis.TemplateVariableInfo;
+import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
 import com.google.devtools.build.lib.analysis.starlark.StarlarkRuleContext;
+import com.google.devtools.build.lib.analysis.test.InstrumentedFilesInfo;
 import com.google.devtools.build.lib.packages.NativeInfo;
+import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
 import com.google.devtools.build.lib.packages.Type;
 import com.google.devtools.build.lib.rules.cpp.CcCompilationContext;
 import com.google.devtools.build.lib.rules.cpp.CcLinkingContext;
+import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider;
 import com.google.devtools.build.lib.shell.ShellUtils;
 import com.google.devtools.build.lib.shell.ShellUtils.TokenizationException;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -222,6 +226,32 @@
   }
 
   @StarlarkMethod(
+      name = "instrumented_files_info",
+      documented = false,
+      parameters = {
+        @Param(name = "ctx", positional = false, named = true),
+        @Param(name = "cc_toolchain", positional = false, named = true),
+        @Param(name = "config", positional = false, named = true),
+        @Param(name = "object_files", positional = false, defaultValue = "[]", named = true),
+      })
+  public InstrumentedFilesInfo createInstrumentedFilesInfo(
+      StarlarkRuleContext starlarkRuleContext,
+      CcToolchainProvider ccToolchain,
+      BuildConfigurationValue config,
+      Sequence<?> objectFiles)
+      throws EvalException {
+    try {
+      return CompilationSupport.getInstrumentedFilesProvider(
+          starlarkRuleContext.getRuleContext(),
+          ccToolchain,
+          config,
+          Sequence.cast(objectFiles, Artifact.class, "object_files").getImmutableList());
+    } catch (RuleErrorException e) {
+      throw new EvalException(e);
+    }
+  }
+
+  @StarlarkMethod(
       name = "create_compilation_context",
       documented = false,
       parameters = {
diff --git a/src/main/starlark/builtins_bzl/common/objc/attrs.bzl b/src/main/starlark/builtins_bzl/common/objc/attrs.bzl
index 3873291..6349049 100644
--- a/src/main/starlark/builtins_bzl/common/objc/attrs.bzl
+++ b/src/main/starlark/builtins_bzl/common/objc/attrs.bzl
@@ -15,7 +15,6 @@
 """Attributes common to Objc rules"""
 
 load("@_builtins//:common/objc/semantics.bzl", "semantics")
-load("@_builtins//:common/objc/objc_common.bzl", "extensions")
 
 CcInfo = _builtins.toplevel.CcInfo
 AppleDynamicFrameworkInfo = _builtins.toplevel.apple_common.AppleDynamicFramework
@@ -30,11 +29,28 @@
 
 _COMPILING_RULE = {
     "srcs": attr.label_list(
-        allow_files = extensions.NON_CPP_SOURCES +
-                      extensions.CPP_SOURCES +
-                      extensions.ASSEMBLY_SOURCES +
-                      extensions.OBJECT_FILE_SOURCES +
-                      extensions.HEADERS,
+        allow_files = [
+            # NON_CPP_SOURCES
+            ".m",
+            ".c",
+            # CPP_SOURCES
+            ".cc",
+            ".cpp",
+            ".mm",
+            ".cxx",
+            ".C",
+            # ASSEMBLY_SOURCES
+            ".s",
+            ".S",
+            ".asm",
+            # OBJECT_FILE_SOURCES
+            ".o",
+            # HEADERS
+            ".h",
+            ".inc",
+            ".hpp",
+            ".hh",
+        ],
         flags = ["DIRECT_COMPILE_TIME_INPUT"],
     ),
     "non_arc_srcs": attr.label_list(
diff --git a/src/main/starlark/builtins_bzl/common/objc/objc_common.bzl b/src/main/starlark/builtins_bzl/common/objc/objc_common.bzl
index 515b869..550d89c 100644
--- a/src/main/starlark/builtins_bzl/common/objc/objc_common.bzl
+++ b/src/main/starlark/builtins_bzl/common/objc/objc_common.bzl
@@ -12,26 +12,12 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-"""Common functionality for Objc rules."""
+"""Builds the Objective-C provider"""
 
 objc_internal = _builtins.internal.objc_internal
 CcInfo = _builtins.toplevel.CcInfo
 apple_common = _builtins.toplevel.apple_common
 
-CPP_SOURCES = [".cc", ".cpp", ".mm", ".cxx", ".C"]
-NON_CPP_SOURCES = [".m", ".c"]
-ASSEMBLY_SOURCES = [".s", ".S", ".asm"]
-OBJECT_FILE_SOURCES = [".o"]
-HEADERS = [".h", ".inc", ".hpp", ".hh"]
-
-extensions = struct(
-    CPP_SOURCES = CPP_SOURCES,
-    NON_CPP_SOURCES = NON_CPP_SOURCES,
-    ASSEMBLY_SOURCES = ASSEMBLY_SOURCES,
-    OBJECT_FILE_SOURCES = OBJECT_FILE_SOURCES,
-    HEADERS = HEADERS,
-)
-
 def _create_context_and_provider(
         ctx,
         compilation_attributes,
@@ -255,7 +241,7 @@
     )
 
 def _is_cpp_source(source_file):
-    return "." + source_file.extension in CPP_SOURCES
+    return source_file.extension in ["cc", "cpp", "mm", "cxx", "C"]
 
 def _add_linkopts(objc_provider_kwargs, linkopts):
     non_sdk_linkopts = []
diff --git a/src/main/starlark/builtins_bzl/common/objc/objc_library.bzl b/src/main/starlark/builtins_bzl/common/objc/objc_library.bzl
index 14384ad..fc62bdfc 100644
--- a/src/main/starlark/builtins_bzl/common/objc/objc_library.bzl
+++ b/src/main/starlark/builtins_bzl/common/objc/objc_library.bzl
@@ -16,7 +16,6 @@
 
 load("@_builtins//:common/objc/compilation_support.bzl", "compilation_support")
 load("@_builtins//:common/objc/attrs.bzl", "common_attrs")
-load("@_builtins//:common/objc/objc_common.bzl", "extensions")
 load("@_builtins//:common/objc/transitions.bzl", "apple_crosstool_transition")
 load("@_builtins//:common/cc/cc_helper.bzl", "cc_helper")
 
@@ -64,16 +63,6 @@
 
     objc_provider = common_variables.objc_provider
 
-    instrumented_files_info = coverage_common.instrumented_files_info(
-        ctx = ctx,
-        source_attributes = ["srcs", "non_arc_srcs", "hdrs"],
-        dependency_attributes = ["deps", "data", "binary", "xctest_app"],
-        extensions = extensions.NON_CPP_SOURCES + extensions.CPP_SOURCES + extensions.HEADERS,
-        coverage_environment = cc_helper.get_coverage_environment(ctx, ctx.fragments.cpp, cc_toolchain),
-        coverage_support_files = cc_toolchain.coverage_files() if ctx.coverage_instrumented() else depset([]),
-        metadata_files = compilation_outputs.gcno_files() + compilation_outputs.pic_gcno_files(),
-    )
-
     return [
         DefaultInfo(
             files = depset(files),
@@ -86,7 +75,12 @@
         objc_provider,
         j2objc_providers[0],
         j2objc_providers[1],
-        instrumented_files_info,
+        objc_internal.instrumented_files_info(
+            ctx = ctx,
+            cc_toolchain = cc_toolchain,
+            config = ctx.configuration,
+            object_files = compilation_outputs.objects,
+        ),
         OutputGroupInfo(**output_groups),
     ]
 
diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java
index 58cf3b3..43e275c 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcLibraryTest.java
@@ -2509,30 +2509,6 @@
     assertThat(instrumentedFilesInfo.getCoverageSupportFiles().toList()).isEmpty();
   }
 
-  @Test
-  public void testCoverageMetadataFiles() throws Exception {
-    scratch.file(
-        "a/BUILD",
-        "cc_toolchain_alias(name = 'toolchain')",
-        "objc_library(",
-        "    name = 'foo',",
-        "    srcs = ['foo.m'],",
-        ")",
-        "objc_library(",
-        "     name = 'bar',",
-        "     srcs = ['bar.m'],",
-        "     deps = [':foo'],",
-        ")");
-    useConfiguration("--collect_code_coverage", "--instrumentation_filter=//a[:/]");
-
-    InstrumentedFilesInfo instrumentedFilesInfo =
-        getConfiguredTarget("//a:bar").get(InstrumentedFilesInfo.STARLARK_CONSTRUCTOR);
-
-    assertThat(
-            Artifact.toRootRelativePaths(instrumentedFilesInfo.getInstrumentationMetadataFiles()))
-        .containsExactly("a/_objs/foo/arc/foo.gcno", "a/_objs/bar/arc/bar.gcno");
-  }
-
   private ImmutableList<String> getCcInfoUserLinkFlagsFromTarget(String target)
       throws LabelSyntaxException {
     return getConfiguredTarget(target)