Use proto_lang_toolchain in java_lite_proto_library.

--
MOS_MIGRATED_REVID=138005602
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BazelJavaLiteProtoLibraryRule.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BazelJavaLiteProtoLibraryRule.java
index ed33564..739de4b 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BazelJavaLiteProtoLibraryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/java/proto/BazelJavaLiteProtoLibraryRule.java
@@ -18,20 +18,22 @@
 import static com.google.devtools.build.lib.packages.Attribute.attr;
 import static com.google.devtools.build.lib.packages.BuildType.LABEL;
 import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST;
-import static com.google.devtools.build.lib.rules.java.proto.JavaLiteProtoAspect.LITE_PROTO_RUNTIME_ATTR;
-import static com.google.devtools.build.lib.rules.java.proto.JavaLiteProtoAspect.LITE_PROTO_RUNTIME_LABEL;
+import static com.google.devtools.build.lib.rules.java.proto.JavaLiteProtoAspect.PROTO_TOOLCHAIN_ATTR;
+import static com.google.devtools.build.lib.rules.java.proto.JavaLiteProtoAspect.PROTO_TOOLCHAIN_LABEL;
 import static com.google.devtools.build.lib.syntax.Type.BOOLEAN;
 
 import com.google.common.base.Function;
+import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.analysis.BaseRuleClasses;
 import com.google.devtools.build.lib.analysis.RuleDefinition;
 import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
-import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
 import com.google.devtools.build.lib.packages.AspectParameters;
 import com.google.devtools.build.lib.packages.Rule;
 import com.google.devtools.build.lib.packages.RuleClass;
 import com.google.devtools.build.lib.rules.java.JavaConfiguration;
 import com.google.devtools.build.lib.rules.java.proto.JavaLiteProtoLibrary;
+import com.google.devtools.build.lib.rules.proto.ProtoLangToolchainProvider;
 import javax.annotation.Nullable;
 
 /** Declaration of the {@code java_lite_proto_library} rule. */
@@ -75,9 +77,11 @@
         <!-- #END_BLAZE_RULE.ATTRIBUTE --> */
         .add(attr("strict_deps", BOOLEAN).value(true))
         .add(
-            attr(LITE_PROTO_RUNTIME_ATTR, LABEL)
-                .legacyAllowAnyFileType()
-                .value(Label.parseAbsoluteUnchecked(LITE_PROTO_RUNTIME_LABEL)))
+            attr(PROTO_TOOLCHAIN_ATTR, LABEL)
+                .mandatoryNativeProviders(
+                    ImmutableList.<Class<? extends TransitiveInfoProvider>>of(
+                        ProtoLangToolchainProvider.class))
+                .value(PROTO_TOOLCHAIN_LABEL))
         .build();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
index 9d65dec..d3bc185 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoAspect.java
@@ -25,14 +25,14 @@
 import static com.google.devtools.build.lib.rules.java.proto.JavaProtoLibraryTransitiveFilesToBuildProvider.GET_JARS;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 import com.google.devtools.build.lib.actions.Artifact;
 import com.google.devtools.build.lib.analysis.ConfiguredAspect;
 import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory;
 import com.google.devtools.build.lib.analysis.ConfiguredTarget;
-import com.google.devtools.build.lib.analysis.FilesToRunProvider;
-import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
 import com.google.devtools.build.lib.analysis.RuleContext;
+import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
 import com.google.devtools.build.lib.analysis.TransitiveInfoProviderMap;
 import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
@@ -56,6 +56,7 @@
 import com.google.devtools.build.lib.rules.java.JavaToolchainProvider;
 import com.google.devtools.build.lib.rules.proto.ProtoCompileActionBuilder;
 import com.google.devtools.build.lib.rules.proto.ProtoConfiguration;
+import com.google.devtools.build.lib.rules.proto.ProtoLangToolchainProvider;
 import com.google.devtools.build.lib.rules.proto.ProtoSourcesProvider;
 import com.google.devtools.build.lib.rules.proto.ProtoSupportDataProvider;
 import com.google.devtools.build.lib.rules.proto.SupportData;
