Add `merge_without_outputs()` convenience method for java plugin infos

This is pure translation of the java implementation at `JavaPluginInfo.mergeWithoutJavaInputs`

PiperOrigin-RevId: 540378700
Change-Id: I6554bb26931a1a10c4ff357b2e03257084b3dda7
diff --git a/src/main/starlark/builtins_bzl/common/java/java_plugin_info.bzl b/src/main/starlark/builtins_bzl/common/java/java_plugin_info.bzl
index fb8678d..823e2c3 100644
--- a/src/main/starlark/builtins_bzl/common/java/java_plugin_info.bzl
+++ b/src/main/starlark/builtins_bzl/common/java/java_plugin_info.bzl
@@ -96,3 +96,39 @@
     },
     init = _javaplugininfo_init,
 )
+
+def merge_without_outputs(infos):
+    """ Merge plugin information from a list of JavaPluginInfo or JavaInfo
+
+    Args:
+        infos: ([JavaPluginInfo|JavaInfo]) list of providers to merge
+
+    Returns:
+        (JavaPluginInfo)
+    """
+    plugins = []
+    api_generating_plugins = []
+    for info in infos:
+        if _has_plugin_data(info.plugins):
+            plugins.append(info.plugins)
+        if _has_plugin_data(info.api_generating_plugins):
+            api_generating_plugins.append(info.api_generating_plugins)
+    return _new_javaplugininfo(
+        plugins = _merge_plugin_data(plugins),
+        api_generating_plugins = _merge_plugin_data(api_generating_plugins),
+        java_outputs = [],
+    )
+
+def _has_plugin_data(plugin_data):
+    return plugin_data and (
+        plugin_data.processor_classes or
+        plugin_data.processor_jars or
+        plugin_data.processor_data
+    )
+
+def _merge_plugin_data(datas):
+    return _JavaPluginDataInfo(
+        processor_classes = depset(transitive = [p.processor_classes for p in datas]),
+        processor_jars = depset(transitive = [p.processor_jars for p in datas]),
+        processor_data = depset(transitive = [p.processor_data for p in datas]),
+    )