Add --incompatible_use_toolchain_providers_in_java_common

Which requires passing JavaToolchainInfo and JavaRuntimeInfo providers to
java_common APIs instead of configured targets.

See: https://github.com/bazelbuild/bazel/issues/7186

RELNOTES: incompatible_use_toolchain_providers_in_java_common: pass JavaToolchainInfo and JavaRuntimeInfo providers to java_common APIs instead of configured targets (https://github.com/bazelbuild/bazel/issues/7186)
PiperOrigin-RevId: 231169120
diff --git a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
index a913169..839502d 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/SkylarkSemanticsOptions.java
@@ -504,6 +504,20 @@
   )
   public boolean internalSkylarkFlagTestCanary;
 
+  @Option(
+      name = "incompatible_use_toolchain_providers_in_java_common",
+      defaultValue = "false",
+      documentationCategory = OptionDocumentationCategory.SKYLARK_SEMANTICS,
+      effectTags = {OptionEffectTag.BUILD_FILE_SEMANTICS},
+      metadataTags = {
+        OptionMetadataTag.INCOMPATIBLE_CHANGE,
+        OptionMetadataTag.TRIGGERED_BY_ALL_INCOMPATIBLE_CHANGES
+      },
+      help =
+          "If set to true, java_common APIs that take a java_toolchain or host_javabase parameter "
+              + " require a JavaTootoolchainInfo or JavaRuntimeInfo instead of a configured"
+              + " target.")
+  public boolean incompatibleUseToolchainProvidersInJavaCommon;
 
   /** Constructs a {@link SkylarkSemantics} object corresponding to this set of option values. */
   public SkylarkSemantics toSkylarkSemantics() {
@@ -544,6 +558,8 @@
         .incompatibleRequireFeatureConfigurationForPic(requireFeatureConfigurationForPic)
         .incompatibleStricArgumentOrdering(incompatibleStricArgumentOrdering)
         .incompatibleStringIsNotIterable(incompatibleStringIsNotIterable)
+        .incompatibleUseToolchainProvidersInJavaCommon(
+            incompatibleUseToolchainProvidersInJavaCommon)
         .internalSkylarkFlagTestCanary(internalSkylarkFlagTestCanary)
         .build();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java
index 09a430f..9b33544 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfo.java
@@ -467,6 +467,7 @@
                 javaToolchain,
                 hostJavabase,
                 jdeps,
+                env.getSemantics(),
                 loc);
       }
       if (compileJar == null) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java
index 8f02c0f..bfc0513 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaInfoBuildHelper.java
@@ -44,6 +44,7 @@
 import com.google.devtools.build.lib.syntax.Environment;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.SkylarkList;
+import com.google.devtools.build.lib.syntax.SkylarkSemantics;
 import com.google.devtools.build.lib.vfs.FileSystemUtils;
 import java.util.stream.Stream;
 import javax.annotation.Nullable;
@@ -75,6 +76,7 @@
    * @param actions used to create the ijar and single jar actions
    * @param javaToolchain the toolchain to be used for retrieving the ijar tool
    * @param jdeps optional jdeps information for outputJar
+   * @param semantics the skylark semantics
    * @return new created JavaInfo instance
    * @throws EvalException if some mandatory parameter are missing
    */
@@ -92,6 +94,7 @@
       Object javaToolchain,
       Object hostJavabase,
       @Nullable Artifact jdeps,
+      SkylarkSemantics semantics,
       Location location)
       throws EvalException {
     final Artifact sourceJar;
@@ -103,10 +106,10 @@
       if (!(actions instanceof SkylarkActionFactory)) {
         throw new EvalException(location, "Must pass ctx.actions when packing sources.");
       }
-      if (!isValidJavaToolchain(javaToolchain)) {
+      if (!isValidJavaToolchain(semantics, javaToolchain)) {
         throw new EvalException(location, "Must pass java_toolchain when packing sources.");
       }
-      if (!isValidJavaRuntime(hostJavabase)) {
+      if (!isValidJavaRuntime(semantics, hostJavabase)) {
         throw new EvalException(location, "Must pass host_javabase when packing sources.");
       }
       sourceJar =
@@ -117,6 +120,7 @@
               sourceJars,
               javaToolchain,
               hostJavabase,
+              semantics,
               location);
     }
     final Artifact iJar;
@@ -126,7 +130,7 @@
             location,
             "The value of use_ijar is True. Make sure the ctx.actions argument is valid.");
       }