@@ -64,23 +65,16 @@
 /** An Aspect which JavaLiteProtoLibrary injects to build Java Lite protos. */
 public class JavaLiteProtoAspect extends NativeAspectClass implements ConfiguredAspectFactory {
 
-  public static final String LITE_PROTO_RUNTIME_ATTR = "$aspect_java_lib";
-  public static final String LITE_PROTO_RUNTIME_LABEL = "//external:protobuf/javalite_runtime";
+  public static final String PROTO_TOOLCHAIN_ATTR = ":aspect_proto_toolchain_for_javalite";
 
-  private static final Attribute.LateBoundLabel<BuildConfiguration> JAVA_LITE_PLUGIN =
-      new Attribute.LateBoundLabel<BuildConfiguration>((Label) null, ProtoConfiguration.class) {
+  public static final Attribute.LateBoundLabel<BuildConfiguration> PROTO_TOOLCHAIN_LABEL =
+      new Attribute.LateBoundLabel<BuildConfiguration>(
+          "//tools/proto/toolchains:javalite", ProtoConfiguration.class) {
         @Override
         public Label resolve(Rule rule, AttributeMap attributes, BuildConfiguration configuration) {
-          return configuration.getFragment(ProtoConfiguration.class).protoCompilerJavaLitePlugin();
-        }
-
-        @Override
-        public boolean useHostConfiguration() {
-          return true;
+          return configuration.getFragment(ProtoConfiguration.class).protoToolchainForJavaLite();
         }
       };
-  private static final String PROTO_COMPILER_JAVA_LITE_PLUGIN_ATTR =
-      ":proto_compiler_java_lite_plugin";
 
   private final JavaSemantics javaSemantics;
 
@@ -115,19 +109,16 @@
             .requiresConfigurationFragments(JavaConfiguration.class, ProtoConfiguration.class)
             .requireProvider(ProtoSourcesProvider.class)
             .add(
-                attr(LITE_PROTO_RUNTIME_ATTR, LABEL)
-                    .legacyAllowAnyFileType()
-                    .value(parseAbsoluteUnchecked(LITE_PROTO_RUNTIME_LABEL)))
+                attr(PROTO_TOOLCHAIN_ATTR, LABEL)
+                    .mandatoryNativeProviders(
+                        ImmutableList.<Class<? extends TransitiveInfoProvider>>of(
+                            ProtoLangToolchainProvider.class))
+                    .value(PROTO_TOOLCHAIN_LABEL))
             .add(attr(":host_jdk", LABEL).cfg(HOST).value(JavaSemantics.HOST_JDK))
             .add(
                 attr(":java_toolchain", LABEL)
                     .allowedRuleClasses("java_toolchain")
-                    .value(JavaSemantics.JAVA_TOOLCHAIN))
-            .add(
-                attr(PROTO_COMPILER_JAVA_LITE_PLUGIN_ATTR, LABEL)
-                    .cfg(HOST)
-                    .exec()
-                    .value(JAVA_LITE_PLUGIN));
+                    .value(JavaSemantics.JAVA_TOOLCHAIN));
 
     Attribute.Builder<Label> jacocoAttr = attr("$jacoco_instrumentation", LABEL).cfg(HOST);
 
@@ -207,24 +198,16 @@
     }
 
     private void createProtoCompileAction(Artifact sourceJar) {
-      ProtoCompileActionBuilder actionBuilder =
-          new ProtoCompileActionBuilder(
-                  ruleContext, supportData, "Java", "java", ImmutableList.of(sourceJar))
-              .allowServices(true)
-              .setLangParameter(
-                  String.format(
-                      ruleContext
-                          .getFragment(ProtoConfiguration.class, HOST)
-                          .protoCompilerJavaLiteFlags(),
-                      sourceJar.getExecPathString()));
-
-      FilesToRunProvider plugin =
-          ruleContext.getExecutablePrerequisite(PROTO_COMPILER_JAVA_LITE_PLUGIN_ATTR, Mode.HOST);
-      if (plugin != null) {
-        actionBuilder.setAdditionalTools(ImmutableList.of(plugin));
-      }
-
-      ruleContext.registerAction(actionBuilder.build());
+      ProtoCompileActionBuilder.registerActions(
+          ruleContext,
+          ImmutableMap.of(
+              "javalite",
+              new ProtoCompileActionBuilder.ToolchainInvocation(
+                  getProtoToolchainProvider(), sourceJar.getExecPathString())),
+          supportData,
+          ImmutableList.of(sourceJar),
+          "JavaLite",
+          true /* allowServices */);
     }
 
     private JavaCompilationArgsProvider createJavaCompileAction(
@@ -235,15 +218,21 @@
               .addSourceJars(sourceJar)
               .setJavacOpts(getAndroidCompatibleJavacOpts());
       helper.addDep(dependencyCompilationArgs);
-      helper
-          .addDep(
-              ruleContext.getPrerequisite(
-                  LITE_PROTO_RUNTIME_ATTR, Mode.TARGET, JavaCompilationArgsProvider.class))
-          .setCompilationStrictDepsMode(StrictDepsMode.OFF);
+      TransitiveInfoCollection runtime = getProtoToolchainProvider().runtime();
+      if (runtime != null) {
+        helper.addDep(runtime.getProvider(JavaCompilationArgsProvider.class));
+      }
+      helper.setCompilationStrictDepsMode(StrictDepsMode.OFF);
       JavaCompilationArgs artifacts = helper.build(javaSemantics);
       return helper.buildCompilationArgsProvider(artifacts, true /* isReportedAsStrict */);
     }
 
