Provide java_common.compile interface for Java compilation of proto libraries

Remove `create_output_source_jar` parameter and infer its value. The value is `false` when precisely 1 source jar is on the input which is also the `output_source_jar`.

Introduce `include_compilation_info` parameter. It may be disabled only in builtins. When disabled the function drops `JavaCompilationInfo` and `JavaGenJarsProvider`.This corresponds to optimisations done natively.

Native Java proto compilation code provides `JavaRuleOutputJarsProvider`, truncated `JavaSourceJarsProvider`, `JavaCcInfoProvider`.

Benchmarks show that truncating `JavaSourceJarsProvider` is unnecessary.

PiperOrigin-RevId: 451967306
Change-Id: I033e690ffb1df36e00203f5447675861bfdfdb52
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java
index 9902560..3fd05c4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java
@@ -265,7 +265,7 @@
       Boolean enableAnnotationProcessing,
       Boolean enableCompileJarAction,
       boolean enableJSpecify,
-      boolean createOutputSourceJar,
+      boolean includeCompilationInfo,
       JavaSemantics javaSemantics,
       Object injectingRuleKind,
       List<String> addExports,
@@ -319,6 +319,10 @@
 
     JavaRuleOutputJarsProvider.Builder outputJarsBuilder = JavaRuleOutputJarsProvider.builder();
 
+    boolean createOutputSourceJar =
+        !(sourceJars.size() == 1
+            && sourceFiles.isEmpty()
+            && sourceJars.get(0).equals(outputSourceJar));
     if (outputSourceJar == null) {
       outputSourceJar = getDerivedSourceJar(starlarkRuleContext.getRuleContext(), outputJar);
     }
@@ -330,6 +334,7 @@
             toolchainProvider,
             outputJarsBuilder,
             createOutputSourceJar,
+            includeCompilationInfo,
             outputSourceJar,
             enableCompileJarAction,
             javaInfoBuilder,
@@ -358,15 +363,12 @@
                 streamProviders(deps, JavaCcInfoProvider.class),
                 Stream.of(new JavaCcInfoProvider(CcInfo.merge(nativeLibraries))))
             .collect(toImmutableList());
+
     return javaInfoBuilder
         .addProvider(JavaCompilationArgsProvider.class, javaCompilationArgsProvider)
         .addProvider(
             JavaSourceJarsProvider.class,
-            createOutputSourceJar
-                ? createJavaSourceJarsProvider(outputSourceJars, concat(runtimeDeps, exports, deps))
-                : JavaSourceJarsProvider.create(
-                    // TODO(b/207058960): Refactor. This is used for proto optimisation.
-                    NestedSetBuilder.wrap(Order.STABLE_ORDER, sourceJars), sourceJars))
+            createJavaSourceJarsProvider(outputSourceJars, concat(runtimeDeps, exports, deps)))
         .addProvider(JavaRuleOutputJarsProvider.class, outputJarsBuilder.build())
         .javaPluginInfo(mergeExportedJavaPluginInfo(exportedPlugins, exports))
         .addProvider(JavaCcInfoProvider.class, JavaCcInfoProvider.merge(transitiveNativeLibraries))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java
index 208e920..10f19e4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibraryHelper.java
@@ -213,6 +213,7 @@
         javaToolchainProvider,
         outputJarsBuilder,
         createOutputSourceJar,
+        true,
         outputSourceJar,
         true,
         /* javaInfoBuilder= */ null,
@@ -225,6 +226,7 @@
       JavaToolchainProvider javaToolchainProvider,
       JavaRuleOutputJarsProvider.Builder outputJarsBuilder,
       boolean createOutputSourceJar,
+      boolean includeCompilationInfo,
       @Nullable Artifact outputSourceJar,
       boolean enableCompileJarAction,
       @Nullable JavaInfo.Builder javaInfoBuilder,
@@ -291,13 +293,13 @@
     JavaCompilationArtifacts javaArtifacts = artifactsBuilder.build();
     outputJarsBuilder.addJavaOutput(
         JavaOutput.builder()
-            .fromJavaCompileOutputs(outputs)
+            .fromJavaCompileOutputs(outputs, includeCompilationInfo)
             .setCompileJar(iJar)
             .setCompileJdeps(javaArtifacts.getCompileTimeDependencyArtifact())
             .addSourceJar(outputSourceJar)
             .build());
 
