Expose create_proto_info to builtins.

This is one of two things proto_library rule does (besides creating descriptor set).

It's possible to peel of some layers of create_proto_info to Starlark and this will be done later (now the focus is to get outer layer of proto_library to Starlark).

The last layer of create_proto_info is the creation of ProtoInfo provider, which is currently native. It's used a lot by native lang_proto_libraries, thus rewriting it completely to Starlark would create more problems than benefits at the moment.

The code can only be used from builtins. ProtoInfo provider needs a lot more thought and consideration, before being made public to Starlark.

PiperOrigin-RevId: 407286229
diff --git a/src/main/java/com/google/devtools/build/lib/rules/proto/BUILD b/src/main/java/com/google/devtools/build/lib/rules/proto/BUILD
index 1067e48..6c45232 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/proto/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/rules/proto/BUILD
@@ -51,6 +51,7 @@
         "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
         "//src/main/java/com/google/devtools/common/options",
+        "//src/main/java/net/starlark/java/annot",
         "//src/main/java/net/starlark/java/eval",
         "//third_party:auto_value",
         "//third_party:guava",
diff --git a/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoCommon.java b/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoCommon.java
index a7c865d..beac6d9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoCommon.java
@@ -14,11 +14,42 @@
 
 package com.google.devtools.build.lib.rules.proto;
 
+import com.google.devtools.build.lib.analysis.starlark.StarlarkRuleContext;
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.packages.BazelModuleContext;
 import com.google.devtools.build.lib.starlarkbuildapi.proto.ProtoCommonApi;
+import net.starlark.java.annot.Param;
+import net.starlark.java.annot.StarlarkMethod;
+import net.starlark.java.eval.EvalException;
+import net.starlark.java.eval.Module;
+import net.starlark.java.eval.Starlark;
+import net.starlark.java.eval.StarlarkThread;
 
 /** Protocol buffers support for Starlark. */
 public class BazelProtoCommon implements ProtoCommonApi {
   public static final BazelProtoCommon INSTANCE = new BazelProtoCommon();
 
-  private BazelProtoCommon() {}
+  protected BazelProtoCommon() {}
+
+  @StarlarkMethod(
+      name = "create_proto_info",
+      documented = false,
+      parameters = {@Param(name = "ctx", doc = "The rule context")},
+      useStarlarkThread = true)
+  public ProtoInfo createProtoInfo(StarlarkRuleContext ruleContext, StarlarkThread thread)
+      throws EvalException {
+    Label label =
+        ((BazelModuleContext) Module.ofInnermostEnclosingStarlarkFunction(thread).getClientData())
+            .label();
+    if (!label.getPackageIdentifier().getRepository().toString().equals("@_builtins")) {
+      throw Starlark.errorf("Rule in '%s' cannot use private API", label.getPackageName());
+    }
+
+    return ProtoCommon.createProtoInfo(
+        ruleContext.getRuleContext(),
+        ruleContext
+            .getRuleContext()
+            .getFragment(ProtoConfiguration.class)
+            .generatedProtosInVirtualImports());
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCommon.java b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCommon.java
index ced81605..8be9fe6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCommon.java
@@ -231,8 +231,7 @@
   private static Library createLibraryWithVirtualSourceRootMaybe(
       RuleContext ruleContext,
       ImmutableList<Artifact> protoSources,
-      boolean generatedProtosInVirtualImports)
-      throws InterruptedException {
+      boolean generatedProtosInVirtualImports) {
     PathFragment importPrefixAttribute = getPathFragmentAttribute(ruleContext, "import_prefix");
     PathFragment stripImportPrefixAttribute =
         getPathFragmentAttribute(ruleContext, "strip_import_prefix");
@@ -346,8 +345,7 @@
    * ruleContext}.
    */
   public static ProtoInfo createProtoInfo(
-      RuleContext ruleContext, boolean generatedProtosInVirtualImports)
-      throws InterruptedException {
+      RuleContext ruleContext, boolean generatedProtosInVirtualImports) {
     ImmutableList<Artifact> originalDirectProtoSources =
         ruleContext.getPrerequisiteArtifacts("srcs").list();
     ImmutableList<ProtoInfo> deps =