Introduce proto-related Google-only interface methods to the Starlark build API

The new interface methods have no Bazel implementation, and are completely unrecognized when --experimental_google_legacy_api is false (the current default). They are introduced as stub methods in Bazel to make different build-API-aware binaries interface-consistent.

RELNOTES: None.
PiperOrigin-RevId: 256378114
diff --git a/src/main/java/com/google/devtools/build/docgen/BUILD b/src/main/java/com/google/devtools/build/docgen/BUILD
index 7606312..e7641ed 100644
--- a/src/main/java/com/google/devtools/build/docgen/BUILD
+++ b/src/main/java/com/google/devtools/build/docgen/BUILD
@@ -23,8 +23,10 @@
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/cpp",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/python",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/stubs",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/test",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi/android",
@@ -33,6 +35,7 @@
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi/cpp",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi/platform",
+        "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi/proto",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi/python",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi/test",
diff --git a/src/main/java/com/google/devtools/build/docgen/SymbolFamilies.java b/src/main/java/com/google/devtools/build/docgen/SymbolFamilies.java
index f40b276..0c68293 100644
--- a/src/main/java/com/google/devtools/build/docgen/SymbolFamilies.java
+++ b/src/main/java/com/google/devtools/build/docgen/SymbolFamilies.java
@@ -25,8 +25,11 @@
 import com.google.devtools.build.lib.skylarkbuildapi.cpp.CcBootstrap;
 import com.google.devtools.build.lib.skylarkbuildapi.java.JavaBootstrap;
 import com.google.devtools.build.lib.skylarkbuildapi.platform.PlatformBootstrap;
+import com.google.devtools.build.lib.skylarkbuildapi.proto.ProtoBootstrap;
 import com.google.devtools.build.lib.skylarkbuildapi.python.PyBootstrap;
 import com.google.devtools.build.lib.skylarkbuildapi.repository.RepositoryBootstrap;
+import com.google.devtools.build.lib.skylarkbuildapi.stubs.ProviderStub;
+import com.google.devtools.build.lib.skylarkbuildapi.stubs.SkylarkAspectStub;
 import com.google.devtools.build.lib.skylarkbuildapi.test.TestingBootstrap;
 import com.google.devtools.build.lib.syntax.MethodLibrary;
 import com.google.devtools.build.lib.syntax.Runtime;
@@ -63,6 +66,8 @@
 import com.google.devtools.build.skydoc.fakebuildapi.java.FakeJavaInfo.FakeJavaInfoProvider;
 import com.google.devtools.build.skydoc.fakebuildapi.java.FakeJavaProtoCommon;
 import com.google.devtools.build.skydoc.fakebuildapi.platform.FakePlatformCommon;
+import com.google.devtools.build.skydoc.fakebuildapi.proto.FakeProtoInfoApiProvider;
+import com.google.devtools.build.skydoc.fakebuildapi.proto.FakeProtoModule;
 import com.google.devtools.build.skydoc.fakebuildapi.python.FakePyInfo.FakePyInfoProvider;
 import com.google.devtools.build.skydoc.fakebuildapi.python.FakePyRuntimeInfo.FakePyRuntimeInfoProvider;
 import com.google.devtools.build.skydoc.fakebuildapi.repository.FakeRepositoryModule;
@@ -209,6 +214,12 @@
             new FakeJavaProtoCommon(),
             new FakeJavaCcLinkParamsProvider.Provider());
     PlatformBootstrap platformBootstrap = new PlatformBootstrap(new FakePlatformCommon());
+    ProtoBootstrap protoBootstrap =
+        new ProtoBootstrap(
+            new FakeProtoInfoApiProvider(),
+            new FakeProtoModule(),
+            new SkylarkAspectStub(),
+            new ProviderStub());
     PyBootstrap pyBootstrap =
         new PyBootstrap(new FakePyInfoProvider(), new FakePyRuntimeInfoProvider());
     RepositoryBootstrap repositoryBootstrap =
@@ -227,6 +238,7 @@
     configBootstrap.addBindingsToBuilder(envBuilder);
     javaBootstrap.addBindingsToBuilder(envBuilder);
     platformBootstrap.addBindingsToBuilder(envBuilder);
+    protoBootstrap.addBindingsToBuilder(envBuilder);
     pyBootstrap.addBindingsToBuilder(envBuilder);
     repositoryBootstrap.addBindingsToBuilder(envBuilder);
     testingBootstrap.addBindingsToBuilder(envBuilder);
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD
index 0e53bf6..777dfc7 100644
--- a/src/main/java/com/google/devtools/build/lib/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/BUILD
@@ -788,6 +788,7 @@
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/python",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/stubs",
         "//src/main/java/com/google/devtools/build/lib/vfs",
         "//src/main/java/com/google/devtools/build/skyframe",
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
index 1d5a322..46cb700 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java
@@ -100,6 +100,8 @@
 import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidBootstrap;
 import com.google.devtools.build.lib.skylarkbuildapi.proto.ProtoBootstrap;
 import com.google.devtools.build.lib.skylarkbuildapi.python.PyBootstrap;