+    private ProtoLangToolchainProvider getProtoToolchainProvider() {
+      return checkNotNull(
+          ruleContext.getPrerequisite(
+              PROTO_TOOLCHAIN_ATTR, TARGET, ProtoLangToolchainProvider.class));
+    }
+
     private Artifact getSourceJarArtifact() {
       return ruleContext.getGenfilesArtifact(ruleContext.getLabel().getName() + "-lite-src.jar");
     }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java
index 21d3e6f..5e32d8c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java
@@ -14,9 +14,10 @@
 
 package com.google.devtools.build.lib.rules.java.proto;
 
+import static com.google.common.base.Preconditions.checkNotNull;
 import static com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode.TARGET;
 import static com.google.devtools.build.lib.collect.nestedset.Order.STABLE_ORDER;
-import static com.google.devtools.build.lib.rules.java.proto.JavaLiteProtoAspect.LITE_PROTO_RUNTIME_ATTR;
+import static com.google.devtools.build.lib.rules.java.proto.JavaLiteProtoAspect.PROTO_TOOLCHAIN_ATTR;
 
 import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.Iterables;
@@ -28,7 +29,9 @@
 import com.google.devtools.build.lib.analysis.RuleContext;
 import com.google.devtools.build.lib.analysis.Runfiles;
 import com.google.devtools.build.lib.analysis.RunfilesProvider;
+import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
 import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
 import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
 import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
 import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
@@ -38,6 +41,7 @@
 import com.google.devtools.build.lib.rules.java.JavaSourceJarsProvider;
 import com.google.devtools.build.lib.rules.java.ProguardLibrary;
 import com.google.devtools.build.lib.rules.java.ProguardSpecProvider;
+import com.google.devtools.build.lib.rules.proto.ProtoLangToolchainProvider;
 
 /** Implementation of the java_lite_proto_library rule. */
 public class JavaLiteProtoLibrary implements RuleConfiguredTargetFactory {
@@ -82,12 +86,7 @@
         .add(JavaCompilationArgsProvider.class, dependencyArgsProviders)
         .add(JavaSourceJarsProvider.class, sourceJarsProvider)
         .add(JavaRunfilesProvider.class, new JavaRunfilesProvider(runfiles))
-        .add(
-            ProguardSpecProvider.class,
-            new ProguardSpecProvider(
-                new ProguardLibrary(ruleContext)
-                    .collectProguardSpecs(
-                        ImmutableMultimap.of(Mode.TARGET, LITE_PROTO_RUNTIME_ATTR))))
+        .add(ProguardSpecProvider.class, getJavaLiteRuntimeSpec(ruleContext))
         .add(JavaRuleOutputJarsProvider.class, JavaRuleOutputJarsProvider.builder().build())
         .addSkylarkTransitiveInfo(JavaSkylarkApiProvider.NAME, new JavaSkylarkApiProvider())
         .build();
@@ -97,4 +96,30 @@
       RuleContext ruleContext, Class<C> clazz) {
     return ruleContext.getPrerequisites("deps", TARGET, clazz);
   }
+
+  private ProguardSpecProvider getJavaLiteRuntimeSpec(RuleContext ruleContext) {
+    NestedSet<Artifact> specs =
+        new ProguardLibrary(ruleContext).collectProguardSpecs(ImmutableMultimap.<Mode, String>of());
+
+    TransitiveInfoCollection runtime = getProtoToolchainProvider(ruleContext).runtime();
+    if (runtime == null) {
+      return new ProguardSpecProvider(specs);
+    }
+
+    ProguardSpecProvider specProvider = runtime.getProvider(ProguardSpecProvider.class);
+    if (specProvider == null) {
+      return new ProguardSpecProvider(specs);
+    }
+
+    return new ProguardSpecProvider(
+        NestedSetBuilder.fromNestedSet(specs)
+            .addTransitive(specProvider.getTransitiveProguardSpecs())
+            .build());
+  }
+
+  private ProtoLangToolchainProvider getProtoToolchainProvider(RuleContext ruleContext) {
+    return checkNotNull(
+        ruleContext.getPrerequisite(
+            PROTO_TOOLCHAIN_ATTR, TARGET, ProtoLangToolchainProvider.class));
+  }
 }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilder.java b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilder.java
