Use proto compiler from proto_toolchain rule

Issue: https://github.com/bazelbuild/rules_proto/issues/179
PiperOrigin-RevId: 567570286
Change-Id: Ia7e1ff08a0123a325f1df00f56b81212c01e2588
diff --git a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoConstants.java b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoConstants.java
index 2028d43..089c9fe 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoConstants.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoConstants.java
@@ -17,7 +17,7 @@
 /** Constants used in Proto rules. */
 public final class ProtoConstants {
   /** Default label for proto compiler. */
-  static final String DEFAULT_PROTOC_LABEL =  "@bazel_tools//tools/proto:protoc";
+  public static final String DEFAULT_PROTOC_LABEL =  "@bazel_tools//tools/proto:protoc";
 
   /** Default label for java proto toolchains. */
   static final String DEFAULT_JAVA_PROTO_LABEL = "@bazel_tools//tools/proto:java_toolchain";
diff --git a/src/main/starlark/builtins_bzl/common/proto/proto_lang_toolchain.bzl b/src/main/starlark/builtins_bzl/common/proto/proto_lang_toolchain.bzl
index 872e7af..72eaafd 100644
--- a/src/main/starlark/builtins_bzl/common/proto/proto_lang_toolchain.bzl
+++ b/src/main/starlark/builtins_bzl/common/proto/proto_lang_toolchain.bzl
@@ -32,6 +32,13 @@
     if ctx.attr.plugin != None:
         plugin = ctx.attr.plugin[DefaultInfo].files_to_run
 
+    if semantics.INCOMPATIBLE_ENABLE_PROTO_TOOLCHAIN_RESOLUTION:
+        proto_compiler = ctx.toolchains[semantics.PROTO_TOOLCHAIN_TYPE].proto.proto_compiler
+        protoc_opts = ctx.toolchains[semantics.PROTO_TOOLCHAIN_TYPE].proto.protoc_opts
+    else:
+        proto_compiler = ctx.attr._proto_compiler.files_to_run
+        protoc_opts = ctx.fragments.proto.experimental_protoc_opts
+
     return [
         DefaultInfo(
             files = depset(),
@@ -44,8 +51,8 @@
             plugin = plugin,
             runtime = ctx.attr.runtime,
             provided_proto_sources = provided_proto_sources,
-            proto_compiler = ctx.attr._proto_compiler.files_to_run,
-            protoc_opts = ctx.fragments.proto.experimental_protoc_opts,
+            proto_compiler = proto_compiler,
+            protoc_opts = protoc_opts,
             progress_message = ctx.attr.progress_message,
             mnemonic = ctx.attr.mnemonic,
             allowlist_different_package = ctx.attr.allowlist_different_package,
@@ -74,13 +81,15 @@
                 cfg = "exec",
                 providers = [PackageSpecificationInfo],
             ),
+        } | ({} if semantics.INCOMPATIBLE_ENABLE_PROTO_TOOLCHAIN_RESOLUTION else {
             "_proto_compiler": attr.label(
                 cfg = "exec",
                 executable = True,
                 allow_files = True,
                 default = configuration_field("proto", "proto_compiler"),
             ),
-        },
+        }),
     provides = [ProtoLangToolchainInfo],
     fragments = ["proto"],
+    toolchains = semantics.PROTO_TOOLCHAIN,  # Used to obtain protoc
 )
diff --git a/src/test/java/com/google/devtools/build/lib/packages/BUILD b/src/test/java/com/google/devtools/build/lib/packages/BUILD
index b265ae2..6b4a1fe 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/packages/BUILD
@@ -163,6 +163,7 @@
         "//src/main/java/com/google/devtools/build/lib/pkgcache",
         "//src/main/java/com/google/devtools/build/lib/rules:repository/repository_function",
         "//src/main/java/com/google/devtools/build/lib/rules/cpp",
+        "//src/main/java/com/google/devtools/build/lib/rules/proto",
         "//src/main/java/com/google/devtools/build/lib/rules/python",
         "//src/main/java/com/google/devtools/build/lib/skyframe:precomputed_value",
         "//src/main/java/com/google/devtools/build/lib/skyframe:skyframe_cluster",
diff --git a/src/test/java/com/google/devtools/build/lib/packages/util/MockProtoSupport.java b/src/test/java/com/google/devtools/build/lib/packages/util/MockProtoSupport.java
index bd3d56d..71344ac 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/util/MockProtoSupport.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/util/MockProtoSupport.java
@@ -14,6 +14,7 @@
 
 package com.google.devtools.build.lib.packages.util;
 
+import com.google.devtools.build.lib.rules.proto.ProtoConstants;
 import com.google.devtools.build.lib.testutil.TestConstants;
 import java.io.IOException;
 
@@ -43,7 +44,9 @@
         "tools/proto/toolchains/BUILD",
         TestConstants.LOAD_PROTO_TOOLCHAIN,
         "proto_toolchain(name = 'protoc_sources',"
-            + "proto_compiler = '//net/proto2/compiler/public:protocol_compiler')");
+            + "proto_compiler = '"
+            + ProtoConstants.DEFAULT_PROTOC_LABEL
+            + "')");
   }
 
   /** Create a dummy "net/proto2 compiler and proto APIs for all languages and versions. */
diff --git a/src/test/java/com/google/devtools/build/lib/rules/proto/ProtoLangToolchainTest.java b/src/test/java/com/google/devtools/build/lib/rules/proto/ProtoLangToolchainTest.java
index 6536328..3d7b862 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/proto/ProtoLangToolchainTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/proto/ProtoLangToolchainTest.java
@@ -100,6 +100,39 @@
   }
 
   @Test
+  public void protoToolchainResolution_enabled() throws Exception {
+    setBuildLanguageOptions("--incompatible_enable_proto_toolchain_resolution");
+    scratch.file(
+        "third_party/x/BUILD",
+        "licenses(['unencumbered'])",
+        "cc_binary(name = 'plugin', srcs = ['plugin.cc'])",
+        "cc_library(name = 'runtime', srcs = ['runtime.cc'])",
+        "filegroup(name = 'descriptors', srcs = ['metadata.proto', 'descriptor.proto'])",
+        "filegroup(name = 'any', srcs = ['any.proto'])",
+        "proto_library(name = 'denied', srcs = [':descriptors', ':any'])");
+    scratch.file(
+        "foo/BUILD",
+        TestConstants.LOAD_PROTO_LANG_TOOLCHAIN,
+        "licenses(['unencumbered'])",
+        "proto_lang_toolchain(",
+        "    name = 'toolchain',",
+        "    command_line = 'cmd-line:$(OUT)',",
+        "    plugin_format_flag = '--plugin=%s',",
+        "    plugin = '//third_party/x:plugin',",
+        "    runtime = '//third_party/x:runtime',",
+        "    progress_message = 'Progress Message %{label}',",
+        "    mnemonic = 'MyMnemonic',",
+        ")");
+
+    update(ImmutableList.of("//foo:toolchain"), false, 1, true, new EventBus());
+    ProtoLangToolchainProvider toolchain =
+        ProtoLangToolchainProvider.get(getConfiguredTarget("//foo:toolchain"));
+
+    validateProtoLangToolchain(toolchain);
+    validateProtoCompiler(toolchain, ProtoConstants.DEFAULT_PROTOC_LABEL);
+  }
+
+  @Test
   public void protoToolchainBlacklistProtoLibraries() throws Exception {
     scratch.file(
         "third_party/x/BUILD",