-      if (!isValidJavaToolchain(javaToolchain)) {
+      if (!isValidJavaToolchain(semantics, javaToolchain)) {
         throw new EvalException(
             location,
             "The value of use_ijar is True. Make sure the java_toolchain argument is valid.");
@@ -136,7 +140,8 @@
               (SkylarkActionFactory) actions,
               outputJar,
               null,
-              getJavaToolchainProvider(location, javaToolchain),
+              getJavaToolchainProvider(semantics, location, javaToolchain),
+              semantics,
               location);
     } else {
       iJar = outputJar;
@@ -245,6 +250,7 @@
       SkylarkList<Artifact> sourceJars,
       Object javaToolchain,
       Object hostJavabase,
+      SkylarkSemantics semantics,
       Location location)
       throws EvalException {
     // No sources to pack, return None
@@ -257,8 +263,10 @@
     }
     ActionRegistry actionRegistry = actions.asActionRegistry(location, actions);
     Artifact outputSrcJar = getSourceJar(actions.getActionConstructionContext(), outputJar);
-    JavaRuntimeInfo javaRuntimeInfo = getJavaRuntimeProvider(location, hostJavabase, null);
-    JavaToolchainProvider javaToolchainProvider = getJavaToolchainProvider(location, javaToolchain);
+    JavaRuntimeInfo javaRuntimeInfo =
+        getJavaRuntimeProvider(semantics, location, hostJavabase, null);
+    JavaToolchainProvider javaToolchainProvider =
+        getJavaToolchainProvider(semantics, location, javaToolchain);
     JavaSemantics javaSemantics = javaToolchainProvider.getJavaSemantics();
     SingleJarActionBuilder.createSourceJarAction(
         actionRegistry,
@@ -318,6 +326,7 @@
       NestedSet<Artifact> transitiveCompileTimeJars,
       NestedSet<Artifact> transitiveRuntimeJars,
       NestedSet<Artifact> sourceJars,
+      SkylarkSemantics semantics,
       Location location)
       throws EvalException {
 
@@ -329,7 +338,7 @@
             location,
             "The value of use_ijar is True. Make sure the ctx.actions argument is valid.");
       }
-      if (!isValidJavaToolchain(javaToolchain)) {
+      if (!isValidJavaToolchain(semantics, javaToolchain)) {
         throw new EvalException(
             location,
             "The value of use_ijar is True. Make sure the java_toolchain argument is valid.");
@@ -341,7 +350,8 @@
                 (SkylarkActionFactory) actions,
                 compileJar,
                 null,
-                getJavaToolchainProvider(location, javaToolchain),
+                getJavaToolchainProvider(semantics, location, javaToolchain),
+                semantics,
                 location));
       }
       javaCompilationArgsBuilder.addDirectCompileTimeJars(
@@ -397,12 +407,17 @@
     }
 
     JavaRuntimeInfo javaRuntimeInfo =
-        getJavaRuntimeProvider(location, hostJavabase, skylarkRuleContext.getRuleContext());
+        getJavaRuntimeProvider(
+            skylarkRuleContext.getSkylarkSemantics(),
+            location,
+            hostJavabase,
+            skylarkRuleContext.getRuleContext());
     if (javaRuntimeInfo == null) {
       throw new EvalException(location, "'host_javabase' must point to a Java runtime");
     }
 
-    JavaToolchainProvider toolchainProvider = getJavaToolchainProvider(location, javaToolchain);
+    JavaToolchainProvider toolchainProvider =
+        getJavaToolchainProvider(environment.getSemantics(), location, javaToolchain);
 
     JavaLibraryHelper helper =
         new JavaLibraryHelper(skylarkRuleContext.getRuleContext())
@@ -500,11 +515,13 @@
       Artifact inputJar,
       @Nullable Label targetLabel,
       Object javaToolchain,
