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 =