Add new builtin API to cc compilation.

PiperOrigin-RevId: 452753853
Change-Id: If04119ae55f6b5108b30fa0cd600a16800f21423
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java
index ccf424a..74c69ea 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/cpp/BazelCcModule.java
@@ -116,6 +116,7 @@
       Object purpose,
       Object grepIncludes,
       Object coptsFilter,
+      Object separateModuleHeaders,
       StarlarkThread thread)
       throws EvalException, InterruptedException {
     return compile(
@@ -156,6 +157,7 @@
         language,
         purpose,
         coptsFilter,
+        separateModuleHeaders,
         thread);
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
index 3a97e6c..cc694d5 100755
--- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcModule.java
@@ -2021,6 +2021,7 @@
       Object languageObject,
       Object purposeObject,
       Object coptsFilterObject,
+      Object separateModuleHeadersObject,
       StarlarkThread thread)
       throws EvalException, InterruptedException {
     if (checkObjectsBound(
@@ -2034,7 +2035,8 @@
         hdrsCheckingModeObject,
         implementationCcCompilationContextsObject,
         coptsFilterObject,
-        starlarkLooseIncludes)) {
+        starlarkLooseIncludes,
+        separateModuleHeadersObject)) {
       CcModule.checkPrivateStarlarkificationAllowlist(thread);
     }
 
@@ -2216,6 +2218,10 @@
     if (purpose != null) {
       helper.setPurpose(purpose);
     }
+    ImmutableList<Artifact> separateModuleHeaders =
+        asClassImmutableList(separateModuleHeadersObject);
+    helper.addSeparateModuleHeaders(separateModuleHeaders);
+
     try {
       RuleContext ruleContext = actions.getRuleContext();
       CompilationInfo compilationInfo = helper.compile(ruleContext);
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BazelCcModuleApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BazelCcModuleApi.java
index 661f311..181fe1d 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BazelCcModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/cpp/BazelCcModuleApi.java
@@ -344,6 +344,13 @@
             positional = false,
             named = true,
             defaultValue = "unbound"),
+        @Param(
+            name = "separate_module_headers",
+            documented = false,
+            positional = false,
+            named = true,
+            allowedTypes = {@ParamType(type = Sequence.class)},
+            defaultValue = "unbound"),
       })
   Tuple compile(
       StarlarkActionFactoryT starlarkActionFactoryApi,
@@ -381,6 +388,7 @@
       Object purpose,
       Object grepIncludes,
       Object coptsFilter,
+      Object separateModuleHeaders,
       StarlarkThread thread)
       throws EvalException, InterruptedException;
 
diff --git a/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java b/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java
index fea4a94..130edb8 100755
--- a/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/cpp/StarlarkCcCommonTest.java
@@ -7040,6 +7040,7 @@
             compileCall + "propagate_module_map_to_compile_action = True)",
             compileCall + "do_not_generate_module_map = True)",
             compileCall + "code_coverage_enabled = True)",
+            compileCall + "separate_module_headers = [])",
             compileCall + "hdrs_checking_mode = 'strict')");
     scratch.overwriteFile(
         "a/BUILD",