+      SkylarkSemantics semantics,
       Location location)
       throws EvalException {
     String ijarBasename = FileSystemUtils.removeExtension(inputJar.getFilename()) + "-ijar.jar";
     Artifact interfaceJar = actions.declareFile(ijarBasename, inputJar);
-    FilesToRunProvider ijarTarget = getJavaToolchainProvider(location, javaToolchain).getIjar();
+    FilesToRunProvider ijarTarget =
+        getJavaToolchainProvider(semantics, location, javaToolchain).getIjar();
     CustomCommandLine.Builder commandLine =
         CustomCommandLine.builder().addExecPath(inputJar).addExecPath(interfaceJar);
     if (targetLabel != null) {
@@ -528,12 +545,14 @@
       Artifact inputJar,
       Label targetLabel,
       Object javaToolchain,
+      SkylarkSemantics semantics,
       Location location)
       throws EvalException {
     String basename = FileSystemUtils.removeExtension(inputJar.getFilename()) + "-stamped.jar";
     Artifact outputJar = actions.declareFile(basename, inputJar);
     // ijar doubles as a stamping tool
-    FilesToRunProvider ijarTarget = getJavaToolchainProvider(location, javaToolchain).getIjar();
+    FilesToRunProvider ijarTarget =
+        getJavaToolchainProvider(semantics, location, javaToolchain).getIjar();
     CustomCommandLine.Builder commandLine =
         CustomCommandLine.builder()
             .addExecPath(inputJar)
@@ -553,15 +572,24 @@
     return outputJar;
   }
 
-  private static boolean isValidJavaToolchain(Object javaToolchain) {
-    return javaToolchain instanceof ConfiguredTarget
+  private static boolean isValidJavaToolchain(
+      SkylarkSemantics skylarkSemantics, Object javaToolchain) {
+    return (!skylarkSemantics.incompatibleUseToolchainProvidersInJavaCommon()
+            && javaToolchain instanceof ConfiguredTarget)
         || javaToolchain instanceof JavaToolchainProvider;
   }
 
-  JavaToolchainProvider getJavaToolchainProvider(Location location, Object javaToolchain)
-      throws EvalException {
+  JavaToolchainProvider getJavaToolchainProvider(
+      SkylarkSemantics semantics, Location location, Object javaToolchain) throws EvalException {
     if (javaToolchain instanceof ConfiguredTarget) {
-      // TODO(b/122738702): remove support for passing toolchains as configured targets
+      if (semantics.incompatibleUseToolchainProvidersInJavaCommon()) {
+        // TODO(b/122738702): remove support for passing toolchains as configured targets
+        throw new EvalException(
+            location,
+            javaToolchain
+                + " pass a java_common.JavaToolchainInfo instead of a configured target;"
+                + " see https://github.com/bazelbuild/bazel/issues/7186.");
+      }
       ConfiguredTarget target = (ConfiguredTarget) javaToolchain;
       JavaToolchainProvider javaToolchainProvider = JavaToolchainProvider.from(target);
       if (javaToolchainProvider == null) {
@@ -576,14 +604,27 @@
     throw new EvalException(null, javaToolchain + " is not a JavaToolchainProvider.");
   }
 
-  private static boolean isValidJavaRuntime(Object javaRuntime) {
-    return javaRuntime instanceof ConfiguredTarget || javaRuntime instanceof JavaRuntimeInfo;
+  private static boolean isValidJavaRuntime(SkylarkSemantics skylarkSemantics, Object javaRuntime) {
+    return (!skylarkSemantics.incompatibleUseToolchainProvidersInJavaCommon()
+            && javaRuntime instanceof ConfiguredTarget)
+        || javaRuntime instanceof JavaRuntimeInfo;
   }
 
   private JavaRuntimeInfo getJavaRuntimeProvider(
-      Location location, Object javabase, RuleContext ruleContext) throws EvalException {
+      SkylarkSemantics skylarkSemantics,
+      Location location,
+      Object javabase,
+      RuleContext ruleContext)
+      throws EvalException {
     if (javabase instanceof TransitiveInfoCollection) {
-      // TODO(b/122738702): remove support for passing toolchains as configured targets
+      if (skylarkSemantics.incompatibleUseToolchainProvidersInJavaCommon()) {
+        // TODO(b/122738702): remove support for passing toolchains as configured targets
+        throw new EvalException(
+            location,
+            javabase
+                + " pass a java_common.JavaRuntimeInfo instead of a configured target;"
+                + " see https://github.com/bazelbuild/bazel/issues/7186.");
+      }
       return JavaRuntimeInfo.from((TransitiveInfoCollection) javabase, ruleContext);
     }
     if (javabase instanceof JavaRuntimeInfo) {
diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java
index 9f3499e..18a244e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaSkylarkCommon.java
@@ -70,6 +70,7 @@
             asArtifactNestedSet(transitiveCompileTimeJars),
             asArtifactNestedSet(transitiveRuntimeJars),
             asArtifactNestedSet(sourceJars),
+            environment.getSemantics(),
             location);
   }
 
@@ -131,7 +132,8 @@
       Artifact jar,
       Object targetLabel,
       Object javaToolchain,
-      Location location)
+      Location location,
+      SkylarkSemantics semantics)
       throws EvalException {
     return JavaInfoBuildHelper.getInstance()
         .buildIjar(
@@ -139,6 +141,7 @@
             jar,
             targetLabel != Runtime.NONE ? (Label) targetLabel : null,
             javaToolchain,
+            semantics,
             location);
   }
 
@@ -148,10 +151,11 @@
       Artifact jar,
       Label targetLabel,
       Object javaToolchain,
-      Location location)
+      Location location,
+      SkylarkSemantics semantics)
       throws EvalException {
     return JavaInfoBuildHelper.getInstance()
-        .stampJar(actions, jar, targetLabel, javaToolchain, location);
+        .stampJar(actions, jar, targetLabel, javaToolchain, semantics, location);
   }
 
   @Override
@@ -162,25 +166,36 @@
       SkylarkList<Artifact> sourceJars,
       Object javaToolchain,
       Object hostJavabase,
-      Location location)
+      Location location,
+      SkylarkSemantics semantics)
       throws EvalException {
     return JavaInfoBuildHelper.getInstance()
         .packSourceFiles(
-            actions, outputJar, sourceFiles, sourceJars, javaToolchain, hostJavabase, location);
+            actions,
+            outputJar,
+            sourceFiles,
+            sourceJars,
+            javaToolchain,
+            hostJavabase,
+            semantics,
+            location);
   }
 
   @Override
   // TODO(b/78512644): migrate callers to passing explicit javacopts or using custom toolchains, and
   // delete
   public ImmutableList<String> getDefaultJavacOpts(
-      SkylarkRuleContext skylarkRuleContext, String javaToolchainAttr, Location location)
+      SkylarkRuleContext skylarkRuleContext,
+      String javaToolchainAttr,
+      Location location,
+      SkylarkSemantics skylarkSemantics)
       throws EvalException {
     RuleContext ruleContext = skylarkRuleContext.getRuleContext();
     ConfiguredTarget javaToolchainConfigTarget =
         (ConfiguredTarget) skylarkRuleContext.getAttr().getValue(javaToolchainAttr);
     JavaToolchainProvider toolchain =
         JavaInfoBuildHelper.getInstance()
-            .getJavaToolchainProvider(location, javaToolchainConfigTarget);
+            .getJavaToolchainProvider(skylarkSemantics, location, javaToolchainConfigTarget);
     ImmutableList<String> javacOptsFromAttr;
     if (ruleContext.getRule().isAttrDefined("javacopts", Type.STRING_LIST)) {
       javacOptsFromAttr = ruleContext.getExpander().withDataLocations().tokenized("javacopts");
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCommonApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCommonApi.java
index 62b65ec..3dd04d2 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCommonApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/java/JavaCommonApi.java
@@ -31,6 +31,7 @@
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.SkylarkList;
 import com.google.devtools.build.lib.syntax.SkylarkNestedSet;
+import com.google.devtools.build.lib.syntax.SkylarkSemantics;
 import javax.annotation.Nullable;
 
 /** Utilities for Java compilation support in Skylark. */
@@ -374,13 +375,15 @@
             },
             doc = "A JavaToolchainInfo to used to find the ijar tool."),
       },
