Propagate all providers from CcLibraryHelper into cc_proto_library.
Previously, at least one critical provider was not propagated (CppCompilationContext) which resulted in cc_library's being unable to find the generated headers.

--
PiperOrigin-RevId: 141800408
MOS_MIGRATED_REVID=141800408
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/BUILD b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/BUILD
index e81fe72..c93e0c2 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/BUILD
@@ -15,8 +15,7 @@
         "CcProtoLibraryRule.java",
     ],
     deps = [
-        ":CcProtoLibraryFilesToBuilderProvider",
-        ":CcProtoLibraryOutputGroupProvider",
+        ":CcProtoLibraryProviders",
         ":ProtoCcHeaderProvider",
         "//src/main/java/com/google/devtools/build/lib:build-base",
         "//src/main/java/com/google/devtools/build/lib:collect",
@@ -32,9 +31,10 @@
 )
 
 java_library(
-    name = "CcProtoLibraryFilesToBuilderProvider",
-    srcs = ["CcProtoLibraryFilesToBuilderProvider.java"],
+    name = "CcProtoLibraryProviders",
+    srcs = ["CcProtoLibraryProviders.java"],
     deps = [
+        "//src/main/java/com/google/devtools/build/lib:build-base",
         "//src/main/java/com/google/devtools/build/lib:collect",
         "//src/main/java/com/google/devtools/build/lib:concurrent",
         "//src/main/java/com/google/devtools/build/lib:transitive-info-provider",
@@ -43,18 +43,6 @@
 )
 
 java_library(
-    name = "CcProtoLibraryOutputGroupProvider",
-    srcs = ["CcProtoLibraryOutputGroupProvider.java"],
-    deps = [
-        "//src/main/java/com/google/devtools/build/lib:collect",
-        "//src/main/java/com/google/devtools/build/lib:concurrent",
-        "//src/main/java/com/google/devtools/build/lib:transitive-info-provider",
-        "//src/main/java/com/google/devtools/build/lib/actions",
-        "//third_party:guava",
-    ],
-)
-
-java_library(
     name = "ProtoCcHeaderProvider",
     srcs = ["ProtoCcHeaderProvider.java"],
     deps = [
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java
index de5e8b9..a0aaa5a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoAspect.java
@@ -26,6 +26,7 @@
 import com.google.devtools.build.lib.analysis.ConfiguredAspect;
 import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.OutputGroupProvider;
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
@@ -177,11 +178,11 @@
         // proto_library pretends to not generate them either.
         boolean hasDepWithoutPbH = false;
         NestedSetBuilder<Artifact> transitiveHeaders = NestedSetBuilder.stableOrder();
-        for (ProtoCcHeaderProvider headerProvider :
+        for (ProtoCcHeaderProvider provider :
             ruleContext.getPrerequisites("deps", TARGET, ProtoCcHeaderProvider.class)) {
-          helper.addPublicTextualHeaders(headerProvider.getHeaders());
-          transitiveHeaders.addTransitive(headerProvider.getHeaders());
-          hasDepWithoutPbH = hasDepWithoutPbH || !headerProvider.getGeneratesPbH();
+          helper.addPublicTextualHeaders(provider.getHeaders());
+          transitiveHeaders.addTransitive(provider.getHeaders());
+          hasDepWithoutPbH = hasDepWithoutPbH || !provider.getGeneratesPbH();
         }
         headerProvider = new ProtoCcHeaderProvider(transitiveHeaders.build(), !hasDepWithoutPbH);
       }
@@ -297,9 +298,11 @@
     }
 
     public void addProviders(ConfiguredAspect.Builder builder) {
+      builder.addProvider(
+          new CcProtoLibraryProviders(
+              filesBuilder.build(),
+              ccLibraryProviders.toBuilder().add(new OutputGroupProvider(outputGroups)).build()));
       builder.addProviders(ccLibraryProviders);
-      builder.addProvider(new CcProtoLibraryFilesToBuilderProvider(filesBuilder.build()));
-      builder.addProvider(new CcProtoLibraryOutputGroupProvider(outputGroups));
       if (headerProvider != null) {
         builder.addProvider(headerProvider);
       }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibrary.java
index b92501b..1f03ef1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibrary.java
@@ -22,14 +22,8 @@
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.Runfiles;
 import com.google.devtools.build.lib.analysis.RunfilesProvider;
-import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
-import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
 import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
-import com.google.devtools.build.lib.rules.cpp.CcExecutionDynamicLibrariesProvider;
-import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider;
-import com.google.devtools.build.lib.rules.cpp.CcNativeLibraryProvider;
 import com.google.devtools.build.lib.rules.cpp.CcSkylarkApiProvider;
-import com.google.devtools.build.lib.rules.cpp.CcSpecificLinkParamsProvider;
 
 /** Part of the implementation of cc_proto_library. */
 public class CcProtoLibrary implements RuleConfiguredTargetFactory {
@@ -47,35 +41,16 @@
               + "to remove unused deps.");
     }
 
-    TransitiveInfoCollection dep = checkNotNull(ruleContext.getPrerequisite("deps", TARGET));
+    CcProtoLibraryProviders depProviders =
+        checkNotNull(ruleContext.getPrerequisite("deps", TARGET))
+            .getProvider(CcProtoLibraryProviders.class);
 
-    RuleConfiguredTargetBuilder result =
-        new RuleConfiguredTargetBuilder(ruleContext)
-            .setFilesToBuild(
-                dep.getProvider(CcProtoLibraryFilesToBuilderProvider.class).filesBuilder)
-            .addProvider(
-                RunfilesProvider.class, RunfilesProvider.withData(Runfiles.EMPTY, Runfiles.EMPTY));
-
-    addProviderIfNotNull(result, dep.getProvider(CcLinkParamsProvider.class));
-    addProviderIfNotNull(result, dep.getProvider(CcNativeLibraryProvider.class));
-    addProviderIfNotNull(result, dep.getProvider(CcExecutionDynamicLibrariesProvider.class));
-    addProviderIfNotNull(result, dep.getProvider(CcSpecificLinkParamsProvider.class));
-    addProviderIfNotNull(result, dep.getProvider(ProtoCcHeaderProvider.class));
-
-    result.addSkylarkTransitiveInfo(CcSkylarkApiProvider.NAME, new CcSkylarkApiProvider());
-
-    CcProtoLibraryOutputGroupProvider outputGroups =
-        dep.getProvider(CcProtoLibraryOutputGroupProvider.class);
-    if (outputGroups != null) {
-      result.addOutputGroups(outputGroups.outputGroups);
-    }
-    return result.build();
-  }
-
-  private void addProviderIfNotNull(
-      RuleConfiguredTargetBuilder result, TransitiveInfoProvider provider) {
-    if (provider != null) {
-      result.addProvider(provider);
-    }
+    return new RuleConfiguredTargetBuilder(ruleContext)
+        .setFilesToBuild(depProviders.filesBuilder)
+        .addProvider(
+            RunfilesProvider.class, RunfilesProvider.withData(Runfiles.EMPTY, Runfiles.EMPTY))
+        .addProviders(depProviders.providerMap)
+        .addSkylarkTransitiveInfo(CcSkylarkApiProvider.NAME, new CcSkylarkApiProvider())
+        .build();
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibraryOutputGroupProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibraryOutputGroupProvider.java
deleted file mode 100644
index 49fe3ec..0000000
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibraryOutputGroupProvider.java
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright 2016 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.rules.cpp.proto;
-
-import com.google.common.collect.ImmutableMap;
-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.concurrent.ThreadSafety;
-
-/**
- * Used by CcProtoAspect to propagate output groups to CcProtoLibrary, where it is exposed via
- * setOutputGroups().
- */
-@ThreadSafety.Immutable
-final class CcProtoLibraryOutputGroupProvider implements TransitiveInfoProvider {
-  final ImmutableMap<String, NestedSet<Artifact>> outputGroups;
-
-  CcProtoLibraryOutputGroupProvider(ImmutableMap<String, NestedSet<Artifact>> outputGroups) {
-    this.outputGroups = outputGroups;
-  }
-}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibraryFilesToBuilderProvider.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibraryProviders.java
similarity index 71%
rename from src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibraryFilesToBuilderProvider.java
rename to src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibraryProviders.java
index 8170cd4..35b53d8 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibraryFilesToBuilderProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibraryProviders.java
@@ -16,18 +16,21 @@
 
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap;
 import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.concurrent.ThreadSafety;
 
 /**
- * Used by CcProtoAspect to propagate files-to-build to CcProtoLibrary, where it is exposed via
+ * Used by CcProtoAspect to propagate providers to CcProtoLibrary, where it is exposed via
  * setFilesToBuild().
  */
 @ThreadSafety.Immutable
-final class CcProtoLibraryFilesToBuilderProvider implements TransitiveInfoProvider {
+final class CcProtoLibraryProviders implements TransitiveInfoProvider {
   final NestedSet<Artifact> filesBuilder;
+  final TransitiveInfoProviderMap providerMap;
 
-  CcProtoLibraryFilesToBuilderProvider(NestedSet<Artifact> filesBuilder) {
+  CcProtoLibraryProviders(NestedSet<Artifact> filesBuilder, TransitiveInfoProviderMap providerMap) {
     this.filesBuilder = filesBuilder;
+    this.providerMap = providerMap;
   }
 }
diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD
index 246f9d8..60f781f 100644
--- a/src/test/java/com/google/devtools/build/lib/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/BUILD
@@ -965,7 +965,9 @@
     deps = [
         ":actions_testutil",
         ":analysis_testutil",
+        "//src/main/java/com/google/devtools/build/lib:build-base",
         "//src/main/java/com/google/devtools/build/lib:vfs",
+        "//src/main/java/com/google/devtools/build/lib/rules/cpp",
         "//src/main/java/com/google/devtools/build/lib/rules/cpp/proto:ProtoCcHeaderProvider",
         "//third_party:guava",
         "//third_party:junit4",
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibraryTest.java
index bac8dfb..90a4a17 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibraryTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibraryTest.java
@@ -20,6 +20,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.eventbus.EventBus;
 import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
+import com.google.devtools.build.lib.rules.cpp.CppCompilationContext;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import org.junit.Before;
 import org.junit.Test;
@@ -101,9 +102,23 @@
         "proto_library(name = 'alias_proto', deps = [':foo_proto'])",
         "proto_library(name = 'foo_proto', srcs = ['foo.proto'])");
 
-    ProtoCcHeaderProvider headers =
-        getConfiguredTarget("//x:foo_cc_proto").getProvider(ProtoCcHeaderProvider.class);
-    assertThat(prettyArtifactNames(headers.getHeaders())).containsExactly("x/foo.pb.h");
+    CppCompilationContext context =
+        getConfiguredTarget("//x:foo_cc_proto").getProvider(CppCompilationContext.class);
+    assertThat(prettyArtifactNames(context.getDeclaredIncludeSrcs())).containsExactly("x/foo.pb.h");
+  }
+
+  @Test
+  public void cppCompilationContext() throws Exception {
+    scratch.file(
+        "x/BUILD",
+        "cc_proto_library(name = 'foo_cc_proto', deps = ['foo_proto'])",
+        "proto_library(name = 'foo_proto', srcs = ['foo.proto'], deps = [':bar_proto'])",
+        "proto_library(name = 'bar_proto', srcs = ['bar.proto'])");
+
+    CppCompilationContext context =
+        getConfiguredTarget("//x:foo_cc_proto").getProvider(CppCompilationContext.class);
+    assertThat(prettyArtifactNames(context.getDeclaredIncludeSrcs()))
+        .containsExactly("x/foo.pb.h", "x/bar.pb.h");
   }
 
   // TODO(carmi): test blacklisted protos. I don't currently understand what's the wanted behavior.