apple_binary builds without implicit requirement of cc-relevant flags.

Notable changes:
 - Obtain J2Objc providers from deps attribute of the current rule, even if "deps" is not Mode.TARGET. It is up to the rule implementation to correctly obtain and propagate these providers.
 - "srcs" on apple_binary no longer has a split transition. These are files, not labels.

--
MOS_MIGRATED_REVID=121625691
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 9928c4a..3971a35 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
@@ -32,7 +32,6 @@
 import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
 import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
 import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider;
-import com.google.devtools.build.lib.rules.cpp.CppCompilationContext;
 import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs;
 import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes;
 import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes;
@@ -74,6 +73,23 @@
           nullToEmptyList(configToDepsCollectionMap.get(childConfig)),
           nullToEmptyList(configurationToNonPropagatedObjcMap.get(childConfig)));
       ObjcProvider objcProvider = common.getObjcProvider();
+      ImmutableList.Builder<J2ObjcMappingFileProvider> j2ObjcMappingFileProviders =
+          ImmutableList.builder();
+      J2ObjcEntryClassProvider.Builder j2ObjcEntryClassProviderBuilder =
+          new J2ObjcEntryClassProvider.Builder(); 
+      for (TransitiveInfoCollection dep : configToDepsCollectionMap.get(childConfig)) {
+        if (dep.getProvider(J2ObjcMappingFileProvider.class) != null) {
+          j2ObjcMappingFileProviders.add(dep.getProvider(J2ObjcMappingFileProvider.class));
+        }
+        if (dep.getProvider(J2ObjcEntryClassProvider.class) != null) {
+          j2ObjcEntryClassProviderBuilder.addTransitive(
+              dep.getProvider(J2ObjcEntryClassProvider.class));
+        }
+      }
+      J2ObjcMappingFileProvider j2ObjcMappingFileProvider =
+          J2ObjcMappingFileProvider.union(j2ObjcMappingFileProviders.build());
+      J2ObjcEntryClassProvider j2ObjcEntryClassProvider = j2ObjcEntryClassProviderBuilder.build();
+      
       if (!hasLibraryOrSources(objcProvider)) {
         ruleContext.ruleError(REQUIRES_AT_LEAST_ONE_LIBRARY_OR_SOURCE_FILE);
         return null;
@@ -81,11 +97,13 @@
       if (ruleContext.hasErrors()) {
         return null;
       }
+
       binariesToLipo.add(intermediateArtifacts.strippedSingleArchitectureBinary());
       new CompilationSupport(ruleContext, childConfig)
           .registerCompileAndArchiveActions(common)
           .registerLinkActions(
-              objcProvider, new ExtraLinkArgs(), ImmutableList.<Artifact>of(),
+              common.getObjcProvider(), j2ObjcMappingFileProvider, j2ObjcEntryClassProvider,
+              new ExtraLinkArgs(), ImmutableList.<Artifact>of(),
               DsymOutputType.APP)
           .validateAttributes();
 
@@ -116,18 +134,6 @@
       IntermediateArtifacts intermediateArtifacts,
       List<TransitiveInfoCollection> propagatedDeps,
       List<ObjcProvider> nonPropagatedObjcDeps) {
-    ImmutableList.Builder<ObjcProvider> propagatedObjcDeps = ImmutableList.<ObjcProvider>builder();
-    ImmutableList.Builder<CppCompilationContext> cppDeps =
-        ImmutableList.<CppCompilationContext>builder();
-    
-    for (TransitiveInfoCollection dep : propagatedDeps) {
-      if (dep.getProvider(ObjcProvider.class) != null) {
-        propagatedObjcDeps.add(dep.getProvider(ObjcProvider.class));
-      }
-      if (dep.getProvider(CppCompilationContext.class) != null) {
-        cppDeps.add(dep.getProvider(CppCompilationContext.class));
-      }
-    }
 
     CompilationArtifacts compilationArtifacts =
         CompilationSupport.compilationArtifacts(ruleContext, intermediateArtifacts);
@@ -137,9 +143,7 @@
         .setResourceAttributes(new ResourceAttributes(ruleContext))
         .setCompilationArtifacts(compilationArtifacts)
         .addDefines(ruleContext.getTokenizedStringListAttr("defines"))
-        .addDepObjcProviders(propagatedObjcDeps.build())
-        .addDepCcHeaderProviders(cppDeps.build())
-        .addDepCcLinkProviders(propagatedDeps)
+        .addDeps(propagatedDeps)
         .addDepObjcProviders(
             ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.class))
         .addNonPropagatedDepObjcProviders(nonPropagatedObjcDeps)