+      useSkylarkSemantics = true,
       useLocation = true)
   public FileApi runIjar(
       SkylarkActionFactoryT actions,
       FileT jar,
       Object targetLabel,
       Object javaToolchain,
-      Location location)
+      Location location,
+      SkylarkSemantics semantics)
       throws EvalException;
 
   @SkylarkCallable(
@@ -425,13 +428,15 @@
             },
             doc = "A JavaToolchainInfo to used to find the stamp_jar tool."),
       },
+      useSkylarkSemantics = true,
       useLocation = true)
   public FileApi stampJar(
       SkylarkActionFactoryT actions,
       FileT jar,
       Label targetLabel,
       Object javaToolchain,
-      Location location)
+      Location location,
+      SkylarkSemantics semantics)
       throws EvalException;
 
   @SkylarkCallable(
@@ -491,6 +496,7 @@
             doc = "A JavaRuntimeInfo to be used for packing sources."),
       },
       allowReturnNones = true,
+      useSkylarkSemantics = true,
       useLocation = true)
   public FileApi packSources(
       SkylarkActionFactoryT actions,
@@ -499,7 +505,8 @@
       SkylarkList<FileT> sourceJars,
       Object javaToolchain,
       Object hostJavabase,
-      Location location)
+      Location location,
+      SkylarkSemantics semantics)
       throws EvalException;
 
   @SkylarkCallable(
@@ -515,11 +522,15 @@
             doc = "The rule context."),
         @Param(name = "java_toolchain_attr", positional = false, named = true, type = String.class),
       },
