Expose `CcCompilationContext` `direct_headers` and `direct_textual_headers` to Starlark.

This change allows Starlark to consume this field set by native rules, but does *not* yet provide an API for Starlark rules to set it when creating new compilation contexts (this is a bit more complicated when it merging `CcInfo` from dependencies is also involved).

RELNOTES: None.
PiperOrigin-RevId: 300773814
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCcLinkParamsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCcLinkParamsProvider.java
index 6c9cb87..98a4370 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCcLinkParamsProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidCcLinkParamsProvider.java
@@ -14,6 +14,7 @@
 
 package com.google.devtools.build.lib.rules.android;
 
+import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
@@ -24,7 +25,7 @@
 /** A target that provides C++ libraries to be linked into Android targets. */
 @Immutable
 public final class AndroidCcLinkParamsProvider extends NativeInfo
-    implements AndroidCcLinkParamsProviderApi<CcInfo> {
+    implements AndroidCcLinkParamsProviderApi<Artifact, CcInfo> {
 
   public static final Provider PROVIDER = new Provider();
 
@@ -42,13 +43,14 @@
 
   /** Provider class for {@link AndroidCcLinkParamsProvider} objects. */
   public static class Provider extends BuiltinProvider<AndroidCcLinkParamsProvider>
-      implements AndroidCcLinkParamsProviderApi.Provider<CcInfo> {
+      implements AndroidCcLinkParamsProviderApi.Provider<Artifact, CcInfo> {
     private Provider() {
       super(NAME, AndroidCcLinkParamsProvider.class);
     }
 
     @Override
-    public AndroidCcLinkParamsProviderApi<CcInfo> createInfo(CcInfo ccInfo) throws EvalException {
+    public AndroidCcLinkParamsProviderApi<Artifact, CcInfo> createInfo(CcInfo ccInfo)
+        throws EvalException {
       return new AndroidCcLinkParamsProvider(ccInfo);
     }
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java
index 2cca679..628a6f2 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationContext.java
@@ -40,6 +40,7 @@
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcCompilationContextApi;
 import com.google.devtools.build.lib.syntax.Depset;
 import com.google.devtools.build.lib.syntax.SkylarkType;
+import com.google.devtools.build.lib.syntax.StarlarkList;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.lib.vfs.PathFragment;
 import com.google.devtools.build.skyframe.SkyFunction.Environment;
@@ -61,7 +62,7 @@
  */
 @Immutable
 @AutoCodec
-public final class CcCompilationContext implements CcCompilationContextApi {
+public final class CcCompilationContext implements CcCompilationContextApi<Artifact> {
   /** An empty {@code CcCompilationContext}. */
   public static final CcCompilationContext EMPTY =
       builder(/* actionConstructionContext= */ null, /* configuration= */ null, /* label= */ null)
@@ -155,6 +156,16 @@
   }
 
   @Override
+  public StarlarkList<Artifact> getSkylarkDirectModularHeaders() {
+    return StarlarkList.immutableCopyOf(getDirectHdrs());
+  }
+
+  @Override
+  public StarlarkList<Artifact> getSkylarkDirectTextualHeaders() {
+    return StarlarkList.immutableCopyOf(getTextualHdrs());
+  }
+
+  @Override
   public Depset getSkylarkSystemIncludeDirs() {
     return Depset.of(
         SkylarkType.STRING,
@@ -280,10 +291,15 @@
   }
 
   /** Returns headers given as textual_hdrs in this target. */
-  public Iterable<Artifact> getTextualHdrs() {
+  public ImmutableList<Artifact> getTextualHdrs() {
     return headerInfo.textualHeaders;
   }
 
+  /** Returns headers given as textual_hdrs in this target. */
+  public ImmutableList<Artifact> getDirectHdrs() {
+    return headerInfo.modularHeaders;
+  }
+
   public ImmutableList<HeaderInfo> getTransitiveHeaderInfos() {
     return transitiveHeaderInfos.toList();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java
index c135a77..a7c7d1b 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcCompilationHelper.java
@@ -198,7 +198,7 @@
   // TODO(plf): Rename so that it's not confused with CcCompilationContext and also consider
   // merging
   // this class with {@code CcCompilationOutputs}.
-  public static final class CompilationInfo implements CompilationInfoApi {
+  public static final class CompilationInfo implements CompilationInfoApi<Artifact> {
     private final CcCompilationContext ccCompilationContext;
     private final CcCompilationOutputs compilationOutputs;
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcInfo.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcInfo.java
index e97d95a..0e2f0f5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcInfo.java
@@ -17,6 +17,7 @@
 import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
@@ -28,7 +29,7 @@
 
 /** Provider for C++ compilation and linking information. */
 @Immutable
-public final class CcInfo extends NativeInfo implements CcInfoApi {
+public final class CcInfo extends NativeInfo implements CcInfoApi<Artifact> {
   public static final Provider PROVIDER = new Provider();
   public static final CcInfo EMPTY = builder().build();
 
@@ -148,14 +149,15 @@
   }
 
   /** Provider class for {@link CcInfo} objects. */
-  public static class Provider extends BuiltinProvider<CcInfo> implements CcInfoApi.Provider {
+  public static class Provider extends BuiltinProvider<CcInfo>
+      implements CcInfoApi.Provider<Artifact> {
     private Provider() {
       super(CcInfoApi.NAME, CcInfo.class);
     }
 
     @Override
-    public CcInfoApi createInfo(Object skylarkCcCompilationContext, Object skylarkCcLinkingInfo)
-        throws EvalException {
+    public CcInfoApi<Artifact> createInfo(
+        Object skylarkCcCompilationContext, Object skylarkCcLinkingInfo) throws EvalException {
       CcCompilationContext ccCompilationContext =
           nullIfNone(skylarkCcCompilationContext, CcCompilationContext.class);
       // TODO(b/118663806): Eventually only CcLinkingContext will be allowed, this is for
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/GoogleLegacyStubs.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/GoogleLegacyStubs.java
index 4b563d7..9922402 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/GoogleLegacyStubs.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/GoogleLegacyStubs.java
@@ -56,9 +56,9 @@
           ConstraintValueInfoApi,
           SkylarkRuleContextApi<ConstraintValueInfoApi>,
           CcToolchainProviderApi<FeatureConfigurationApi>,
-          CompilationInfoApi,
+          CompilationInfoApi<FileApi>,
           FileApi,
-          CcCompilationContextApi,
+          CcCompilationContextApi<FileApi>,
           WrapCcIncludeProviderApi> {
 
     @Override
@@ -76,7 +76,7 @@
     }
 
     @Override
-    public CompilationInfoApi skylarkCreateCompileActions(
+    public CompilationInfoApi<FileApi> skylarkCreateCompileActions(
         SkylarkRuleContextApi<ConstraintValueInfoApi> skylarkRuleContext,
         FeatureConfigurationApi featureConfiguration,
         CcToolchainProviderApi<FeatureConfigurationApi> ccToolchain,
@@ -107,7 +107,7 @@
         SkylarkRuleContextApi<ConstraintValueInfoApi> skylarkRuleContext,
         CcToolchainProviderApi<FeatureConfigurationApi> ccToolchain,
         FeatureConfigurationApi featureConfiguration,
-        CcCompilationContextApi wrapperCcCompilationContext,
+        CcCompilationContextApi<FileApi> wrapperCcCompilationContext,
         Depset swigIncludes,
         FileApi swigSource,
         Sequence<?> subParameters, // <String>
@@ -131,11 +131,11 @@
           FileApi,
           ConstraintValueInfoApi,
           SkylarkRuleContextApi<ConstraintValueInfoApi>,
-          CcInfoApi,
+          CcInfoApi<FileApi>,
           FeatureConfigurationApi,
           CcToolchainProviderApi<FeatureConfigurationApi>,
-          CompilationInfoApi,
-          CcCompilationContextApi,
+          CompilationInfoApi<FileApi>,
+          CcCompilationContextApi<FileApi>,
           WrapCcIncludeProviderApi> {
 
     @Override
@@ -157,8 +157,9 @@
     }
 
     @Override
-    public PyWrapCcInfoApi getPyWrapCcInfo(
-        SkylarkRuleContextApi<ConstraintValueInfoApi> skylarkRuleContext, CcInfoApi ccInfo) {
+    public PyWrapCcInfoApi<FileApi> getPyWrapCcInfo(
+        SkylarkRuleContextApi<ConstraintValueInfoApi> skylarkRuleContext,
+        CcInfoApi<FileApi> ccInfo) {
       return null;
     }
   }
@@ -172,15 +173,15 @@
           FileApi,
           ConstraintValueInfoApi,
           SkylarkRuleContextApi<ConstraintValueInfoApi>,
-          CcInfoApi,
+          CcInfoApi<FileApi>,
           FeatureConfigurationApi,
           CcToolchainProviderApi<FeatureConfigurationApi>,
           CcLinkingContextApi<FileApi>,
           GoConfigurationApi,
           GoContextInfoApi,
           TransitiveInfoCollectionApi,
-          CompilationInfoApi,
-          CcCompilationContextApi,
+          CompilationInfoApi<FileApi>,
+          CcCompilationContextApi<FileApi>,
           WrapCcIncludeProviderApi> {
 
     @Override
@@ -201,13 +202,14 @@
         FileApi pkg,
         FileApi gopkg,
         Object skylarkWrapContext,
-        CcInfoApi ccInfo) {
+        CcInfoApi<FileApi> ccInfo) {
       return null;
     }
 
     @Override
-    public GoWrapCcInfoApi getGoWrapCcInfo(
-        SkylarkRuleContextApi<ConstraintValueInfoApi> skylarkRuleContext, CcInfoApi ccInfo) {
+    public GoWrapCcInfoApi<FileApi> getGoWrapCcInfo(
+        SkylarkRuleContextApi<ConstraintValueInfoApi> skylarkRuleContext,
+        CcInfoApi<FileApi> ccInfo) {
       return null;
     }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCcLinkParamsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCcLinkParamsProvider.java
index 245540bd..89d5c05 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaCcLinkParamsProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaCcLinkParamsProvider.java
@@ -14,6 +14,7 @@
 
 package com.google.devtools.build.lib.rules.java;
 
+import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.Info;
@@ -23,7 +24,8 @@
 
 /** A target that provides C++ libraries to be linked into Java targets. */
 @Immutable
-public final class JavaCcLinkParamsProvider implements Info, JavaCcLinkParamsProviderApi<CcInfo> {
+public final class JavaCcLinkParamsProvider
+    implements Info, JavaCcLinkParamsProviderApi<Artifact, CcInfo> {
   public static final String PROVIDER_NAME = "JavaCcLinkParamsInfo";
   public static final Provider PROVIDER = new Provider();
 
@@ -45,13 +47,14 @@
 
   /** Provider class for {@link JavaCcLinkParamsProvider} objects. */
   public static class Provider extends BuiltinProvider<JavaCcLinkParamsProvider>
-      implements JavaCcLinkParamsProviderApi.Provider<CcInfo> {
+      implements JavaCcLinkParamsProviderApi.Provider<Artifact, CcInfo> {
     private Provider() {
       super(PROVIDER_NAME, JavaCcLinkParamsProvider.class);
     }
 
     @Override
-    public JavaCcLinkParamsProviderApi<CcInfo> createInfo(CcInfo ccInfo) throws EvalException {
+    public JavaCcLinkParamsProviderApi<Artifact, CcInfo> createInfo(CcInfo ccInfo)
+        throws EvalException {
       return new JavaCcLinkParamsProvider(ccInfo);
     }
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyCcLinkParamsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyCcLinkParamsProvider.java
index 7badc9b..df1c9bc 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/python/PyCcLinkParamsProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyCcLinkParamsProvider.java
@@ -13,6 +13,7 @@
 // limitations under the License.
 package com.google.devtools.build.lib.rules.python;
 
+import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.NativeInfo;
@@ -23,7 +24,8 @@
 /** A target that provides C++ libraries to be linked into Python targets. */
 @Immutable
 @AutoCodec
-public final class PyCcLinkParamsProvider extends NativeInfo implements PyCcLinkParamsProviderApi {
+public final class PyCcLinkParamsProvider extends NativeInfo
+    implements PyCcLinkParamsProviderApi<Artifact> {
   public static final Provider PROVIDER = new Provider();
 
   private final CcInfo ccInfo;
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidCcLinkParamsProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidCcLinkParamsProviderApi.java
index 24c91be..07020cc 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidCcLinkParamsProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/android/AndroidCcLinkParamsProviderApi.java
@@ -14,6 +14,7 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi.android;
 
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcInfoApi;
@@ -33,13 +34,15 @@
             + "Information about the c++ libraries to be linked into Android targets.",
     documented = false,
     category = SkylarkModuleCategory.PROVIDER)
-public interface AndroidCcLinkParamsProviderApi<T extends CcInfoApi> extends StructApi {
+public interface AndroidCcLinkParamsProviderApi<
+        FileT extends FileApi, CcInfoT extends CcInfoApi<FileT>>
+    extends StructApi {
   /** Name of this info object. */
   String NAME = "AndroidCcLinkParamsInfo";
 
   /** Returns the cc link params. */
   @SkylarkCallable(name = "link_params", structField = true, doc = "", documented = false)
-  T getLinkParams();
+  CcInfoT getLinkParams();
 
   /** The provider implementing this can construct the AndroidCcLinkParamsInfo provider. */
   @SkylarkModule(
@@ -48,7 +51,7 @@
           "Do not use this module. It is intended for migration purposes only. If you depend on "
               + "it, you will be broken when it is removed.",
       documented = false)
-  interface Provider<T extends CcInfoApi> extends ProviderApi {
+  interface Provider<FileT extends FileApi, CcInfoT extends CcInfoApi<FileT>> extends ProviderApi {
 
     @SkylarkCallable(
         name = NAME,
@@ -66,6 +69,7 @@
     @SkylarkConstructor(
         objectType = AndroidCcLinkParamsProviderApi.class,
         receiverNameForDoc = NAME)
-    AndroidCcLinkParamsProviderApi<T> createInfo(T store) throws EvalException;
+    public AndroidCcLinkParamsProviderApi<FileT, CcInfoT> createInfo(CcInfoT store)
+        throws EvalException;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/ObjcProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/ObjcProviderApi.java
index 1fbdcd2..205a399 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/ObjcProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/apple/ObjcProviderApi.java
@@ -277,5 +277,5 @@
           "Returns the embedded <code>CcCompilationContext</code> that contains the"
               + "provider's compilation information.",
       structField = true)
-  CcCompilationContextApi getCcCompilationContext();
+  CcCompilationContextApi<FileApiT> getCcCompilationContext();
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BazelCcModuleApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BazelCcModuleApi.java
index 30f697e..69ec207 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BazelCcModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/BazelCcModuleApi.java
@@ -40,7 +40,7 @@
         SkylarkRuleContextT extends SkylarkRuleContextApi<ConstraintValueT>,
         CcToolchainProviderT extends CcToolchainProviderApi<FeatureConfigurationT>,
         FeatureConfigurationT extends FeatureConfigurationApi,
-        CompilationContextT extends CcCompilationContextApi,
+        CompilationContextT extends CcCompilationContextApi<FileT>,
         CompilationOutputsT extends CcCompilationOutputsApi<FileT>,
         LinkingOutputsT extends CcLinkingOutputsApi<FileT>,
         LinkerInputT extends LinkerInputApi<LibraryToLinkT, FileT>,
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcBootstrap.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcBootstrap.java
index 09c160b..69bf27b 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcBootstrap.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcBootstrap.java
@@ -32,7 +32,7 @@
           ? extends FileApi,
           ? extends CcToolchainProviderApi<? extends FeatureConfigurationApi>,
           ? extends FeatureConfigurationApi,
-          ? extends CcCompilationContextApi,
+          ? extends CcCompilationContextApi<? extends FileApi>,
           ? extends
               LinkerInputApi<? extends LibraryToLinkApi<? extends FileApi>, ? extends FileApi>,
           ? extends CcLinkingContextApi<? extends FileApi>,
@@ -44,7 +44,7 @@
           ? extends CcCompilationOutputsApi<? extends FileApi>>
       ccModule;
 
-  private final CcInfoApi.Provider ccInfoProvider;
+  private final CcInfoApi.Provider<? extends FileApi> ccInfoProvider;
   private final CcToolchainConfigInfoApi.Provider ccToolchainConfigInfoProvider;
   private final PyWrapCcHelperApi<?, ?, ?, ?, ?, ?, ?, ?, ?> pyWrapCcHelper;
   private final GoWrapCcHelperApi<?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?> goWrapCcHelper;
@@ -57,7 +57,7 @@
               ? extends FileApi,
               ? extends CcToolchainProviderApi<? extends FeatureConfigurationApi>,
               ? extends FeatureConfigurationApi,
-              ? extends CcCompilationContextApi,
+              ? extends CcCompilationContextApi<? extends FileApi>,
               ? extends
                   LinkerInputApi<? extends LibraryToLinkApi<? extends FileApi>, ? extends FileApi>,
               ? extends CcLinkingContextApi<? extends FileApi>,
@@ -68,7 +68,7 @@
               ? extends CcToolchainConfigInfoApi,
               ? extends CcCompilationOutputsApi<? extends FileApi>>
           ccModule,
-      CcInfoApi.Provider ccInfoProvider,
+      CcInfoApi.Provider<? extends FileApi> ccInfoProvider,
       CcToolchainConfigInfoApi.Provider ccToolchainConfigInfoProvider,
       PyWrapCcHelperApi<?, ?, ?, ?, ?, ?, ?, ?, ?> pyWrapCcHelper,
       GoWrapCcHelperApi<?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?> goWrapCcHelper,
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcCompilationContextApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcCompilationContextApi.java
index 30f7038..4c17c28 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcCompilationContextApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcCompilationContextApi.java
@@ -14,10 +14,12 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi.cpp;
 
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
 import com.google.devtools.build.lib.syntax.Depset;
+import com.google.devtools.build.lib.syntax.StarlarkList;
 import com.google.devtools.build.lib.syntax.StarlarkValue;
 
 /**
@@ -29,7 +31,7 @@
     doc =
         "Immutable store of information needed for C++ compilation that is aggregated across "
             + "dependencies.")
-public interface CcCompilationContextApi extends StarlarkValue {
+public interface CcCompilationContextApi<FileT extends FileApi> extends StarlarkValue {
   @SkylarkCallable(
       name = "defines",
       doc =
@@ -85,4 +87,20 @@
               + " or absolute. Usually passed with -iquote.",
       structField = true)
   Depset getSkylarkQuoteIncludeDirs();
+
+  @SkylarkCallable(
+      name = "direct_headers",
+      doc =
+          "Returns the list of header files that are declared by the \"hdrs\" attribute of this"
+              + " target.",
+      structField = true)
+  StarlarkList<FileT> getSkylarkDirectModularHeaders();
+
+  @SkylarkCallable(
+      name = "direct_textual_headers",
+      doc =
+          "Returns the list of header files that are declared by the \"textual_hdrs\" attribute of"
+              + " this target.",
+      structField = true)
+  StarlarkList<FileT> getSkylarkDirectTextualHeaders();
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcInfoApi.java
index c24fc1c..548dcd7 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcInfoApi.java
@@ -14,6 +14,7 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi.cpp;
 
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.skylarkinterface.Param;
@@ -34,14 +35,14 @@
             + "is also a marking provider telling C++ rules that they can depend on the rule "
             + "with this provider. If it is not intended for the rule to be depended on by C++, "
             + "the rule should wrap the CcInfo in some other provider.")
-public interface CcInfoApi extends StructApi {
+public interface CcInfoApi<FileT extends FileApi> extends StructApi {
   String NAME = "CcInfo";
 
   @SkylarkCallable(
       name = "compilation_context",
       doc = "Returns the <code>CompilationContext</code>",
       structField = true)
-  CcCompilationContextApi getCcCompilationContext();
+  CcCompilationContextApi<FileT> getCcCompilationContext();
 
   @SkylarkCallable(
       name = "linking_context",
@@ -56,7 +57,7 @@
       // This object is documented via the CcInfo documentation and the docuemntation of its
       // callable function.
       documented = false)
-  interface Provider extends ProviderApi {
+  interface Provider<FileT extends FileApi> extends ProviderApi {
 
     @SkylarkCallable(
         name = NAME,
@@ -87,6 +88,7 @@
         },
         selfCall = true)
     @SkylarkConstructor(objectType = CcInfoApi.class, receiverNameForDoc = NAME)
-    CcInfoApi createInfo(Object ccCompilationContext, Object ccLinkingInfo) throws EvalException;
+    CcInfoApi<FileT> createInfo(Object ccCompilationContext, Object ccLinkingInfo)
+        throws EvalException;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java
index b4d83cf..6d87106 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CcModuleApi.java
@@ -43,7 +43,7 @@
         FileT extends FileApi,
         CcToolchainProviderT extends CcToolchainProviderApi<?>,
         FeatureConfigurationT extends FeatureConfigurationApi,
-        CompilationContextT extends CcCompilationContextApi,
+        CompilationContextT extends CcCompilationContextApi<FileT>,
         LinkerInputT extends LinkerInputApi<LibraryToLinkT, FileT>,
         LinkingContextT extends CcLinkingContextApi<?>,
         LibraryToLinkT extends LibraryToLinkApi<FileT>,
@@ -714,7 +714,7 @@
             defaultValue = "[]",
             type = Sequence.class)
       })
-  CcInfoApi mergeCcInfos(Sequence<?> ccInfos) // <CcInfoApi> expected
+  CcInfoApi<FileT> mergeCcInfos(Sequence<?> ccInfos) // <CcInfoApi> expected
       throws EvalException;
 
   @SkylarkCallable(
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CompilationInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CompilationInfoApi.java
index 97b8a0b..0f0dd49 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CompilationInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/CompilationInfoApi.java
@@ -14,6 +14,7 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi.cpp;
 
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
@@ -25,10 +26,10 @@
     documented = false,
     category = SkylarkModuleCategory.BUILTIN,
     doc = "Helper class containing CC compilation providers.")
-public interface CompilationInfoApi extends StarlarkValue {
+public interface CompilationInfoApi<FileT extends FileApi> extends StarlarkValue {
   @SkylarkCallable(name = "cc_compilation_outputs", structField = true, documented = false)
   CcCompilationOutputsApi<?> getCcCompilationOutputs();
 
   @SkylarkCallable(name = "compilation_context", structField = true, documented = false)
-  CcCompilationContextApi getCcCompilationContext();
+  CcCompilationContextApi<FileT> getCcCompilationContext();
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/GoWrapCcHelperApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/GoWrapCcHelperApi.java
index 57c741e..31d1d3a 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/GoWrapCcHelperApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/GoWrapCcHelperApi.java
@@ -47,15 +47,15 @@
         FileT extends FileApi,
         ConstraintValueT extends ConstraintValueInfoApi,
         SkylarkRuleContextT extends SkylarkRuleContextApi<ConstraintValueT>,
-        CcInfoT extends CcInfoApi,
+        CcInfoT extends CcInfoApi<FileT>,
         FeatureConfigurationT extends FeatureConfigurationApi,
         CcToolchainProviderT extends CcToolchainProviderApi<FeatureConfigurationT>,
         CcLinkingContextT extends CcLinkingContextApi<FileT>,
         GoConfigurationT extends GoConfigurationApi,
         GoContextInfoT extends GoContextInfoApi,
         TransitiveInfoCollectionT extends TransitiveInfoCollectionApi,
-        CompilationInfoT extends CompilationInfoApi,
-        CcCompilationContextT extends CcCompilationContextApi,
+        CompilationInfoT extends CompilationInfoApi<FileT>,
+        CcCompilationContextT extends CcCompilationContextApi<FileT>,
         WrapCcIncludeProviderT extends WrapCcIncludeProviderApi>
     extends WrapCcHelperApi<
         FeatureConfigurationT,
@@ -126,7 +126,8 @@
         @Param(name = "cc_info", positional = false, named = true, type = CcInfoApi.class),
       })
   // TODO(b/113797843): GoWrapCcInfo is not written in Skylark because several native rules use it.
-  public GoWrapCcInfoApi getGoWrapCcInfo(SkylarkRuleContextT skylarkRuleContext, CcInfoT ccInfo)
+  public GoWrapCcInfoApi<FileT> getGoWrapCcInfo(
+      SkylarkRuleContextT skylarkRuleContext, CcInfoT ccInfo)
       throws EvalException, InterruptedException;
 
   @SkylarkCallable(
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/GoWrapCcInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/GoWrapCcInfoApi.java
index 5d97f57..fe18c3e 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/GoWrapCcInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/GoWrapCcInfoApi.java
@@ -14,6 +14,7 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi.cpp;
 
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
@@ -33,10 +34,10 @@
     documented = false,
     category = SkylarkModuleCategory.PROVIDER,
     doc = "")
-public interface GoWrapCcInfoApi extends StructApi {
+public interface GoWrapCcInfoApi<FileT extends FileApi> extends StructApi {
 
   @SkylarkCallable(name = "cc_info", structField = true, documented = false, doc = "")
-  CcInfoApi getCcInfo();
+  CcInfoApi<FileT> getCcInfo();
 
   /** Provider for GoWrapCcInfo objects. */
   @SkylarkModule(name = "Provider", doc = "", documented = false)
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/PyCcLinkParamsProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/PyCcLinkParamsProviderApi.java
index 8a869d8..fe7e9b8 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/PyCcLinkParamsProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/PyCcLinkParamsProviderApi.java
@@ -14,6 +14,7 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi.cpp;
 
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
@@ -26,9 +27,9 @@
     documented = false,
     category = SkylarkModuleCategory.PROVIDER,
     doc = "Wrapper for every C++ linking provider")
-public interface PyCcLinkParamsProviderApi extends StructApi {
+public interface PyCcLinkParamsProviderApi<FileT extends FileApi> extends StructApi {
   @SkylarkCallable(name = "cc_info", doc = "", structField = true, documented = false)
-  CcInfoApi getCcInfo();
+  CcInfoApi<FileT> getCcInfo();
 
   /** Provider for PyCcLinkParamsProvider objects. */
   @SkylarkModule(name = "Provider", doc = "", documented = false)
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/PyWrapCcHelperApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/PyWrapCcHelperApi.java
index 5800034..777d06f 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/PyWrapCcHelperApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/PyWrapCcHelperApi.java
@@ -42,11 +42,11 @@
         FileT extends FileApi,
         ConstraintValueT extends ConstraintValueInfoApi,
         SkylarkRuleContextT extends SkylarkRuleContextApi<ConstraintValueT>,
-        CcInfoT extends CcInfoApi,
+        CcInfoT extends CcInfoApi<FileT>,
         FeatureConfigurationT extends FeatureConfigurationApi,
         CcToolchainProviderT extends CcToolchainProviderApi<FeatureConfigurationT>,
-        CompilationInfoT extends CompilationInfoApi,
-        CcCompilationContextT extends CcCompilationContextApi,
+        CompilationInfoT extends CompilationInfoApi<FileT>,
+        CcCompilationContextT extends CcCompilationContextApi<FileT>,
         WrapCcIncludeProviderT extends WrapCcIncludeProviderApi>
     extends WrapCcHelperApi<
         FeatureConfigurationT,
@@ -102,6 +102,7 @@
         @Param(name = "cc_info", positional = false, named = true, type = CcInfoApi.class),
       })
   // TODO(plf): PyWrapCcInfo is not written in Skylark because several native rules use it.
-  public PyWrapCcInfoApi getPyWrapCcInfo(SkylarkRuleContextT skylarkRuleContext, CcInfoT ccInfo)
+  public PyWrapCcInfoApi<FileT> getPyWrapCcInfo(
+      SkylarkRuleContextT skylarkRuleContext, CcInfoT ccInfo)
       throws EvalException, InterruptedException;
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/PyWrapCcInfoApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/PyWrapCcInfoApi.java
index 39a2897..b31665a 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/PyWrapCcInfoApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/PyWrapCcInfoApi.java
@@ -14,6 +14,7 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi.cpp;
 
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.StructApi;
 import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
@@ -33,10 +34,10 @@
     documented = false,
     category = SkylarkModuleCategory.PROVIDER,
     doc = "")
-public interface PyWrapCcInfoApi extends StructApi {
+public interface PyWrapCcInfoApi<FileT extends FileApi> extends StructApi {
 
   @SkylarkCallable(name = "cc_info", documented = false, structField = true, doc = "")
-  CcInfoApi getCcInfo();
+  CcInfoApi<FileT> getCcInfo();
 
   /** Provider for PyWrapCcInfo objects. */
   @SkylarkModule(name = "Provider", doc = "", documented = false)
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/WrapCcHelperApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/WrapCcHelperApi.java
index 9cd2edf..27d5206 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/WrapCcHelperApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp/WrapCcHelperApi.java
@@ -41,9 +41,9 @@
         ConstraintValueT extends ConstraintValueInfoApi,
         SkylarkRuleContextT extends SkylarkRuleContextApi<ConstraintValueT>,
         CcToolchainProviderT extends CcToolchainProviderApi<FeatureConfigurationT>,
-        CompilationInfoT extends CompilationInfoApi,
+        CompilationInfoT extends CompilationInfoApi<FileT>,
         FileT extends FileApi,
-        CcCompilationContextT extends CcCompilationContextApi,
+        CcCompilationContextT extends CcCompilationContextApi<FileT>,
         WrapCcIncludeProviderT extends WrapCcIncludeProviderApi>
     extends StarlarkValue {
 
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaBootstrap.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaBootstrap.java
index 87e8a52..b15253f 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaBootstrap.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaBootstrap.java
@@ -26,13 +26,13 @@
   private final JavaCommonApi<?, ?, ?, ?, ?, ?, ?> javaCommonApi;
   private final JavaInfoProviderApi javaInfoProviderApi;
   private final JavaProtoCommonApi<?, ?, ?, ?> javaProtoCommonApi;
-  private final JavaCcLinkParamsProviderApi.Provider<?> javaCcLinkParamsProviderApiProvider;
+  private final JavaCcLinkParamsProviderApi.Provider<?, ?> javaCcLinkParamsProviderApiProvider;
 
   public JavaBootstrap(
       JavaCommonApi<?, ?, ?, ?, ?, ?, ?> javaCommonApi,
       JavaInfoProviderApi javaInfoProviderApi,
       JavaProtoCommonApi<?, ?, ?, ?> javaProtoCommonApi,
-      JavaCcLinkParamsProviderApi.Provider<?> javaCcLinkParamsProviderApiProvider) {
+      JavaCcLinkParamsProviderApi.Provider<?, ?> javaCcLinkParamsProviderApiProvider) {
     this.javaCommonApi = javaCommonApi;
     this.javaInfoProviderApi = javaInfoProviderApi;
     this.javaProtoCommonApi = javaProtoCommonApi;
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCcLinkParamsProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCcLinkParamsProviderApi.java
index 969fe4d..7586b5b 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCcLinkParamsProviderApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCcLinkParamsProviderApi.java
@@ -14,6 +14,7 @@
 
 package com.google.devtools.build.lib.skylarkbuildapi.java;
 
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.core.ProviderApi;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcInfoApi;
 import com.google.devtools.build.lib.skylarkinterface.Param;
@@ -34,7 +35,9 @@
             + "Information about the c++ libraries to be linked into Java targets.",
     documented = true,
     category = SkylarkModuleCategory.PROVIDER)
-public interface JavaCcLinkParamsProviderApi<CcInfoApiT extends CcInfoApi> extends StarlarkValue {
+public interface JavaCcLinkParamsProviderApi<
+        FileT extends FileApi, CcInfoApiT extends CcInfoApi<FileT>>
+    extends StarlarkValue {
   /** Name of this info object. */
   String NAME = "JavaCcLinkParamsInfo";
 
@@ -54,7 +57,8 @@
           "Do not use this module. It is intended for migration purposes only. If you depend on "
               + "it, you will be broken when it is removed.",
       documented = false)
-  interface Provider<CcInfoApiT extends CcInfoApi> extends ProviderApi {
+  public interface Provider<FileT extends FileApi, CcInfoApiT extends CcInfoApi<FileT>>
+      extends ProviderApi {
 
     @SkylarkCallable(
         name = NAME,
@@ -71,6 +75,7 @@
         },
         selfCall = true)
     @SkylarkConstructor(objectType = JavaCcLinkParamsProviderApi.class, receiverNameForDoc = NAME)
-    JavaCcLinkParamsProviderApi<CcInfoApiT> createInfo(CcInfoApiT store) throws EvalException;
+    public JavaCcLinkParamsProviderApi<FileT, CcInfoApiT> createInfo(CcInfoApiT store)
+        throws EvalException;
   }
 }
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcInfo.java
index 54b5259..ee8d027 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcInfo.java
@@ -14,6 +14,7 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi.cpp;
 
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcCompilationContextApi;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcInfoApi;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcLinkingContextApi;
@@ -21,10 +22,10 @@
 import com.google.devtools.build.lib.syntax.Printer;
 
 /** Fake implementation of {@link CcInfoApi}. */
-public class FakeCcInfo implements CcInfoApi {
+public class FakeCcInfo implements CcInfoApi<FileApi> {
 
   @Override
-  public CcCompilationContextApi getCcCompilationContext() {
+  public CcCompilationContextApi<FileApi> getCcCompilationContext() {
     return null;
   }
 
@@ -47,10 +48,10 @@
   public void repr(Printer printer) {}
 
   /** Fake implementation of {@link CcInfoApi.Provider}. */
-  public static class Provider implements CcInfoApi.Provider {
+  public static class Provider implements CcInfoApi.Provider<FileApi> {
 
     @Override
-    public CcInfoApi createInfo(Object ccCompilationContext, Object ccLinkingInfo)
+    public CcInfoApi<FileApi> createInfo(Object ccCompilationContext, Object ccLinkingInfo)
         throws EvalException {
       return new FakeCcInfo();
     }
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
index d371a9e..6f21a43 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeCcModule.java
@@ -50,7 +50,7 @@
         SkylarkRuleContextApi<ConstraintValueInfoApi>,
         CcToolchainProviderApi<FeatureConfigurationApi>,
         FeatureConfigurationApi,
-        CcCompilationContextApi,
+        CcCompilationContextApi<FileApi>,
         CcCompilationOutputsApi<FileApi>,
         CcLinkingOutputsApi<FileApi>,
         LinkerInputApi<LibraryToLinkApi<FileApi>, FileApi>,
@@ -193,12 +193,12 @@
   }
 
   @Override
-  public CcInfoApi mergeCcInfos(Sequence<?> ccInfos) {
+  public CcInfoApi<FileApi> mergeCcInfos(Sequence<?> ccInfos) {
     return null;
   }
 
   @Override
-  public CcCompilationContextApi createCcCompilationContext(
+  public CcCompilationContextApi<FileApi> createCcCompilationContext(
       Object headers,
       Object systemIncludes,
       Object includes,
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeGoWrapCcHelper.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeGoWrapCcHelper.java
index 389fc64..bf9936e 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeGoWrapCcHelper.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakeGoWrapCcHelper.java
@@ -42,15 +42,15 @@
         FileApi,
         ConstraintValueInfoApi,
         SkylarkRuleContextApi<ConstraintValueInfoApi>,
-        CcInfoApi,
+        CcInfoApi<FileApi>,
         FeatureConfigurationApi,
         CcToolchainProviderApi<FeatureConfigurationApi>,
         CcLinkingContextApi<FileApi>,
         GoConfigurationApi,
         GoContextInfoApi,
         TransitiveInfoCollectionApi,
-        CompilationInfoApi,
-        CcCompilationContextApi,
+        CompilationInfoApi<FileApi>,
+        CcCompilationContextApi<FileApi>,
         WrapCcIncludeProviderApi> {
 
   @Override
@@ -71,13 +71,13 @@
       FileApi pkg,
       FileApi gopkg,
       Object skylarkWrapContext,
-      CcInfoApi ccInfo) {
+      CcInfoApi<FileApi> ccInfo) {
     return null;
   }
 
   @Override
-  public GoWrapCcInfoApi getGoWrapCcInfo(
-      SkylarkRuleContextApi<ConstraintValueInfoApi> skylarkRuleContext, CcInfoApi ccInfo) {
+  public GoWrapCcInfoApi<FileApi> getGoWrapCcInfo(
+      SkylarkRuleContextApi<ConstraintValueInfoApi> skylarkRuleContext, CcInfoApi<FileApi> ccInfo) {
     return null;
   }
 
@@ -135,7 +135,7 @@
   }
 
   @Override
-  public CompilationInfoApi skylarkCreateCompileActions(
+  public CompilationInfoApi<FileApi> skylarkCreateCompileActions(
       SkylarkRuleContextApi<ConstraintValueInfoApi> skylarkRuleContext,
       FeatureConfigurationApi featureConfiguration,
       CcToolchainProviderApi<FeatureConfigurationApi> ccToolchain,
@@ -163,7 +163,7 @@
       SkylarkRuleContextApi<ConstraintValueInfoApi> skylarkRuleContext,
       CcToolchainProviderApi<FeatureConfigurationApi> ccToolchain,
       FeatureConfigurationApi featureConfiguration,
-      CcCompilationContextApi wrapperCcCompilationContext,
+      CcCompilationContextApi<FileApi> wrapperCcCompilationContext,
       Depset swigIncludes,
       FileApi swigSource,
       Sequence<?> subParameters,
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyCcLinkParamsProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyCcLinkParamsProvider.java
index b4954ee..e8e7986 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyCcLinkParamsProvider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyCcLinkParamsProvider.java
@@ -14,16 +14,17 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi.cpp;
 
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcInfoApi;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.PyCcLinkParamsProviderApi;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Printer;
 
 /** Fake implementation of {@link PyCcLinkParamsProviderApi}. */
-public class FakePyCcLinkParamsProvider implements PyCcLinkParamsProviderApi {
+public class FakePyCcLinkParamsProvider implements PyCcLinkParamsProviderApi<FileApi> {
 
   @Override
-  public CcInfoApi getCcInfo() {
+  public CcInfoApi<FileApi> getCcInfo() {
     return null;
   }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcHelper.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcHelper.java
index 8d45288..35b135c 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcHelper.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcHelper.java
@@ -35,11 +35,11 @@
         FileApi,
         ConstraintValueInfoApi,
         SkylarkRuleContextApi<ConstraintValueInfoApi>,
-        CcInfoApi,
+        CcInfoApi<FileApi>,
         FeatureConfigurationApi,
         CcToolchainProviderApi<FeatureConfigurationApi>,
-        CompilationInfoApi,
-        CcCompilationContextApi,
+        CompilationInfoApi<FileApi>,
+        CcCompilationContextApi<FileApi>,
         WrapCcIncludeProviderApi> {
 
   @Override
@@ -61,8 +61,8 @@
   }
 
   @Override
-  public PyWrapCcInfoApi getPyWrapCcInfo(
-      SkylarkRuleContextApi<ConstraintValueInfoApi> skylarkRuleContext, CcInfoApi ccInfo) {
+  public PyWrapCcInfoApi<FileApi> getPyWrapCcInfo(
+      SkylarkRuleContextApi<ConstraintValueInfoApi> skylarkRuleContext, CcInfoApi<FileApi> ccInfo) {
     return null;
   }
 
@@ -96,7 +96,7 @@
       SkylarkRuleContextApi<ConstraintValueInfoApi> skylarkRuleContext,
       CcToolchainProviderApi<FeatureConfigurationApi> ccToolchain,
       FeatureConfigurationApi featureConfiguration,
-      CcCompilationContextApi wrapperCcCompilationContext,
+      CcCompilationContextApi<FileApi> wrapperCcCompilationContext,
       Depset swigIncludes,
       FileApi swigSource,
       Sequence<?> subParameters,
@@ -110,7 +110,7 @@
       Object zipTool) {}
 
   @Override
-  public CompilationInfoApi skylarkCreateCompileActions(
+  public CompilationInfoApi<FileApi> skylarkCreateCompileActions(
       SkylarkRuleContextApi<ConstraintValueInfoApi> skylarkRuleContext,
       FeatureConfigurationApi featureConfiguration,
       CcToolchainProviderApi<FeatureConfigurationApi> ccToolchain,
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcInfo.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcInfo.java
index a8648aa..926ee4d 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcInfo.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp/FakePyWrapCcInfo.java
@@ -14,6 +14,7 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi.cpp;
 
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcInfoApi;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.PyWrapCcHelperApi;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.PyWrapCcInfoApi;
@@ -21,10 +22,10 @@
 import com.google.devtools.build.lib.syntax.Printer;
 
 /** Fake implementation of {@link PyWrapCcHelperApi}. */
-public class FakePyWrapCcInfo implements PyWrapCcInfoApi {
+public class FakePyWrapCcInfo implements PyWrapCcInfoApi<FileApi> {
 
   @Override
-  public CcInfoApi getCcInfo() {
+  public CcInfoApi<FileApi> getCcInfo() {
     return null;
   }
 
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCcLinkParamsProvider.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCcLinkParamsProvider.java
index d130b49..6cac2b5 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCcLinkParamsProvider.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCcLinkParamsProvider.java
@@ -14,24 +14,28 @@
 
 package com.google.devtools.build.skydoc.fakebuildapi.java;
 
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcInfoApi;
 import com.google.devtools.build.lib.skylarkbuildapi.java.JavaCcLinkParamsProviderApi;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.Printer;
 
 /** Fake implementation of {@link JavaCcLinkParamsProvider}. */
-public class FakeJavaCcLinkParamsProvider implements JavaCcLinkParamsProviderApi<CcInfoApi> {
+public class FakeJavaCcLinkParamsProvider
+    implements JavaCcLinkParamsProviderApi<FileApi, CcInfoApi<FileApi>> {
 
   @Override
-  public CcInfoApi getCcInfo() {
+  public CcInfoApi<FileApi> getCcInfo() {
     return null;
   }
 
   /** Fake implementation of {@link JavaCcLinkParamsProvider#Provider}. */
-  public static class Provider implements JavaCcLinkParamsProviderApi.Provider<CcInfoApi> {
+  public static class Provider
+      implements JavaCcLinkParamsProviderApi.Provider<FileApi, CcInfoApi<FileApi>> {
 
     @Override
-    public FakeJavaCcLinkParamsProvider createInfo(CcInfoApi ccInfoApi) throws EvalException {
+    public FakeJavaCcLinkParamsProvider createInfo(CcInfoApi<FileApi> ccInfoApi)
+        throws EvalException {
       return new FakeJavaCcLinkParamsProvider();
     }
 
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcCommonTest.java
index 1e8527f..004d998 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcCommonTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/SkylarkCcCommonTest.java
@@ -14,6 +14,7 @@
 package com.google.devtools.build.lib.rules.cpp;
 
 import static com.google.common.truth.Truth.assertThat;
+import static com.google.devtools.build.lib.actions.util.ActionsTestUtil.baseArtifactNames;
 import static com.google.devtools.build.lib.testutil.MoreAsserts.assertThrows;
 
 import com.google.common.base.Joiner;
@@ -88,13 +89,22 @@
     scratch.file("myinfo/BUILD");
   }
 
-  private StructImpl getMyInfoFromTarget(ConfiguredTarget configuredTarget) throws Exception {
+  private static StructImpl getMyInfoFromTarget(ConfiguredTarget configuredTarget)
+      throws Exception {
     Provider.Key key =
         new SkylarkProvider.SkylarkKey(
             Label.parseAbsolute("//myinfo:myinfo.bzl", ImmutableMap.of()), "MyInfo");
     return (StructImpl) configuredTarget.get(key);
   }
 
+  private static Iterable<Artifact> getArtifactsFromMyInfo(ConfiguredTarget target, String field)
+      throws Exception {
+    StructImpl myInfo = getMyInfoFromTarget(target);
+    @SuppressWarnings("unchecked")
+    Iterable<Artifact> artifacts = (Iterable<Artifact>) myInfo.getValue(field);
+    return artifacts;
+  }
+
   @Test
   public void testAllFiles() throws Exception {
     scratch.file(
@@ -6185,4 +6195,79 @@
         "    deps = [':dep1', ':dep2'],",
         ")");
   }
+
+  private static void setupDirectHeaderExtractionSupport(Scratch scratch) throws Exception {
+    scratch.file(
+        "direct/cc_info_extractor.bzl",
+        "load('//myinfo:myinfo.bzl', 'MyInfo')",
+        "def _cc_info_extractor_impl(ctx):",
+        "    compilation_context = ctx.attr.dep[CcInfo].compilation_context",
+        "    return [MyInfo(",
+        "        direct_headers = compilation_context.direct_headers,",
+        "        direct_textual_headers = compilation_context.direct_textual_headers,",
+        "    )]",
+        "cc_info_extractor = rule(",
+        "    _cc_info_extractor_impl,",
+        "    attrs = {",
+        "        'dep': attr.label(providers = [[CcInfo]]),",
+        "    }",
+        ")");
+    scratch.file(
+        "direct/BUILD",
+        "load('//direct:cc_info_extractor.bzl', 'cc_info_extractor')",
+        "cc_info_extractor(",
+        "    name = 'foo',",
+        "    dep = '//direct/libs:foo_lib',",
+        ")",
+        "cc_info_extractor(",
+        "    name = 'bar',",
+        "    dep = '//direct/libs:bar_lib',",
+        ")");
+  }
+
+  private static void setupCcLibraryDirectPropagationTestTargets(Scratch scratch) throws Exception {
+    scratch.file(
+        "direct/libs/BUILD",
+        "cc_library(",
+        "    name = 'foo_lib',",
+        "    hdrs = ['foo.h'],",
+        "    textual_hdrs = ['foo.def'],",
+        ")",
+        "cc_library(",
+        "    name = 'bar_lib',",
+        "    hdrs = ['bar.h'],",
+        "    textual_hdrs = ['bar.def'],",
+        "    deps = [':foo_lib'],",
+        ")");
+  }
+
+  @Test
+  public void testCcLibraryPropagatesCcInfoWithDirectHeaders() throws Exception {
+    setupDirectHeaderExtractionSupport(scratch);
+    setupCcLibraryDirectPropagationTestTargets(scratch);
+
+    ConfiguredTarget fooTarget = getConfiguredTarget("//direct:foo");
+    Iterable<Artifact> fooDirectHeaders = getArtifactsFromMyInfo(fooTarget, "direct_headers");
+    assertThat(baseArtifactNames(fooDirectHeaders)).containsExactly("foo.h");
+
+    ConfiguredTarget barTarget = getConfiguredTarget("//direct:bar");
+    Iterable<Artifact> barDirectHeaders = getArtifactsFromMyInfo(barTarget, "direct_headers");
+    assertThat(baseArtifactNames(barDirectHeaders)).containsExactly("bar.h");
+  }
+
+  @Test
+  public void testCcLibraryPropagatesCcInfoWithDirectTextualHeaders() throws Exception {
+    setupDirectHeaderExtractionSupport(scratch);
+    setupCcLibraryDirectPropagationTestTargets(scratch);
+
+    ConfiguredTarget fooTarget = getConfiguredTarget("//direct:foo");
+    Iterable<Artifact> fooDirectTextualHeaders =
+        getArtifactsFromMyInfo(fooTarget, "direct_textual_headers");
+    assertThat(baseArtifactNames(fooDirectTextualHeaders)).containsExactly("foo.def");
+
+    ConfiguredTarget barTarget = getConfiguredTarget("//direct:bar");
+    Iterable<Artifact> barDirectTextualHeaders =
+        getArtifactsFromMyInfo(barTarget, "direct_textual_headers");
+    assertThat(baseArtifactNames(barDirectTextualHeaders)).containsExactly("bar.def");
+  }
 }