@@ -149,7 +153,7 @@
         .setLinkedBinary(intermediateArtifacts.strippedSingleArchitectureBinary())
         .build();
   }
-  
+
   private <T> List<T> nullToEmptyList(List<T> inputList) {
     return inputList != null ? inputList : ImmutableList.<T>of();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java
index 498789c..0979c8f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java
@@ -16,7 +16,6 @@
 
 import static com.google.devtools.build.lib.packages.Attribute.attr;
 import static com.google.devtools.build.lib.packages.BuildType.LABEL;
-import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST;
 import static com.google.devtools.build.lib.packages.ImplicitOutputsFunction.fromTemplates;
 import static com.google.devtools.build.lib.syntax.Type.BOOLEAN;
 
@@ -43,24 +42,12 @@
   @Override
   public RuleClass build(Builder builder, RuleDefinitionEnvironment env) {
     return builder
-        .requiresConfigurationFragments(ObjcConfiguration.class, J2ObjcConfiguration.class,
-            AppleConfiguration.class)
+        .requiresConfigurationFragments(
+            ObjcConfiguration.class, J2ObjcConfiguration.class, AppleConfiguration.class)
         .add(attr("$is_executable", BOOLEAN).value(true)
             .nonconfigurable("Called from RunCommand.isExecutable, which takes a Target"))
-        .override(attr("deps", LABEL_LIST)
-            .cfg(IosApplication.SPLIT_ARCH_TRANSITION)
-            .direct_compile_time_input()
-            .allowedRuleClasses(ObjcRuleClasses.CompilingRule.ALLOWED_DEPS_RULE_CLASSES)
-            .allowedFileTypes())
-        .override(attr("non_propagated_deps", LABEL_LIST)
-            .direct_compile_time_input()
-            .cfg(IosApplication.SPLIT_ARCH_TRANSITION)
-            .allowedRuleClasses(ObjcRuleClasses.CompilingRule.ALLOWED_DEPS_RULE_CLASSES)
-            .allowedFileTypes())
-        .override(attr("srcs", LABEL_LIST)
-            .direct_compile_time_input()
-            .cfg(IosApplication.SPLIT_ARCH_TRANSITION)
-            .allowedFileTypes(ObjcRuleClasses.SRCS_TYPE))
+        .override(builder.copy("deps").cfg(IosApplication.SPLIT_ARCH_TRANSITION))
+        .override(builder.copy("non_propagated_deps").cfg(IosApplication.SPLIT_ARCH_TRANSITION))
         // This is currently a hack to obtain all child configurations regardless of the attribute
         // values of this rule -- this rule does not currently use the actual info provided by
         // this attribute.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
index d06a374..ef86fe6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
@@ -31,7 +31,6 @@
 import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
 import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
 import com.google.devtools.build.lib.rules.apple.Platform;
-import com.google.devtools.build.lib.rules.cpp.CppCompilationContext;
 import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs;
 import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes;
 import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes;
@@ -97,13 +96,20 @@
       return null;
     }
 
+    J2ObjcMappingFileProvider j2ObjcMappingFileProvider = J2ObjcMappingFileProvider.union(
+        ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class));
+    J2ObjcEntryClassProvider j2ObjcEntryClassProvider = new J2ObjcEntryClassProvider.Builder()
+        .addTransitive(
+            ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcEntryClassProvider.class))
+        .build();
+
     CompilationSupport compilationSupport =
         new CompilationSupport(ruleContext)
             .registerCompileAndArchiveActions(common)
             .registerFullyLinkAction(common.getObjcProvider())
             .addXcodeSettings(xcodeProviderBuilder, common)
             .registerLinkActions(
-                objcProvider,
+                objcProvider, j2ObjcMappingFileProvider, j2ObjcEntryClassProvider,
                 getExtraLinkArgs(ruleContext),
                 ImmutableList.<Artifact>of(),
                 DsymOutputType.APP)
@@ -202,11 +208,7 @@
             .setResourceAttributes(new ResourceAttributes(ruleContext))
             .setCompilationArtifacts(compilationArtifacts)
             .addDefines(ruleContext.getTokenizedStringListAttr("defines"))