+      useSkylarkSemantics = true,
       useLocation = true)
   // TODO(b/78512644): migrate callers to passing explicit javacopts or using custom toolchains, and
   // delete
   public ImmutableList<String> getDefaultJavacOpts(
-      SkylarkRuleContextT skylarkRuleContext, String javaToolchainAttr, Location loc)
+      SkylarkRuleContextT skylarkRuleContext,
+      String javaToolchainAttr,
+      Location loc,
+      SkylarkSemantics semantics)
       throws EvalException;
 
   @SkylarkCallable(
diff --git a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
index b9e5493..89fdba2 100644
--- a/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/syntax/SkylarkSemantics.java
@@ -184,6 +184,8 @@
 
   public abstract boolean internalSkylarkFlagTestCanary();
 
+  public abstract boolean incompatibleUseToolchainProvidersInJavaCommon();
+
   /** Returns a {@link Builder} initialized with the values of this instance. */
   public abstract Builder toBuilder();
 
@@ -207,6 +209,7 @@
           .experimentalPlatformsApi(false)
           .experimentalStarlarkConfigTransitions(false)
           .experimentalTransitionWhitelistLocation("")
+          .incompatibleUseToolchainProvidersInJavaCommon(false)
           .incompatibleBzlDisallowLoadAfterStatement(false)
           .incompatibleDepsetIsNotIterable(false)
           .incompatibleDepsetUnion(false)
@@ -306,6 +309,8 @@
 
     public abstract Builder incompatibleStringIsNotIterable(boolean value);
 
+    public abstract Builder incompatibleUseToolchainProvidersInJavaCommon(boolean value);
+
     public abstract Builder internalSkylarkFlagTestCanary(boolean value);
 
     public abstract SkylarkSemantics build();
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/BUILD b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/BUILD
index 56ade88..fa03872 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/BUILD
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/BUILD
@@ -14,6 +14,7 @@
     srcs = glob(["*.java"]),
     deps = [
         "//src/main/java/com/google/devtools/build/lib:events",
+        "//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/cmdline",
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCommon.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCommon.java
index a6d3c70..f9342007 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCommon.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/java/FakeJavaCommon.java
@@ -25,6 +25,7 @@
 import com.google.devtools.build.lib.syntax.Environment;
 import com.google.devtools.build.lib.syntax.EvalException;
 import com.google.devtools.build.lib.syntax.SkylarkList;
+import com.google.devtools.build.lib.syntax.SkylarkSemantics;
 import com.google.devtools.build.skydoc.fakebuildapi.FakeProviderApi;
 import javax.annotation.Nullable;
 
@@ -75,7 +76,8 @@
       FileApi jar,
       Object targetLabel,
       Object javaToolchain,
-      Location location)
+      Location location,
+      SkylarkSemantics semantics)
       throws EvalException {
     return null;
   }
@@ -86,7 +88,8 @@
       FileApi jar,
       Label targetLabel,
       Object javaToolchain,
-      Location location)
+      Location location,
+      SkylarkSemantics semantics)
       throws EvalException {
     return null;
   }
@@ -99,14 +102,18 @@
       SkylarkList<FileApi> sourceJars,
       Object javaToolchain,
       Object hostJavabase,
-      Location location)
+      Location location,
+      SkylarkSemantics semantics)
       throws EvalException {
     return null;
   }
 
   @Override
   public ImmutableList<String> getDefaultJavacOpts(
-      SkylarkRuleContextApi skylarkRuleContext, String javaToolchainAttr, Location loc)
+      SkylarkRuleContextApi skylarkRuleContext,
+      String javaToolchainAttr,
+      Location loc,
+      SkylarkSemantics semantics)
       throws EvalException {
     return ImmutableList.of();
   }
diff --git a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java b/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
index b31a3d5..f2bd547 100644
--- a/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/packages/SkylarkSemanticsConsistencyTest.java
@@ -157,6 +157,7 @@
         "--incompatible_require_feature_configuration_for_pic=" + rand.nextBoolean(),
         "--incompatible_strict_argument_ordering=" + rand.nextBoolean(),
         "--incompatible_string_is_not_iterable=" + rand.nextBoolean(),