index 293c828..29b2c4f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoCompileActionBuilder.java
@@ -415,19 +415,6 @@
       ImmutableList<String> protocOpts) {
     CustomCommandLine.Builder cmdLine = CustomCommandLine.builder();
 
-    cmdLine.add(protocOpts);
-
-    // Add include maps
-    cmdLine.add(new ProtoCommandLineArgv(supportData.getTransitiveImports()));
-
-    for (Artifact src : supportData.getDirectProtoSources()) {
-      cmdLine.addPath(src.getRootRelativePath());
-    }
-
-    if (!allowServices) {
-      cmdLine.add("--disallow_services");
-    }
-
     for (Map.Entry<String, ToolchainInvocation> entry : toolchainInvocations.entrySet()) {
       String pluginSuffix = entry.getKey();
       ToolchainInvocation invocation = entry.getValue();
@@ -450,6 +437,20 @@
                 toolchain.pluginExecutable().getExecutable().getExecPathString()));
       }
     }
+
+    cmdLine.add(protocOpts);
+
+    // Add include maps
+    cmdLine.add(new ProtoCommandLineArgv(supportData.getTransitiveImports()));
+
+    for (Artifact src : supportData.getDirectProtoSources()) {
+      cmdLine.addPath(src.getRootRelativePath());
+    }
+
+    if (!allowServices) {
+      cmdLine.add("--disallow_services");
+    }
+
     return cmdLine.build();
   }
 
diff --git a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoConfiguration.java
index 75ed40d..48be258 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoConfiguration.java
@@ -104,6 +104,15 @@
     )
     public Label protoCompilerJavaLitePlugin;
 
+    @Option(
+      name = "proto_toolchain_for_javalite",
+      defaultValue = "//tools/proto/toolchains:javalite",
+      category = "flags",
+      converter = BuildConfiguration.EmptyToNullLabelConverter.class,
+      help = "Label of proto_lang_toolchain() which describes how to compile JavaLite protos"
+    )
+    public Label protoToolchainForJavaLite;
+
     @Override
     public FragmentOptions getHost(boolean fallback) {
       Options host = (Options) super.getHost(fallback);
@@ -115,6 +124,7 @@
       host.protoCompilerJavaBlacklistedProtos = protoCompilerJavaBlacklistedProtos;
       host.protoCompilerJavaLiteFlags = protoCompilerJavaLiteFlags;
       host.protoCompilerJavaLitePlugin = protoCompilerJavaLitePlugin;
+      host.protoToolchainForJavaLite = protoToolchainForJavaLite;
       return host;
     }
   }
@@ -147,6 +157,7 @@
   private final List<Label> protoCompilerJavaBlacklistedProtos;
   private final String protoCompilerJavaLiteFlags;
   private final Label protoCompilerJavaLitePlugin;
+  private final Label protoToolchainForJavaLite;
 
   public ProtoConfiguration(Options options) {
     this.experimentalProtoExtraActions = options.experimentalProtoExtraActions;
@@ -156,6 +167,7 @@
     this.protoCompilerJavaLiteFlags = options.protoCompilerJavaLiteFlags;
     this.protoCompilerJavaLitePlugin = options.protoCompilerJavaLitePlugin;
     this.protoCompilerJavaBlacklistedProtos = options.protoCompilerJavaBlacklistedProtos;
+    this.protoToolchainForJavaLite = options.protoToolchainForJavaLite;
   }
 
   public ImmutableList<String> protocOpts() {
@@ -190,4 +202,8 @@
   public List<Label> protoCompilerJavaBlacklistedProtos() {
     return protoCompilerJavaBlacklistedProtos;
   }
+
+  public Label protoToolchainForJavaLite() {
+    return protoToolchainForJavaLite;
+  }
 }
diff --git a/tools/BUILD b/tools/BUILD
index c1a69c5..19d04c5 100644
--- a/tools/BUILD
+++ b/tools/BUILD
@@ -16,6 +16,7 @@
         "//tools/build_defs/pkg:srcs",
         "//tools/build_defs/repo:srcs",
         "//tools/build_rules:srcs",
+        "//tools/proto/toolchains:srcs",
         "//tools/jdk:srcs",
         "//tools/genrule:srcs",
         "//tools/cpp:srcs",
@@ -40,6 +41,7 @@
         "//tools/build_defs/repo:srcs",
         "//tools/build_rules:embedded_tools_srcs",
         "//tools/buildstamp:srcs",
+        "//tools/proto/toolchains:srcs",
         "//tools/cpp:srcs",
         "//tools/genrule:srcs",
         "//tools/j2objc:srcs",
diff --git a/tools/proto/toolchains/BUILD b/tools/proto/toolchains/BUILD
new file mode 100644
index 0000000..f5f4a5e
--- /dev/null
+++ b/tools/proto/toolchains/BUILD
@@ -0,0 +1,14 @@
+package(default_visibility = ["//visibility:public"])
+
+alias(
+    name = "javalite",
+    actual = "//external:proto/toolchains/javalite",
+)
+
+filegroup(
+    name = "srcs",
+    srcs = [
+        "BUILD",
+    ],
+    visibility = ["//tools:__pkg__"],
+)