-            .addDepObjcProviders(
-                ruleContext.getPrerequisites("deps", Mode.TARGET, ObjcProvider.class))
-            .addDepCcHeaderProviders(
-                ruleContext.getPrerequisites("deps", Mode.TARGET, CppCompilationContext.class))
-            .addDepCcLinkProviders(ruleContext.getPrerequisites("deps", Mode.TARGET))
+            .addDeps(ruleContext.getPrerequisites("deps", Mode.TARGET))
             .addDepObjcProviders(
                 ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.class))
             .addNonPropagatedDepObjcProviders(
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 e2d0a0b..395a2be 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
@@ -784,6 +784,8 @@
    * {@code -dead_strip} and {@code -no_dead_strip_inits_and_terms}).
    *
    * @param objcProvider common information about this rule's attributes and its dependencies
+   * @param j2ObjcMappingFileProvider contains mapping files for j2objc transpilation
+   * @param j2ObjcEntryClassProvider contains j2objc entry class information for dead code removal
    * @param extraLinkArgs any additional arguments to pass to the linker
    * @param extraLinkInputs any additional input artifacts to pass to the link action
    * @param dsymOutputType the file type of the dSYM bundle to be generated
@@ -792,6 +794,8 @@
    */
   CompilationSupport registerLinkActions(
       ObjcProvider objcProvider,
+      J2ObjcMappingFileProvider j2ObjcMappingFileProvider,
+      J2ObjcEntryClassProvider j2ObjcEntryClassProvider,
       ExtraLinkArgs extraLinkArgs,
       Iterable<Artifact> extraLinkInputs,
       DsymOutputType dsymOutputType) {
@@ -809,9 +813,9 @@
     }
 
     Iterable<Artifact> prunedJ2ObjcArchives = ImmutableList.<Artifact>of();
-    if (stripJ2ObjcDeadCode()) {
-      J2ObjcEntryClassProvider provider = J2ObjcEntryClassProvider.buildFrom(ruleContext);
-      registerJ2ObjcDeadCodeRemovalActions(objcProvider, provider.getEntryClasses());
+    if (stripJ2ObjcDeadCode(j2ObjcEntryClassProvider)) {
+      registerJ2ObjcDeadCodeRemovalActions(objcProvider, j2ObjcMappingFileProvider,
+          j2ObjcEntryClassProvider);
       prunedJ2ObjcArchives = j2objcPrunedLibraries(objcProvider);
     }
 
@@ -831,13 +835,13 @@
     return this;
   }
 