+        "--incompatible_use_toolchain_providers_in_java_common=" + rand.nextBoolean(),
         "--internal_skylark_flag_test_canary=" + rand.nextBoolean());
   }
 
@@ -202,6 +203,7 @@
         .incompatibleRequireFeatureConfigurationForPic(rand.nextBoolean())
         .incompatibleStricArgumentOrdering(rand.nextBoolean())
         .incompatibleStringIsNotIterable(rand.nextBoolean())
+        .incompatibleUseToolchainProvidersInJavaCommon(rand.nextBoolean())
         .internalSkylarkFlagTestCanary(rand.nextBoolean())
         .build();
   }
diff --git a/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java b/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
index 8dd9cc5..cfdb40e 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/java/JavaSkylarkApiTest.java
@@ -2182,4 +2182,84 @@
         "The .java provider is deprecated and cannot be used "
             + "when --incompatible_disallow_legacy_java_provider is set.");
   }
+
+  @Test
+  public void testConfiguredTargetHostJavabase() throws Exception {
+    writeBuildFileForJavaToolchain();
+    setSkylarkSemanticsOptions("--incompatible_use_toolchain_providers_in_java_common=true");
+
+    scratch.file(
+        "a/BUILD",
+        "load(':rule.bzl', 'jrule')",
+        "java_runtime(name='jvm', srcs=[], java_home='/foo/bar')",
+        "jrule(name='r', srcs=['S.java'])");
+
+    scratch.file(
+        "a/rule.bzl",
+        "def _impl(ctx):",
+        "  output_jar = ctx.actions.declare_file('lib' + ctx.label.name + '.jar')",
+        "  java_common.compile(",
+        "    ctx,",
+        "    source_files = ctx.files.srcs,",
+        "    output = output_jar,",
+        "    java_toolchain = ctx.attr._java_toolchain[java_common.JavaToolchainInfo],",
+        "    host_javabase = ctx.attr._host_javabase",
+        "  )",
+        "  return struct()",
+        "jrule = rule(",
+        "  implementation = _impl,",
+        "  outputs = {",
+        "    'my_output': 'lib%{name}.jar'",
+        "  },",
+        "  attrs = {",
+        "    'srcs': attr.label_list(allow_files=['.java']),",
+        "    '_java_toolchain': attr.label(default = Label('//java/com/google/test:toolchain')),",
+        "    '_host_javabase': attr.label(default = Label('//a:jvm'))",
+        "  },",
+        "  fragments = ['java'])");
+
+    reporter.removeHandler(failFastHandler);
+    getConfiguredTarget("//a:r");
+    assertContainsEvent("java_common.JavaRuntimeInfo");
+  }
+
+  @Test
+  public void testConfiguredTargetToolchain() throws Exception {
+    writeBuildFileForJavaToolchain();
+    setSkylarkSemanticsOptions("--incompatible_use_toolchain_providers_in_java_common=true");
+
+    scratch.file(
+        "a/BUILD",
+        "load(':rule.bzl', 'jrule')",
+        "java_runtime(name='jvm', srcs=[], java_home='/foo/bar')",
+        "jrule(name='r', srcs=['S.java'])");
+
+    scratch.file(
+        "a/rule.bzl",
+        "def _impl(ctx):",
+        "  output_jar = ctx.actions.declare_file('lib' + ctx.label.name + '.jar')",
+        "  java_common.compile(",
+        "    ctx,",
+        "    source_files = ctx.files.srcs,",
+        "    output = output_jar,",
+        "    java_toolchain = ctx.attr._java_toolchain,",
+        "    host_javabase = ctx.attr._host_javabase[java_common.JavaRuntimeInfo]",
+        "  )",
+        "  return struct()",
+        "jrule = rule(",
+        "  implementation = _impl,",
+        "  outputs = {",
+        "    'my_output': 'lib%{name}.jar'",
+        "  },",
+        "  attrs = {",
+        "    'srcs': attr.label_list(allow_files=['.java']),",
+        "    '_java_toolchain': attr.label(default = Label('//java/com/google/test:toolchain')),",
+        "    '_host_javabase': attr.label(default = Label('//a:jvm'))",
+        "  },",
+        "  fragments = ['java'])");
+
+    reporter.removeHandler(failFastHandler);
+    getConfiguredTarget("//a:r");
+    assertContainsEvent("java_common.JavaToolchainInfo");
+  }
 }