+import com.google.devtools.build.lib.skylarkbuildapi.stubs.ProviderStub;
+import com.google.devtools.build.lib.skylarkbuildapi.stubs.SkylarkAspectStub;
 import com.google.devtools.build.lib.util.OS;
 import com.google.devtools.build.lib.util.ResourceFileLoader;
 import com.google.devtools.build.lib.vfs.PathFragment;
@@ -253,7 +255,11 @@
           builder.addRuleDefinition(new ProtoLangToolchainRule());
 
           ProtoBootstrap bootstrap =
-              new ProtoBootstrap(ProtoInfo.PROVIDER, BazelProtoModule.INSTANCE);
+              new ProtoBootstrap(
+                  ProtoInfo.PROVIDER,
+                  BazelProtoModule.INSTANCE,
+                  new SkylarkAspectStub(),
+                  new ProviderStub());
           builder.addSkylarkBootstrap(bootstrap);
         }
 
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/BUILD b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/BUILD
index 982ca13..e08aab5 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/BUILD
@@ -22,6 +22,7 @@
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/platform:srcs",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/python:srcs",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository:srcs",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/stubs:srcs",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/test:srcs",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto:srcs",
     ],
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto/BUILD b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto/BUILD
index d379c34..3dd12eb 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto/BUILD
@@ -19,7 +19,10 @@
     name = "proto",
     srcs = glob(["*.java"]),
     deps = [
+        "//src/main/java/com/google/devtools/build/lib:skylark_semantics",
         "//src/main/java/com/google/devtools/build/lib:skylarkinterface",
+        "//src/main/java/com/google/devtools/build/lib:syntax",
+        "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi",
         "//third_party:guava",
         "//third_party:jsr305",
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto/ProtoBootstrap.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto/ProtoBootstrap.java
index 7a0d150..40e06b4 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto/ProtoBootstrap.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto/ProtoBootstrap.java
@@ -17,6 +17,10 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.devtools.build.lib.skylarkbuildapi.Bootstrap;
 import com.google.devtools.build.lib.skylarkbuildapi.ProtoInfoApi;
+import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi;
+import com.google.devtools.build.lib.skylarkbuildapi.SkylarkAspectApi;
+import com.google.devtools.build.lib.syntax.FlagGuardedValue;
+import com.google.devtools.build.lib.syntax.StarlarkSemantics.FlagIdentifier;
 
 /** A {@link Bootstrap} for Starlark objects related to protocol buffers. */
 public class ProtoBootstrap implements Bootstrap {
@@ -29,15 +33,31 @@
 
   private final ProtoInfoApi.Provider protoInfoApiProvider;
   private final Object protoModule;
+  private final SkylarkAspectApi protoRegistryAspect;
+  private final ProviderApi protoRegistryProvider;
 
-  public ProtoBootstrap(ProtoInfoApi.Provider protoInfoApiProvider, Object protoModule) {
+  public ProtoBootstrap(
+      ProtoInfoApi.Provider protoInfoApiProvider,
+      Object protoModule,
+      SkylarkAspectApi protoRegistryAspect,
+      ProviderApi protoRegistryProvider) {
     this.protoInfoApiProvider = protoInfoApiProvider;
     this.protoModule = protoModule;
+    this.protoRegistryAspect = protoRegistryAspect;
+    this.protoRegistryProvider = protoRegistryProvider;
   }
 
   @Override
   public void addBindingsToBuilder(ImmutableMap.Builder<String, Object> builder) {
     builder.put(PROTO_INFO_STARLARK_NAME, protoInfoApiProvider);
     builder.put(PROTO_MODULE_NAME, protoModule);
+    builder.put(
+        "ProtoRegistryAspect",
+        FlagGuardedValue.onlyWhenExperimentalFlagIsTrue(
+            FlagIdentifier.EXPERIMENTAL_GOOGLE_LEGACY_API, protoRegistryAspect));
+    builder.put(
+        "ProtoRegistryProvider",
+        FlagGuardedValue.onlyWhenExperimentalFlagIsTrue(
+            FlagIdentifier.EXPERIMENTAL_GOOGLE_LEGACY_API, protoRegistryProvider));
   }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto/ProtoRegistryProviderApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto/ProtoRegistryProviderApi.java
new file mode 100644
index 0000000..24b0533
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto/ProtoRegistryProviderApi.java
@@ -0,0 +1,45 @@
+// Copyright 2019 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.skylarkbuildapi.proto;
+
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
+import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
+import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
+import com.google.devtools.build.lib.syntax.SkylarkList;
+
+/** Provides information about flavors for all built protos. */
+@SkylarkModule(
+    name = "ProtoRegistryProvider",
+    doc = "Information about flavors for all built protos.",
+    category = SkylarkModuleCategory.PROVIDER)
+public interface ProtoRegistryProviderApi<FileT extends FileApi> extends StructApi {
+
+  @SkylarkCallable(name = "jars", documented = false, doc = "", structField = true)
+  NestedSet<FileT> getJars();
+
+  @SkylarkCallable(name = "flavors", documented = false, doc = "", structField = true)
+  SkylarkList<String> getFlavors();
+
+  @SkylarkCallable(
+      name = "errorMessage",
+      documented = false,
+      doc = "",
+      structField = true,
+      allowReturnNones = true)
+  String getError();
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/stubs/BUILD b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/stubs/BUILD
new file mode 100644
index 0000000..e34cb33
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/stubs/BUILD
@@ -0,0 +1,24 @@
+# Description:
+#   This package contains stubs for the starlark "build API".
+#   Ultimately, this package may be broken out of the Bazel package hierarchy to be standalone.
+#   Thus, this package should not depend on Bazel-specific packages (only
+#   those which contain pure-Skylark concepts, such as the interpreter or
+#   annotation interfaces).
+
+package(default_visibility = ["//src:__subpackages__"])
+
+licenses(["notice"])  # Apache 2.0
+
+filegroup(
+    name = "srcs",
+    srcs = glob(["**"]),
+)
+
+java_library(
+    name = "stubs",
+    srcs = glob(["*.java"]),
+    deps = [
+        "//src/main/java/com/google/devtools/build/lib:skylarkinterface",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi",
+    ],
+)
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/stubs/ProviderStub.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/stubs/ProviderStub.java
new file mode 100644
index 0000000..356ceac
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/stubs/ProviderStub.java
@@ -0,0 +1,30 @@
+// Copyright 2019 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.skylarkbuildapi.stubs;
+
+import com.google.devtools.build.lib.skylarkbuildapi.ProviderApi;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
+
+/**
+ * Stub implementation of {@link ProviderApi}. Should only be used for experimental, unimplemented
+ * code paths.
+ */
+public final class ProviderStub implements ProviderApi {
+
+  @Override
+  public void repr(SkylarkPrinter printer) {
+    printer.append("<unimplemented provider>");
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/stubs/SkylarkAspectStub.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/stubs/SkylarkAspectStub.java
new file mode 100644
index 0000000..7a7ec26
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/stubs/SkylarkAspectStub.java
@@ -0,0 +1,29 @@
+// Copyright 2019 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package com.google.devtools.build.lib.skylarkbuildapi.stubs;
+
+import com.google.devtools.build.lib.skylarkbuildapi.SkylarkAspectApi;
+import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
+
+/**
+ * Stub implementation of {@link SkylarkAspectApi}. Should only be used for experimental,
+ * unimplemented code paths.
+ */
+public final class SkylarkAspectStub implements SkylarkAspectApi {
+  @Override
+  public void repr(SkylarkPrinter printer) {
+    printer.append("<unimplemented aspect>");
+  }
+}
diff --git a/src/main/java/com/google/devtools/build/skydoc/BUILD b/src/main/java/com/google/devtools/build/skydoc/BUILD
index 541a111..d749634 100644
--- a/src/main/java/com/google/devtools/build/skydoc/BUILD
+++ b/src/main/java/com/google/devtools/build/skydoc/BUILD
@@ -71,6 +71,7 @@
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/proto",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/python",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository",
+        "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/stubs",
         "//src/main/java/com/google/devtools/build/lib/skylarkbuildapi/test",
         "//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",
         "//src/main/java/com/google/devtools/build/skydoc/fakebuildapi",
diff --git a/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java b/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java
index ea8f47b..b1ac195 100644
--- a/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java
+++ b/src/main/java/com/google/devtools/build/skydoc/SkydocMain.java
@@ -52,6 +52,8 @@
 import com.google.devtools.build.lib.skylarkbuildapi.proto.ProtoBootstrap;
 import com.google.devtools.build.lib.skylarkbuildapi.python.PyBootstrap;
 import com.google.devtools.build.lib.skylarkbuildapi.repository.RepositoryBootstrap;
+import com.google.devtools.build.lib.skylarkbuildapi.stubs.ProviderStub;
+import com.google.devtools.build.lib.skylarkbuildapi.stubs.SkylarkAspectStub;
 import com.google.devtools.build.lib.skylarkbuildapi.test.TestingBootstrap;
 import com.google.devtools.build.lib.syntax.BaseFunction;
 import com.google.devtools.build.lib.syntax.BuildFileAST;
@@ -548,7 +550,11 @@
             new FakeJavaCcLinkParamsProvider.Provider());
     PlatformBootstrap platformBootstrap = new PlatformBootstrap(new FakePlatformCommon());
     ProtoBootstrap protoBootstrap =
-        new ProtoBootstrap(new FakeProtoInfoApiProvider(), new FakeProtoModule());
+        new ProtoBootstrap(
+            new FakeProtoInfoApiProvider(),
+            new FakeProtoModule(),
+            new SkylarkAspectStub(),
+            new ProviderStub());
     PyBootstrap pyBootstrap =
         new PyBootstrap(new FakePyInfoProvider(), new FakePyRuntimeInfoProvider());
     RepositoryBootstrap repositoryBootstrap =
@@ -599,7 +605,6 @@
     ProguardMappingProviderApi.NAME,
     GeneratedExtensionRegistryProviderApi.NAME,
     AndroidBinaryDataInfoApi.NAME,
-    "ProtoRegistryAspect",
     "JspbInfo",
   };