-  private boolean stripJ2ObjcDeadCode() {
-    J2ObjcEntryClassProvider provider = J2ObjcEntryClassProvider.buildFrom(ruleContext);
+  private boolean stripJ2ObjcDeadCode(J2ObjcEntryClassProvider j2ObjcEntryClassProvider) {
     J2ObjcConfiguration j2objcConfiguration =
         buildConfiguration.getFragment(J2ObjcConfiguration.class);
     // Only perform J2ObjC dead code stripping if flag --j2objc_dead_code_removal is specified and
     // users have specified entry classes.
-    return j2objcConfiguration.removeDeadCode() && !provider.getEntryClasses().isEmpty();
+    return j2objcConfiguration.removeDeadCode()
+        && !j2ObjcEntryClassProvider.getEntryClasses().isEmpty();
   }
 
   /**
@@ -1175,12 +1179,16 @@
   }
 
   private void registerJ2ObjcDeadCodeRemovalActions(ObjcProvider objcProvider,
-      Iterable<String> entryClasses) {
+      J2ObjcMappingFileProvider j2ObjcMappingFileProvider,
+      J2ObjcEntryClassProvider j2ObjcEntryClassProvider) {
+    NestedSet<String> entryClasses = j2ObjcEntryClassProvider.getEntryClasses();
     Artifact pruner = ruleContext.getPrerequisiteArtifact("$j2objc_dead_code_pruner", Mode.HOST);
-    J2ObjcMappingFileProvider provider = ObjcRuleClasses.j2ObjcMappingFileProvider(ruleContext);
-    NestedSet<Artifact> j2ObjcDependencyMappingFiles = provider.getDependencyMappingFiles();
-    NestedSet<Artifact> j2ObjcHeaderMappingFiles = provider.getHeaderMappingFiles();
-    NestedSet<Artifact> j2ObjcArchiveSourceMappingFiles = provider.getArchiveSourceMappingFiles();
+    NestedSet<Artifact> j2ObjcDependencyMappingFiles =
+        j2ObjcMappingFileProvider.getDependencyMappingFiles();
+    NestedSet<Artifact> j2ObjcHeaderMappingFiles =
+        j2ObjcMappingFileProvider.getHeaderMappingFiles();
+    NestedSet<Artifact> j2ObjcArchiveSourceMappingFiles =
+        j2ObjcMappingFileProvider.getArchiveSourceMappingFiles();
 
     for (Artifact j2objcArchive : objcProvider.get(ObjcProvider.J2OBJC_LIBRARY)) {
       PathFragment paramFilePath = FileSystemUtils.replaceExtension(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
index 89541d6..c21a780 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
@@ -129,10 +129,18 @@
 
       filesToBuild.add(testApp.getIpa());
     }
+    
+    J2ObjcMappingFileProvider j2ObjcMappingFileProvider = J2ObjcMappingFileProvider.union(
+        ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class));
+    J2ObjcEntryClassProvider j2ObjcEntryClassProvider = new J2ObjcEntryClassProvider.Builder()
+        .addTransitive(
+            ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcEntryClassProvider.class))
+        .build();
 
     new CompilationSupport(ruleContext)
         .registerLinkActions(
-            common.getObjcProvider(), extraLinkArgs, extraLinkInputs, DsymOutputType.TEST)
+            common.getObjcProvider(), j2ObjcMappingFileProvider, j2ObjcEntryClassProvider,
+            extraLinkArgs, extraLinkInputs, DsymOutputType.TEST)
         .registerCompileAndArchiveActions(common)
         .registerFullyLinkAction(common.getObjcProvider())
         .addXcodeSettings(xcodeProviderBuilder, common)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcEntryClassProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcEntryClassProvider.java
index 6bbc6a5..0b3cd38 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcEntryClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcEntryClassProvider.java
@@ -54,6 +54,20 @@
     }
 
     /**
+     * Transitively adds the given {@link J2ObjcEntryClassProvider}s
+     * and all their properties to this builder.
+     *
+     * @param providers the J2ObjcEntryClassProviders to add
+     * @return this builder
+     */
+    public Builder addTransitive(Iterable<J2ObjcEntryClassProvider> providers) {
+      for (J2ObjcEntryClassProvider provider : providers) {
+        addTransitive(provider);
+      }
+      return this;
+    }
+
+    /**
      * Transitively adds all the J2ObjcEntryClassProviders and all their properties
      * that can be reached through the "deps" attribute.
      *
@@ -62,10 +76,8 @@
      */
     public Builder addTransitive(RuleContext ruleContext) {
       if (ruleContext.attributes().has("deps", BuildType.LABEL_LIST)) {
-        for (J2ObjcEntryClassProvider provider :
-            ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcEntryClassProvider.class)) {
-          addTransitive(provider);
-        }
+        addTransitive(
+            ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcEntryClassProvider.class));
       }
 
       return this;