-    if (javaInfoBuilder != null) {
+    if (javaInfoBuilder != null && includeCompilationInfo) {
       ClasspathConfiguredFragment classpathFragment =
           new ClasspathConfiguredFragment(
               javaArtifacts,
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java
index a5c5e6a..e152463 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuleOutputJarsProvider.java
@@ -166,8 +166,15 @@
 
       /** Populates the builder with outputs from {@link JavaCompileOutputs}. */
       public Builder fromJavaCompileOutputs(JavaCompileOutputs<Artifact> value) {
+        return fromJavaCompileOutputs(value, true);
+      }
+
+      public Builder fromJavaCompileOutputs(
+          JavaCompileOutputs<Artifact> value, boolean includeJdeps) {
         setClassJar(value.output());
-        setJdeps(value.depsProto());
+        if (includeJdeps) {
+          setJdeps(value.depsProto());
+        }
         setGeneratedClassJar(value.genClass());
         setGeneratedSourceJar(value.genSource());
         setNativeHeadersJar(value.nativeHeader());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaStarlarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaStarlarkCommon.java
index bea5f73..0ce348f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaStarlarkCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaStarlarkCommon.java
@@ -91,7 +91,7 @@
       Boolean enableAnnotationProcessing,
       Boolean enableCompileJarAction,
       Boolean enableJSpecify,
-      boolean createOutputSourceJar,
+      boolean includeCompilationInfo,
       Object injectingRuleKind,
       Sequence<?> addExports, // <String> expected
       Sequence<?> addOpens, // <String> expected
@@ -134,7 +134,7 @@
     // checks for private API access
     if (!enableCompileJarAction
         || !enableJSpecify
-        || !createOutputSourceJar
+        || !includeCompilationInfo
         || !classpathResources.isEmpty()
         || injectingRuleKind != Starlark.NONE) {
       checkPrivateAccess(thread);
@@ -170,7 +170,7 @@
             enableAnnotationProcessing,
             enableCompileJarAction,
             enableJSpecify,
-            createOutputSourceJar,
+            includeCompilationInfo,
             javaSemantics,
             injectingRuleKind,
             Sequence.cast(addExports, String.class, "add_exports"),
diff --git a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCommonApi.java b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCommonApi.java
index 839de51..b9c3631 100644
--- a/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/starlarkbuildapi/java/JavaCommonApi.java
@@ -236,7 +236,7 @@
             defaultValue = "True",
             documented = false),
         @Param(
-            name = "create_output_source_jar",
+            name = "include_compilation_info",
             positional = false,
             named = true,
             defaultValue = "True",
@@ -294,7 +294,7 @@
       Boolean enableAnnotationProcessing,
       Boolean enableCompileJarAction,
       Boolean enableJSpecify,
-      boolean createOutputSourceJar,
+      boolean includeCompilationInfo,
       Object injectingRuleKind,
       Sequence<?> addExports, // <String> expected.
       Sequence<?> addOpens, // <String> expected.
diff --git a/src/main/starlark/builtins_bzl/common/java/proto/java_proto_library.bzl b/src/main/starlark/builtins_bzl/common/java/proto/java_proto_library.bzl
index eb4deaf..0e4ed69 100644
--- a/src/main/starlark/builtins_bzl/common/java/proto/java_proto_library.bzl
+++ b/src/main/starlark/builtins_bzl/common/java/proto/java_proto_library.bzl
@@ -117,8 +117,8 @@
             injecting_rule_kind = injecting_rule_kind,
             javac_opts = java_toolchain.compatible_javacopts("proto"),
             enable_jspecify = False,
-            create_output_source_jar = False,
             java_toolchain = java_toolchain,
+            include_compilation_info = False,
         )
         jars = [source_jar, output_jar]
     else:
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/JavaStarlarkApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/JavaStarlarkApiTest.java
index c8c334e..7cb75be 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/java/JavaStarlarkApiTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaStarlarkApiTest.java
@@ -3207,7 +3207,7 @@
   }
 
   @Test
-  public void testCreateOutputSourceJarIsPrivateApi() throws Exception {
+  public void testCompileIncludeCompilationInfoIsPrivateApi() throws Exception {
     JavaToolchainTestUtil.writeBuildFileForJavaToolchain(scratch);
     scratch.file(
         "foo/custom_rule.bzl",
@@ -3216,7 +3216,7 @@
         "    ctx,",
         "    output = ctx.actions.declare_file('output.jar'),",
         "    java_toolchain = ctx.attr._java_toolchain[java_common.JavaToolchainInfo],",
-        "    create_output_source_jar = False,",
+        "    include_compilation_info = False,",
         "  )",
         "  return []",
         "java_custom_library = rule(",