@@ -93,16 +105,6 @@
   }
 
   /**
-   * Constructs a new J2ObjcEntryClassProvider that contains all the information
-   * that can be transitively reached through the "deps" attribute of the given rule context.
-   *
-   * @param ruleContext the rule context in which to look for deps
-   */
-  public static J2ObjcEntryClassProvider buildFrom(RuleContext ruleContext) {
-    return new Builder().addTransitive(ruleContext).build();
-  }
-
-  /**
    * Constructs a {@link J2ObjcEntryClassProvider} to supply J2ObjC-translated ObjC sources to
    * objc_binary for compilation and linking.
    *
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java
index fd37871..2cf414f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java
@@ -74,12 +74,14 @@
     ObjcProvider objcProvider = objcProviderBuilder.build();
     xcodeSupport.addXcodeSettings(xcodeProviderBuilder, objcProvider, LIBRARY_STATIC);
 
+    J2ObjcMappingFileProvider j2ObjcMappingFileProvider = J2ObjcMappingFileProvider.union(
+        ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class));
+
     return new RuleConfiguredTargetBuilder(ruleContext)
         .setFilesToBuild(NestedSetBuilder.<Artifact>emptySet(STABLE_ORDER))
         .add(RunfilesProvider.class, RunfilesProvider.EMPTY)
         .addProvider(J2ObjcEntryClassProvider.class, j2ObjcEntryClassProvider)
-        .addProvider(
-            J2ObjcMappingFileProvider.class, ObjcRuleClasses.j2ObjcMappingFileProvider(ruleContext))
+        .addProvider(J2ObjcMappingFileProvider.class, j2ObjcMappingFileProvider)
         .addProvider(ObjcProvider.class, objcProvider)
         .addProvider(XcodeProvider.class, xcodeProviderBuilder.build())
         .build();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcMappingFileProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcMappingFileProvider.java
index e785130..2d40857 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcMappingFileProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcMappingFileProvider.java
@@ -33,6 +33,20 @@
   private final NestedSet<Artifact> archiveSourceMappingFiles;
 
   /**
+   * Returns a {@link J2ObjcMappingFileProvider} which combines all input
+   * {@link J2ObjcMappingFileProvider}s. All mapping files present in any of the input providers
+   * will be present in the output provider.
+   */
+  public static J2ObjcMappingFileProvider union(Iterable<J2ObjcMappingFileProvider> providers) {
+    J2ObjcMappingFileProvider.Builder builder = new J2ObjcMappingFileProvider.Builder();
+    for (J2ObjcMappingFileProvider provider : providers) {
+      builder.addTransitive(provider);
+    }
+
+    return builder.build();
+  }
+
+  /**
    * Constructs a {@link J2ObjcMappingFileProvider} with mapping files to export mappings required
    * by J2ObjC translation and proto compilation.
    *
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
index 5f832eb..bf35252 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
@@ -65,6 +65,7 @@
 import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
 import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.packages.BuildType;
@@ -375,6 +376,39 @@
       return this;
     }
 
+    Builder addDeps(List<? extends TransitiveInfoCollection> deps) {
+      ImmutableList.Builder<ObjcProvider> propagatedObjcDeps =
+          ImmutableList.<ObjcProvider>builder();
+      ImmutableList.Builder<CppCompilationContext> cppDeps =
+          ImmutableList.<CppCompilationContext>builder();
+      ImmutableList.Builder<CcLinkParamsProvider> cppDepLinkParams =
+          ImmutableList.<CcLinkParamsProvider>builder();
+
+      for (TransitiveInfoCollection dep : deps) {
+        addAnyProviders(propagatedObjcDeps, dep, ObjcProvider.class);
+        addAnyProviders(cppDeps, dep, CppCompilationContext.class);
+        // Hack to determine if dep is a cc target. Required so objc_library archives packed in
+        // CcLinkParamsProvider do not get consumed as cc targets.
+        if (dep.getProvider(CppRunfilesProvider.class) != null) {
+          cppDepLinkParams.add(dep.getProvider(CcLinkParamsProvider.class));
+        }
+      }
+      addDepObjcProviders(propagatedObjcDeps.build());
+      this.depCcHeaderProviders = Iterables.concat(this.depCcHeaderProviders, cppDeps.build());
+      this.depCcLinkProviders =
+          Iterables.concat(this.depCcLinkProviders, cppDepLinkParams.build());
+      return this;
+    }
+
+    private <T extends TransitiveInfoProvider> ImmutableList.Builder<T> addAnyProviders(
+        ImmutableList.Builder<T> listBuilder, TransitiveInfoCollection collection,
+        Class<T> providerClass) {
+      if (collection.getProvider(providerClass) != null) {
+        listBuilder.add(collection.getProvider(providerClass));
+      }
+      return listBuilder;
+    }
+
     /**
      * Add providers which will be exposed both to the declaring rule and to any dependers on the
      * declaring rule.
@@ -469,34 +503,6 @@
       return this;
     }
 
-    /**
-     * Sets information from {@code cc_library} dependencies to be used during compilation.
-     */
-    public Builder addDepCcHeaderProviders(Iterable<CppCompilationContext> depCcHeaderProviders) {
-      this.depCcHeaderProviders = Iterables.concat(this.depCcHeaderProviders, depCcHeaderProviders);
-      return this;
-    }
-
-    /**
-     * Sets information from {@code cc_library} dependencies to be used during linking from
-     * the {@link TransitiveInfoCollection} objects which contain the relevant link providers
-     * (for example, from the current rule's "deps" attribute).
-     */
-    public Builder addDepCcLinkProviders(List<? extends TransitiveInfoCollection> deps) {
-      for (TransitiveInfoCollection dep : deps) {
-        // Hack to determine if dep is a cc target. Required so objc_library archives packed in
-        // CcLinkParamsProvider do not get consumed as cc targets.
-        if (dep.getProvider(CppRunfilesProvider.class) != null) {
-          CcLinkParamsProvider ccLinkParamsProvider = dep.getProvider(CcLinkParamsProvider.class);
-          this.depCcLinkProviders =
-              Iterables.concat(
-                  this.depCcLinkProviders,
-                  ImmutableList.<CcLinkParamsProvider>of(ccLinkParamsProvider));
-        }
-      }
-      return this;
-    }
-
     ObjcCommon build() {
       Iterable<BundleableFile> bundleImports = BundleableFile.bundleImportsFromRule(context);
 
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 aad16f1..76130d9 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
@@ -27,7 +27,6 @@
 import com.google.devtools.build.lib.rules.cpp.CcLinkParams;
 import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider;
 import com.google.devtools.build.lib.rules.cpp.CcLinkParamsStore;
-import com.google.devtools.build.lib.rules.cpp.CppCompilationContext;
 import com.google.devtools.build.lib.rules.cpp.LinkerInputs;
 import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink;
 import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes;
@@ -82,14 +81,11 @@
         .addExtraSdkFrameworks(extraSdkFrameworks)
         .addDefines(ruleContext.getTokenizedStringListAttr("defines"))
         .setCompilationArtifacts(compilationArtifacts)
-        .addDepObjcProviders(ruleContext.getPrerequisites("deps", Mode.TARGET, ObjcProvider.class))
+        .addDeps(ruleContext.getPrerequisites("deps", Mode.TARGET))
         .addDepObjcProviders(
             ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.class))
         .addNonPropagatedDepObjcProviders(
             ruleContext.getPrerequisites("non_propagated_deps", Mode.TARGET, ObjcProvider.class))
-        .addDepCcHeaderProviders(
-            ruleContext.getPrerequisites("deps", Mode.TARGET, CppCompilationContext.class))
-        .addDepCcLinkProviders(ruleContext.getPrerequisites("deps", Mode.TARGET))
         .setIntermediateArtifacts(ObjcRuleClasses.intermediateArtifacts(ruleContext))
         .setAlwayslink(alwayslink)
         .setHasModuleMap()
@@ -130,13 +126,17 @@
             xcodeProviderBuilder, new Attribute("non_propagated_deps", Mode.TARGET))
         .registerActions(xcodeProviderBuilder.build());
 
+    J2ObjcMappingFileProvider j2ObjcMappingFileProvider = J2ObjcMappingFileProvider.union(
+        ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class));
+    J2ObjcEntryClassProvider j2ObjcEntryClassProvider = new J2ObjcEntryClassProvider.Builder()
+        .addTransitive(ruleContext.getPrerequisites("deps", Mode.TARGET,
+            J2ObjcEntryClassProvider.class)).build();
+
     return ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build())
         .addProvider(XcodeProvider.class, xcodeProviderBuilder.build())
         .addProvider(ObjcProvider.class, common.getObjcProvider())
-        .addProvider(
-            J2ObjcEntryClassProvider.class, J2ObjcEntryClassProvider.buildFrom(ruleContext))
-        .addProvider(
-            J2ObjcMappingFileProvider.class, ObjcRuleClasses.j2ObjcMappingFileProvider(ruleContext))
+        .addProvider(J2ObjcEntryClassProvider.class, j2ObjcEntryClassProvider)
+        .addProvider(J2ObjcMappingFileProvider.class, j2ObjcMappingFileProvider)
         .addProvider(
             InstrumentedFilesProvider.class,
             compilationSupport.getInstrumentedFilesProvider(common))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java
index 8ccc437..b11e26f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java
@@ -29,7 +29,6 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.BaseRuleClasses;
-import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
 import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.RuleDefinition;
@@ -107,25 +106,6 @@
         /*archiveFileNameSuffix=*/"_j2objc");
   }
 
-  /**
-   * Returns a {@link J2ObjcMappingFileProvider} containing J2ObjC mapping files from rules
-   * that can be reached transitively through the "deps" attribute.
-   *
-   * @param ruleContext the rule context of the current rule
-   * @return a {@link J2ObjcMappingFileProvider} containing J2ObjC mapping files information from
-   *     the transitive closure.
-   */
-  public static J2ObjcMappingFileProvider j2ObjcMappingFileProvider(RuleContext ruleContext) {
-    J2ObjcMappingFileProvider.Builder builder = new J2ObjcMappingFileProvider.Builder();
-    Iterable<J2ObjcMappingFileProvider> providers =
-        ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class);
-    for (J2ObjcMappingFileProvider provider : providers) {
-      builder.addTransitive(provider);
-    }
-
-    return builder.build();
-  }
-
   public static Artifact artifactByAppendingToBaseName(RuleContext context, String suffix) {
     return context.getPackageRelativeArtifact(
         context.getLabel().getName() + suffix, context.getBinOrGenfilesDirectory());